[cvxopt] 48/64: Imported Upstream version 1.1.8+dfsg

Andreas Tille tille at debian.org
Wed Jul 20 11:23:55 UTC 2016


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository cvxopt.

commit 1ce2e4b5fde51b7496a7b07b8b22b3b0d3e411b8
Author: Andreas Tille <tille at debian.org>
Date:   Wed Jul 20 10:11:33 2016 +0200

    Imported Upstream version 1.1.8+dfsg
---
 src/C/SuiteSparse/AMD/Doc/AMD_UserGuide.bib        |   98 -
 src/C/SuiteSparse/AMD/Doc/AMD_UserGuide.tex        |  783 -----
 src/C/SuiteSparse/AMD/Doc/ChangeLog                |  161 -
 src/C/SuiteSparse/AMD/Doc/License.txt              |   91 -
 src/C/SuiteSparse/AMD/Doc/Makefile                 |   36 -
 src/C/SuiteSparse/AMD/Doc/lesser.txt               |  504 ---
 src/C/SuiteSparse/AMD/Include/amd.h                |  400 ---
 src/C/SuiteSparse/AMD/Include/amd_internal.h       |  326 --
 src/C/SuiteSparse/AMD/Lib/GNUmakefile              |   75 -
 src/C/SuiteSparse/AMD/Lib/Makefile                 |   69 -
 src/C/SuiteSparse/AMD/Lib/libamd.def               |   12 -
 src/C/SuiteSparse/AMD/Makefile                     |   73 -
 src/C/SuiteSparse/AMD/README.txt                   |  213 --
 src/C/SuiteSparse/AMD/Source/amd.f                 | 1214 -------
 src/C/SuiteSparse/AMD/Source/amd_1.c               |  180 -
 src/C/SuiteSparse/AMD/Source/amd_2.c               | 1842 ----------
 src/C/SuiteSparse/AMD/Source/amd_aat.c             |  184 -
 src/C/SuiteSparse/AMD/Source/amd_control.c         |   64 -
 src/C/SuiteSparse/AMD/Source/amd_defaults.c        |   37 -
 src/C/SuiteSparse/AMD/Source/amd_dump.c            |  179 -
 src/C/SuiteSparse/AMD/Source/amd_global.c          |   14 -
 src/C/SuiteSparse/AMD/Source/amd_info.c            |  119 -
 src/C/SuiteSparse/AMD/Source/amd_order.c           |  199 --
 src/C/SuiteSparse/AMD/Source/amd_post_tree.c       |  120 -
 src/C/SuiteSparse/AMD/Source/amd_postorder.c       |  206 --
 src/C/SuiteSparse/AMD/Source/amd_preprocess.c      |  118 -
 src/C/SuiteSparse/AMD/Source/amd_valid.c           |   92 -
 src/C/SuiteSparse/AMD/Source/amdbar.f              | 1206 -------
 src/C/SuiteSparse/CHOLMOD/Check/License.txt        |   24 -
 src/C/SuiteSparse/CHOLMOD/Check/cholmod_check.c    | 2710 ---------------
 src/C/SuiteSparse/CHOLMOD/Check/cholmod_read.c     | 1319 -------
 src/C/SuiteSparse/CHOLMOD/Check/cholmod_write.c    |  744 ----
 src/C/SuiteSparse/CHOLMOD/Check/lesser.txt         |  504 ---
 src/C/SuiteSparse/CHOLMOD/Cholesky/License.txt     |   24 -
 src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_amd.c   |  200 --
 .../SuiteSparse/CHOLMOD/Cholesky/cholmod_analyze.c |  942 -----
 .../SuiteSparse/CHOLMOD/Cholesky/cholmod_colamd.c  |  206 --
 src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_etree.c |  226 --
 .../CHOLMOD/Cholesky/cholmod_factorize.c           |  428 ---
 .../CHOLMOD/Cholesky/cholmod_postorder.c           |  291 --
 src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rcond.c |  160 -
 .../CHOLMOD/Cholesky/cholmod_resymbol.c            |  608 ----
 .../CHOLMOD/Cholesky/cholmod_rowcolcounts.c        |  536 ---
 .../SuiteSparse/CHOLMOD/Cholesky/cholmod_rowfac.c  |  765 ----
 src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_solve.c | 1681 ---------
 .../SuiteSparse/CHOLMOD/Cholesky/cholmod_spsolve.c |  396 ---
 src/C/SuiteSparse/CHOLMOD/Cholesky/lesser.txt      |  504 ---
 .../CHOLMOD/Cholesky/t_cholmod_lsolve.c            |  850 -----
 .../CHOLMOD/Cholesky/t_cholmod_ltsolve.c           |  849 -----
 .../CHOLMOD/Cholesky/t_cholmod_rowfac.c            |  459 ---
 .../SuiteSparse/CHOLMOD/Cholesky/t_cholmod_solve.c |  177 -
 src/C/SuiteSparse/CHOLMOD/Core/License.txt         |   25 -
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_aat.c       |  301 --
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_add.c       |  281 --
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_band.c      |  373 --
 .../CHOLMOD/Core/cholmod_change_factor.c           | 1226 -------
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_common.c    |  747 ----
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_complex.c   |  490 ---
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_copy.c      |  406 ---
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_dense.c     |  686 ----
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_error.c     |   81 -
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_factor.c    |  937 -----
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_memory.c    |  556 ---
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_sparse.c    |  651 ----
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_transpose.c | 1138 ------
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_triplet.c   |  772 -----
 src/C/SuiteSparse/CHOLMOD/Core/cholmod_version.c   |   37 -
 src/C/SuiteSparse/CHOLMOD/Core/lesser.txt          |  504 ---
 .../CHOLMOD/Core/t_cholmod_change_factor.c         |  660 ----
 src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_dense.c   |  265 --
 .../SuiteSparse/CHOLMOD/Core/t_cholmod_transpose.c |  317 --
 src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_triplet.c |  175 -
 src/C/SuiteSparse/CHOLMOD/Doc/ChangeLog            |  327 --
 src/C/SuiteSparse/CHOLMOD/Doc/Makefile             |  233 --
 src/C/SuiteSparse/CHOLMOD/Doc/UserGuide.bib        |  196 --
 src/C/SuiteSparse/CHOLMOD/Doc/UserGuide.tex        | 3655 --------------------
 src/C/SuiteSparse/CHOLMOD/Doc/footer.tex           |    6 -
 src/C/SuiteSparse/CHOLMOD/Doc/getmproto            |    4 -
 src/C/SuiteSparse/CHOLMOD/Doc/getproto             |    6 -
 src/C/SuiteSparse/CHOLMOD/Doc/header.tex           |    4 -
 src/C/SuiteSparse/CHOLMOD/Doc/mfile.awk            |    1 -
 src/C/SuiteSparse/CHOLMOD/Doc/mfooter.tex          |    4 -
 src/C/SuiteSparse/CHOLMOD/Doc/mheader.tex          |    5 -
 src/C/SuiteSparse/CHOLMOD/Doc/rule.awk             |    1 -
 src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu.c        |  479 ---
 .../SuiteSparse/CHOLMOD/GPU/cholmod_gpu_kernels.c  |    6 -
 .../SuiteSparse/CHOLMOD/GPU/cholmod_gpu_kernels.cu |  196 --
 src/C/SuiteSparse/CHOLMOD/GPU/t_cholmod_gpu.c      | 1397 --------
 src/C/SuiteSparse/CHOLMOD/Include/License.txt      |    8 -
 src/C/SuiteSparse/CHOLMOD/Include/README.txt       |   25 -
 src/C/SuiteSparse/CHOLMOD/Include/cholmod.h        |  130 -
 src/C/SuiteSparse/CHOLMOD/Include/cholmod_blas.h   |  455 ---
 src/C/SuiteSparse/CHOLMOD/Include/cholmod_camd.h   |  102 -
 src/C/SuiteSparse/CHOLMOD/Include/cholmod_check.h  |  427 ---
 .../SuiteSparse/CHOLMOD/Include/cholmod_cholesky.h |  589 ----
 .../CHOLMOD/Include/cholmod_complexity.h           |  265 --
 src/C/SuiteSparse/CHOLMOD/Include/cholmod_config.h |   85 -
 src/C/SuiteSparse/CHOLMOD/Include/cholmod_core.h   | 2450 -------------
 .../SuiteSparse/CHOLMOD/Include/cholmod_function.h |  155 -
 src/C/SuiteSparse/CHOLMOD/Include/cholmod_gpu.h    |   80 -
 .../CHOLMOD/Include/cholmod_gpu_kernels.h          |   50 -
 .../SuiteSparse/CHOLMOD/Include/cholmod_internal.h |  379 --
 src/C/SuiteSparse/CHOLMOD/Include/cholmod_io64.h   |   45 -
 .../CHOLMOD/Include/cholmod_matrixops.h            |  237 --
 src/C/SuiteSparse/CHOLMOD/Include/cholmod_modify.h |  327 --
 .../CHOLMOD/Include/cholmod_partition.h            |  166 -
 .../CHOLMOD/Include/cholmod_supernodal.h           |  172 -
 .../SuiteSparse/CHOLMOD/Include/cholmod_template.h |  245 --
 src/C/SuiteSparse/CHOLMOD/Lib/Makefile             |  544 ---
 src/C/SuiteSparse/CHOLMOD/Makefile                 |   75 -
 src/C/SuiteSparse/CHOLMOD/MatrixOps/License.txt    |   25 -
 src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_drop.c |  185 -
 .../CHOLMOD/MatrixOps/cholmod_horzcat.c            |  205 --
 src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_norm.c |  454 ---
 .../SuiteSparse/CHOLMOD/MatrixOps/cholmod_scale.c  |  219 --
 .../SuiteSparse/CHOLMOD/MatrixOps/cholmod_sdmult.c |  151 -
 .../SuiteSparse/CHOLMOD/MatrixOps/cholmod_ssmult.c |  489 ---
 .../CHOLMOD/MatrixOps/cholmod_submatrix.c          |  427 ---
 .../CHOLMOD/MatrixOps/cholmod_symmetry.c           |  490 ---
 .../CHOLMOD/MatrixOps/cholmod_vertcat.c            |  203 --
 src/C/SuiteSparse/CHOLMOD/MatrixOps/gpl.txt        |  340 --
 .../CHOLMOD/MatrixOps/t_cholmod_sdmult.c           |  726 ----
 src/C/SuiteSparse/CHOLMOD/README.txt               |   81 -
 src/C/SuiteSparse/CHOLMOD/Supernodal/License.txt   |   25 -
 .../CHOLMOD/Supernodal/cholmod_super_numeric.c     |  313 --
 .../CHOLMOD/Supernodal/cholmod_super_solve.c       |  218 --
 .../CHOLMOD/Supernodal/cholmod_super_symbolic.c    |  994 ------
 src/C/SuiteSparse/CHOLMOD/Supernodal/gpl.txt       |  340 --
 .../CHOLMOD/Supernodal/t_cholmod_super_numeric.c   | 1087 ------
 .../CHOLMOD/Supernodal/t_cholmod_super_solve.c     |  419 ---
 src/C/SuiteSparse/COLAMD/Demo/Makefile             |   47 -
 src/C/SuiteSparse/COLAMD/Demo/colamd_example.c     |  180 -
 src/C/SuiteSparse/COLAMD/Demo/colamd_example.out   |   50 -
 src/C/SuiteSparse/COLAMD/Demo/colamd_l_example.c   |  182 -
 src/C/SuiteSparse/COLAMD/Demo/colamd_l_example.out |   50 -
 src/C/SuiteSparse/COLAMD/Doc/ChangeLog             |  153 -
 src/C/SuiteSparse/COLAMD/Doc/lesser.txt            |  504 ---
 src/C/SuiteSparse/COLAMD/Include/colamd.h          |  245 --
 src/C/SuiteSparse/COLAMD/Lib/Makefile              |   32 -
 src/C/SuiteSparse/COLAMD/Makefile                  |   56 -
 src/C/SuiteSparse/COLAMD/README.txt                |  118 -
 src/C/SuiteSparse/COLAMD/Source/colamd.c           | 3613 -------------------
 src/C/SuiteSparse/COLAMD/Source/colamd_global.c    |   12 -
 src/C/SuiteSparse/ChangeLog                        |  505 ---
 src/C/SuiteSparse/Contents.m                       |  149 -
 src/C/SuiteSparse/Makefile                         |  184 -
 src/C/SuiteSparse/README.txt                       |  159 -
 src/C/SuiteSparse/README_cvxopt                    |   34 -
 src/C/SuiteSparse/SuiteSparse_config/Makefile      |   48 -
 src/C/SuiteSparse/SuiteSparse_config/README.txt    |   71 -
 .../SuiteSparse_config/SuiteSparse_config.c        |  531 ---
 .../SuiteSparse_config/SuiteSparse_config.h        |  247 --
 .../SuiteSparse_config/SuiteSparse_config.mk       |  452 ---
 .../SuiteSparse_config_GPU_debug.mk                |  452 ---
 .../SuiteSparse_config_GPU_gcc.mk                  |  452 ---
 .../SuiteSparse_config_GPU_icc.mk                  |  452 ---
 .../SuiteSparse_config_GPU_icc10.mk                |  453 ---
 .../SuiteSparse_config/SuiteSparse_config_Mac.mk   |  452 ---
 .../SuiteSparse_config_backslash.mk                |  452 ---
 .../SuiteSparse_config/SuiteSparse_config_linux.mk |  452 ---
 .../SuiteSparse/SuiteSparse_config/xerbla/Makefile |   33 -
 .../SuiteSparse/SuiteSparse_config/xerbla/xerbla.c |   12 -
 .../SuiteSparse/SuiteSparse_config/xerbla/xerbla.f |   46 -
 .../SuiteSparse/SuiteSparse_config/xerbla/xerbla.h |    2 -
 src/C/SuiteSparse/UMFPACK/Doc/ChangeLog            |  538 ---
 src/C/SuiteSparse/UMFPACK/Doc/License              |   38 -
 src/C/SuiteSparse/UMFPACK/Doc/Makefile             |   59 -
 src/C/SuiteSparse/UMFPACK/Doc/QuickStart.tex       | 1020 ------
 src/C/SuiteSparse/UMFPACK/Doc/UserGuide.bib        |  283 --
 src/C/SuiteSparse/UMFPACK/Doc/UserGuide.sed1       |   33 -
 src/C/SuiteSparse/UMFPACK/Doc/UserGuide.sed2       |    3 -
 src/C/SuiteSparse/UMFPACK/Doc/UserGuide.stex       | 2781 ---------------
 src/C/SuiteSparse/UMFPACK/Doc/gpl.txt              |  340 --
 src/C/SuiteSparse/UMFPACK/Include/umfpack.h        |  434 ---
 .../UMFPACK/Include/umfpack_col_to_triplet.h       |  109 -
 .../SuiteSparse/UMFPACK/Include/umfpack_defaults.h |   68 -
 .../UMFPACK/Include/umfpack_free_numeric.h         |   66 -
 .../UMFPACK/Include/umfpack_free_symbolic.h        |   66 -
 .../UMFPACK/Include/umfpack_get_determinant.h      |  194 --
 .../SuiteSparse/UMFPACK/Include/umfpack_get_lunz.h |  136 -
 .../UMFPACK/Include/umfpack_get_numeric.h          |  253 --
 .../UMFPACK/Include/umfpack_get_symbolic.h         |  336 --
 src/C/SuiteSparse/UMFPACK/Include/umfpack_global.h |   10 -
 .../UMFPACK/Include/umfpack_load_numeric.h         |   94 -
 .../UMFPACK/Include/umfpack_load_symbolic.h        |   94 -
 .../SuiteSparse/UMFPACK/Include/umfpack_numeric.h  |  542 ---
 .../UMFPACK/Include/umfpack_qsymbolic.h            |  235 --
 .../UMFPACK/Include/umfpack_report_control.h       |   75 -
 .../UMFPACK/Include/umfpack_report_info.h          |   85 -
 .../UMFPACK/Include/umfpack_report_matrix.h        |  202 --
 .../UMFPACK/Include/umfpack_report_numeric.h       |  111 -
 .../UMFPACK/Include/umfpack_report_perm.h          |  111 -
 .../UMFPACK/Include/umfpack_report_status.h        |   89 -
 .../UMFPACK/Include/umfpack_report_symbolic.h      |  110 -
 .../UMFPACK/Include/umfpack_report_triplet.h       |  152 -
 .../UMFPACK/Include/umfpack_report_vector.h        |  132 -
 .../UMFPACK/Include/umfpack_save_numeric.h         |   89 -
 .../UMFPACK/Include/umfpack_save_symbolic.h        |   89 -
 src/C/SuiteSparse/UMFPACK/Include/umfpack_scale.h  |  111 -
 src/C/SuiteSparse/UMFPACK/Include/umfpack_solve.h  |  300 --
 .../SuiteSparse/UMFPACK/Include/umfpack_symbolic.h |  516 ---
 src/C/SuiteSparse/UMFPACK/Include/umfpack_tictoc.h |   45 -
 src/C/SuiteSparse/UMFPACK/Include/umfpack_timer.h  |   26 -
 .../UMFPACK/Include/umfpack_transpose.h            |  215 --
 .../UMFPACK/Include/umfpack_triplet_to_col.h       |  262 --
 src/C/SuiteSparse/UMFPACK/Include/umfpack_wsolve.h |  171 -
 src/C/SuiteSparse/UMFPACK/Lib/GNUmakefile          |  271 --
 src/C/SuiteSparse/UMFPACK/Lib/Makefile             |  482 ---
 src/C/SuiteSparse/UMFPACK/Lib/libumfpack.def       |  109 -
 src/C/SuiteSparse/UMFPACK/Makefile                 |   80 -
 src/C/SuiteSparse/UMFPACK/README.txt               |  411 ---
 src/C/SuiteSparse/UMFPACK/Source/cholmod_blas.h    |  447 ---
 src/C/SuiteSparse/UMFPACK/Source/umf_analyze.c     |  704 ----
 src/C/SuiteSparse/UMFPACK/Source/umf_analyze.h     |   22 -
 src/C/SuiteSparse/UMFPACK/Source/umf_apply_order.c |   43 -
 src/C/SuiteSparse/UMFPACK/Source/umf_apply_order.h |   13 -
 src/C/SuiteSparse/UMFPACK/Source/umf_assemble.c    | 1215 -------
 src/C/SuiteSparse/UMFPACK/Source/umf_assemble.h    |   16 -
 .../SuiteSparse/UMFPACK/Source/umf_blas3_update.c  |  175 -
 .../SuiteSparse/UMFPACK/Source/umf_blas3_update.h  |    9 -
 .../SuiteSparse/UMFPACK/Source/umf_build_tuples.c  |  159 -
 .../SuiteSparse/UMFPACK/Source/umf_build_tuples.h  |   10 -
 src/C/SuiteSparse/UMFPACK/Source/umf_cholmod.c     |  233 --
 src/C/SuiteSparse/UMFPACK/Source/umf_cholmod.h     |   37 -
 src/C/SuiteSparse/UMFPACK/Source/umf_colamd.c      | 3136 -----------------
 src/C/SuiteSparse/UMFPACK/Source/umf_colamd.h      |  254 --
 src/C/SuiteSparse/UMFPACK/Source/umf_config.h      |  279 --
 .../UMFPACK/Source/umf_create_element.c            |  592 ----
 .../UMFPACK/Source/umf_create_element.h            |   11 -
 src/C/SuiteSparse/UMFPACK/Source/umf_dump.c        | 1206 -------
 src/C/SuiteSparse/UMFPACK/Source/umf_dump.h        |  188 -
 .../SuiteSparse/UMFPACK/Source/umf_extend_front.c  |  392 ---
 .../SuiteSparse/UMFPACK/Source/umf_extend_front.h  |   10 -
 src/C/SuiteSparse/UMFPACK/Source/umf_free.c        |   44 -
 src/C/SuiteSparse/UMFPACK/Source/umf_free.h        |    9 -
 src/C/SuiteSparse/UMFPACK/Source/umf_fsize.c       |   69 -
 src/C/SuiteSparse/UMFPACK/Source/umf_fsize.h       |   14 -
 .../UMFPACK/Source/umf_garbage_collection.c        |  695 ----
 .../UMFPACK/Source/umf_garbage_collection.h        |   13 -
 src/C/SuiteSparse/UMFPACK/Source/umf_get_memory.c  |  222 --
 src/C/SuiteSparse/UMFPACK/Source/umf_get_memory.h  |   14 -
 src/C/SuiteSparse/UMFPACK/Source/umf_grow_front.c  |  293 --
 src/C/SuiteSparse/UMFPACK/Source/umf_grow_front.h  |   13 -
 src/C/SuiteSparse/UMFPACK/Source/umf_init_front.c  |  267 --
 src/C/SuiteSparse/UMFPACK/Source/umf_init_front.h  |   10 -
 src/C/SuiteSparse/UMFPACK/Source/umf_internal.h    |  729 ----
 .../UMFPACK/Source/umf_is_permutation.c            |   55 -
 .../UMFPACK/Source/umf_is_permutation.h            |   12 -
 src/C/SuiteSparse/UMFPACK/Source/umf_kernel.c      |  299 --
 src/C/SuiteSparse/UMFPACK/Source/umf_kernel.h      |   17 -
 src/C/SuiteSparse/UMFPACK/Source/umf_kernel_init.c | 1065 ------
 src/C/SuiteSparse/UMFPACK/Source/umf_kernel_init.h |   17 -
 .../SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.c |  466 ---
 .../SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.h |   11 -
 .../SuiteSparse/UMFPACK/Source/umf_local_search.c  | 1954 -----------
 .../SuiteSparse/UMFPACK/Source/umf_local_search.h  |   11 -
 src/C/SuiteSparse/UMFPACK/Source/umf_lsolve.c      |  151 -
 src/C/SuiteSparse/UMFPACK/Source/umf_lsolve.h      |   11 -
 src/C/SuiteSparse/UMFPACK/Source/umf_ltsolve.c     |  225 --
 src/C/SuiteSparse/UMFPACK/Source/umf_ltsolve.h     |   18 -
 src/C/SuiteSparse/UMFPACK/Source/umf_malloc.c      |   78 -
 src/C/SuiteSparse/UMFPACK/Source/umf_malloc.h      |   24 -
 .../UMFPACK/Source/umf_mem_alloc_element.c         |   82 -
 .../UMFPACK/Source/umf_mem_alloc_element.h         |   16 -
 .../UMFPACK/Source/umf_mem_alloc_head_block.c      |   54 -
 .../UMFPACK/Source/umf_mem_alloc_head_block.h      |   10 -
 .../UMFPACK/Source/umf_mem_alloc_tail_block.c      |  133 -
 .../UMFPACK/Source/umf_mem_alloc_tail_block.h      |   10 -
 .../UMFPACK/Source/umf_mem_free_tail_block.c       |  142 -
 .../UMFPACK/Source/umf_mem_free_tail_block.h       |   10 -
 .../UMFPACK/Source/umf_mem_init_memoryspace.c      |   64 -
 .../UMFPACK/Source/umf_mem_init_memoryspace.h      |    9 -
 .../SuiteSparse/UMFPACK/Source/umf_multicompile.c  |   57 -
 src/C/SuiteSparse/UMFPACK/Source/umf_realloc.c     |   74 -
 src/C/SuiteSparse/UMFPACK/Source/umf_realloc.h     |   11 -
 src/C/SuiteSparse/UMFPACK/Source/umf_report_perm.c |   85 -
 src/C/SuiteSparse/UMFPACK/Source/umf_report_perm.h |   13 -
 .../SuiteSparse/UMFPACK/Source/umf_report_vector.c |  110 -
 .../SuiteSparse/UMFPACK/Source/umf_report_vector.h |   14 -
 src/C/SuiteSparse/UMFPACK/Source/umf_row_search.c  |  836 -----
 src/C/SuiteSparse/UMFPACK/Source/umf_row_search.h  |   31 -
 src/C/SuiteSparse/UMFPACK/Source/umf_scale.c       |   81 -
 src/C/SuiteSparse/UMFPACK/Source/umf_scale.h       |   11 -
 .../SuiteSparse/UMFPACK/Source/umf_scale_column.c  |  433 ---
 .../SuiteSparse/UMFPACK/Source/umf_scale_column.h  |   10 -
 src/C/SuiteSparse/UMFPACK/Source/umf_set_stats.c   |  133 -
 src/C/SuiteSparse/UMFPACK/Source/umf_set_stats.h   |   23 -
 src/C/SuiteSparse/UMFPACK/Source/umf_singletons.c  |  934 -----
 src/C/SuiteSparse/UMFPACK/Source/umf_singletons.h  |   31 -
 src/C/SuiteSparse/UMFPACK/Source/umf_solve.c       | 1395 --------
 src/C/SuiteSparse/UMFPACK/Source/umf_solve.h       |   24 -
 src/C/SuiteSparse/UMFPACK/Source/umf_start_front.c |  283 --
 src/C/SuiteSparse/UMFPACK/Source/umf_start_front.h |   12 -
 src/C/SuiteSparse/UMFPACK/Source/umf_store_lu.c    | 1056 ------
 src/C/SuiteSparse/UMFPACK/Source/umf_store_lu.h    |   16 -
 .../UMFPACK/Source/umf_symbolic_usage.c            |   45 -
 .../UMFPACK/Source/umf_symbolic_usage.h            |   14 -
 src/C/SuiteSparse/UMFPACK/Source/umf_transpose.c   |  400 ---
 src/C/SuiteSparse/UMFPACK/Source/umf_transpose.h   |   26 -
 src/C/SuiteSparse/UMFPACK/Source/umf_triplet.c     |  428 ---
 src/C/SuiteSparse/UMFPACK/Source/umf_triplet.h     |   84 -
 .../SuiteSparse/UMFPACK/Source/umf_tuple_lengths.c |  135 -
 .../SuiteSparse/UMFPACK/Source/umf_tuple_lengths.h |   11 -
 src/C/SuiteSparse/UMFPACK/Source/umf_usolve.c      |  226 --
 src/C/SuiteSparse/UMFPACK/Source/umf_usolve.h      |   11 -
 src/C/SuiteSparse/UMFPACK/Source/umf_utsolve.c     |  331 --
 src/C/SuiteSparse/UMFPACK/Source/umf_utsolve.h     |   19 -
 .../SuiteSparse/UMFPACK/Source/umf_valid_numeric.c |   46 -
 .../SuiteSparse/UMFPACK/Source/umf_valid_numeric.h |    9 -
 .../UMFPACK/Source/umf_valid_symbolic.c            |   47 -
 .../UMFPACK/Source/umf_valid_symbolic.h            |    9 -
 src/C/SuiteSparse/UMFPACK/Source/umf_version.h     |  879 -----
 .../UMFPACK/Source/umfpack_col_to_triplet.c        |   71 -
 .../SuiteSparse/UMFPACK/Source/umfpack_defaults.c  |   70 -
 .../UMFPACK/Source/umfpack_free_numeric.c          |   56 -
 .../UMFPACK/Source/umfpack_free_symbolic.c         |   55 -
 .../UMFPACK/Source/umfpack_get_determinant.c       |  308 --
 .../SuiteSparse/UMFPACK/Source/umfpack_get_lunz.c  |   54 -
 .../UMFPACK/Source/umfpack_get_numeric.c           | 1056 ------
 .../UMFPACK/Source/umfpack_get_symbolic.c          |  190 -
 src/C/SuiteSparse/UMFPACK/Source/umfpack_global.c  |   10 -
 .../UMFPACK/Source/umfpack_load_numeric.c          |  160 -
 .../UMFPACK/Source/umfpack_load_symbolic.c         |  164 -
 src/C/SuiteSparse/UMFPACK/Source/umfpack_numeric.c |  792 -----
 .../SuiteSparse/UMFPACK/Source/umfpack_qsymbolic.c | 2752 ---------------
 .../UMFPACK/Source/umfpack_report_control.c        |  370 --
 .../UMFPACK/Source/umfpack_report_info.c           |  570 ---
 .../UMFPACK/Source/umfpack_report_matrix.c         |  202 --
 .../UMFPACK/Source/umfpack_report_numeric.c        |  662 ----
 .../UMFPACK/Source/umfpack_report_perm.c           |   43 -
 .../UMFPACK/Source/umfpack_report_status.c         |  123 -
 .../UMFPACK/Source/umfpack_report_symbolic.c       |  242 --
 .../UMFPACK/Source/umfpack_report_triplet.c        |   98 -
 .../UMFPACK/Source/umfpack_report_vector.c         |   42 -
 .../UMFPACK/Source/umfpack_save_numeric.c          |   95 -
 .../UMFPACK/Source/umfpack_save_symbolic.c         |   95 -
 src/C/SuiteSparse/UMFPACK/Source/umfpack_scale.c   |  157 -
 src/C/SuiteSparse/UMFPACK/Source/umfpack_solve.c   |  244 --
 .../SuiteSparse/UMFPACK/Source/umfpack_symbolic.c  |   37 -
 src/C/SuiteSparse/UMFPACK/Source/umfpack_tictoc.c  |   34 -
 src/C/SuiteSparse/UMFPACK/Source/umfpack_timer.c   |   23 -
 .../SuiteSparse/UMFPACK/Source/umfpack_transpose.c |  107 -
 .../UMFPACK/Source/umfpack_triplet_to_col.c        |  224 --
 src/C/SuiteSparse_cvxopt_extra/README              |    7 -
 .../SuiteSparse_cvxopt_extra/umfpack/amd_global.c  |    1 -
 src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_1.c   |    3 -
 src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_2.c   |    3 -
 src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_aat.c |    3 -
 .../umfpack/amd_i_defaults.c                       |    3 -
 .../SuiteSparse_cvxopt_extra/umfpack/amd_i_dump.c  |    3 -
 .../SuiteSparse_cvxopt_extra/umfpack/amd_i_order.c |    3 -
 .../umfpack/amd_i_post_tree.c                      |    3 -
 .../umfpack/amd_i_postorder.c                      |    3 -
 .../umfpack/amd_i_preprocess.c                     |    3 -
 .../SuiteSparse_cvxopt_extra/umfpack/amd_i_valid.c |    3 -
 src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_1.c   |    3 -
 src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_2.c   |    3 -
 src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_aat.c |    3 -
 .../umfpack/amd_l_defaults.c                       |    3 -
 .../SuiteSparse_cvxopt_extra/umfpack/amd_l_dump.c  |    3 -
 .../SuiteSparse_cvxopt_extra/umfpack/amd_l_order.c |    3 -
 .../umfpack/amd_l_post_tree.c                      |    3 -
 .../umfpack/amd_l_postorder.c                      |    3 -
 .../umfpack/amd_l_preprocess.c                     |    3 -
 .../SuiteSparse_cvxopt_extra/umfpack/amd_l_valid.c |    3 -
 .../umfpack/umf_di_assemble.c                      |    2 -
 .../umfpack/umf_di_assemble_fixq.c                 |    3 -
 .../umfpack/umf_di_blas3_update.c                  |    2 -
 .../umfpack/umf_di_build_tuples.c                  |    2 -
 .../umfpack/umf_di_create_element.c                |    2 -
 .../umfpack/umf_di_extend_front.c                  |    2 -
 .../umfpack/umf_di_garbage_collection.c            |    2 -
 .../umfpack/umf_di_get_memory.c                    |    2 -
 .../umfpack/umf_di_grow_front.c                    |    2 -
 .../umfpack/umf_di_init_front.c                    |    3 -
 .../umfpack/umf_di_kernel.c                        |    2 -
 .../umfpack/umf_di_kernel_init.c                   |    2 -
 .../umfpack/umf_di_kernel_wrapup.c                 |    2 -
 .../umfpack/umf_di_lhsolve.c                       |    3 -
 .../umfpack/umf_di_local_search.c                  |    2 -
 .../umfpack/umf_di_lsolve.c                        |    2 -
 .../umfpack/umf_di_ltsolve.c                       |    2 -
 .../umfpack/umf_di_mem_alloc_element.c             |    2 -
 .../umfpack/umf_di_mem_alloc_head_block.c          |    2 -
 .../umfpack/umf_di_mem_alloc_tail_block.c          |    2 -
 .../umfpack/umf_di_mem_free_tail_block.c           |    2 -
 .../umfpack/umf_di_mem_init_memoryspace.c          |    2 -
 .../umfpack/umf_di_row_search.c                    |    2 -
 .../umfpack/umf_di_scale.c                         |    2 -
 .../umfpack/umf_di_scale_column.c                  |    2 -
 .../umfpack/umf_di_set_stats.c                     |    2 -
 .../umfpack/umf_di_solve.c                         |    2 -
 .../umfpack/umf_di_start_front.c                   |    2 -
 .../umfpack/umf_di_store_lu.c                      |    2 -
 .../umfpack/umf_di_store_lu_drop.c                 |    3 -
 .../umfpack/umf_di_symbolic_usage.c                |    2 -
 .../umfpack/umf_di_transpose.c                     |    2 -
 .../umfpack/umf_di_tuple_lengths.c                 |    2 -
 .../umfpack/umf_di_uhsolve.c                       |    3 -
 .../umfpack/umf_di_usolve.c                        |    2 -
 .../umfpack/umf_di_utsolve.c                       |    2 -
 .../umfpack/umf_di_valid_numeric.c                 |    2 -
 .../umfpack/umf_di_valid_symbolic.c                |    2 -
 .../umfpack/umf_dl_assemble.c                      |    3 -
 .../umfpack/umf_dl_assemble_fixq.c                 |    3 -
 .../umfpack/umf_dl_blas3_update.c                  |    3 -
 .../umfpack/umf_dl_build_tuples.c                  |    3 -
 .../umfpack/umf_dl_create_elememt.c                |    3 -
 .../umfpack/umf_dl_extend_front.c                  |    3 -
 .../umfpack/umf_dl_garbage_collection.c            |    3 -
 .../umfpack/umf_dl_get_memory.c                    |    3 -
 .../umfpack/umf_dl_grow_front.c                    |    3 -
 .../umfpack/umf_dl_init_front.c                    |    3 -
 .../umfpack/umf_dl_kernel.c                        |    3 -
 .../umfpack/umf_dl_kernel_init.c                   |    3 -
 .../umfpack/umf_dl_kernel_wrapup.c                 |    3 -
 .../umfpack/umf_dl_lhsolve.c                       |    4 -
 .../umfpack/umf_dl_local_search.c                  |    3 -
 .../umfpack/umf_dl_lsolve.c                        |    3 -
 .../umfpack/umf_dl_ltsolve.c                       |    3 -
 .../umfpack/umf_dl_mem_alloc_element.c             |    3 -
 .../umfpack/umf_dl_mem_alloc_head_block.c          |    3 -
 .../umfpack/umf_dl_mem_alloc_tail_block.c          |    3 -
 .../umfpack/umf_dl_mem_free_tail_block.c           |    3 -
 .../umfpack/umf_dl_mem_init_memoryspace.c          |    3 -
 .../umfpack/umf_dl_row_search.c                    |    3 -
 .../umfpack/umf_dl_scale.c                         |    3 -
 .../umfpack/umf_dl_scale_column.c                  |    3 -
 .../umfpack/umf_dl_set_stats.c                     |    3 -
 .../umfpack/umf_dl_solve.c                         |    3 -
 .../umfpack/umf_dl_start_front.c                   |    3 -
 .../umfpack/umf_dl_store_lu.c                      |    3 -
 .../umfpack/umf_dl_store_lu_drop.c                 |    3 -
 .../umfpack/umf_dl_symbolic_usage.c                |    3 -
 .../umfpack/umf_dl_transpose.c                     |    3 -
 .../umfpack/umf_dl_tuple_lengths.c                 |    3 -
 .../umfpack/umf_dl_uhsolve.c                       |    4 -
 .../umfpack/umf_dl_usolve.c                        |    3 -
 .../umfpack/umf_dl_utsolve.c                       |    3 -
 .../umfpack/umf_dl_valid_numeric.c                 |    3 -
 .../umfpack/umf_dl_valid_symbolic.c                |    3 -
 .../umfpack/umf_i_analyze.c                        |    2 -
 .../umfpack/umf_i_apply_order.c                    |    2 -
 .../umfpack/umf_i_cholmod.c                        |    2 -
 .../umfpack/umf_i_colamd.c                         |    2 -
 .../SuiteSparse_cvxopt_extra/umfpack/umf_i_free.c  |    2 -
 .../SuiteSparse_cvxopt_extra/umfpack/umf_i_fsize.c |    2 -
 .../umfpack/umf_i_is_permutation.c                 |    2 -
 .../umfpack/umf_i_malloc.c                         |    2 -
 .../umfpack/umf_i_realloc.c                        |    2 -
 .../umfpack/umf_i_singletons.c                     |    2 -
 .../umfpack/umf_l_analyze.c                        |    3 -
 .../umfpack/umf_l_apply_order.c                    |    2 -
 .../umfpack/umf_l_cholmod.c                        |    3 -
 .../umfpack/umf_l_colamd.c                         |    3 -
 .../SuiteSparse_cvxopt_extra/umfpack/umf_l_free.c  |    3 -
 .../SuiteSparse_cvxopt_extra/umfpack/umf_l_fsize.c |    3 -
 .../umfpack/umf_l_is_permutation.c                 |    3 -
 .../umfpack/umf_l_malloc.c                         |    3 -
 .../umfpack/umf_l_realloc.c                        |    3 -
 .../umfpack/umf_l_singletons.c                     |    3 -
 .../umfpack/umf_zi_assemble.c                      |    2 -
 .../umfpack/umf_zi_assemble_fixq.c                 |    3 -
 .../umfpack/umf_zi_blas3_update.c                  |    2 -
 .../umfpack/umf_zi_build_tuples.c                  |    2 -
 .../umfpack/umf_zi_create_element.c                |    2 -
 .../umfpack/umf_zi_extend_front.c                  |    2 -
 .../umfpack/umf_zi_garbage_collection.c            |    2 -
 .../umfpack/umf_zi_get_memory.c                    |    2 -
 .../umfpack/umf_zi_grow_front.c                    |    2 -
 .../umfpack/umf_zi_init_front.c                    |    3 -
 .../umfpack/umf_zi_kernel.c                        |    2 -
 .../umfpack/umf_zi_kernel_init.c                   |    2 -
 .../umfpack/umf_zi_kernel_wrapup.c                 |    2 -
 .../umfpack/umf_zi_lhsolve.c                       |    3 -
 .../umfpack/umf_zi_local_search.c                  |    2 -
 .../umfpack/umf_zi_lsolve.c                        |    2 -
 .../umfpack/umf_zi_ltsolve.c                       |    2 -
 .../umfpack/umf_zi_mem_alloc_element.c             |    2 -
 .../umfpack/umf_zi_mem_alloc_head_block.c          |    2 -
 .../umfpack/umf_zi_mem_alloc_tail_block.c          |    2 -
 .../umfpack/umf_zi_mem_free_tail_block.c           |    2 -
 .../umfpack/umf_zi_mem_init_memoryspace.c          |    2 -
 .../umfpack/umf_zi_row_search.c                    |    2 -
 .../umfpack/umf_zi_scale.c                         |    2 -
 .../umfpack/umf_zi_scale_column.c                  |    2 -
 .../umfpack/umf_zi_set_stats.c                     |    2 -
 .../umfpack/umf_zi_solve.c                         |    2 -
 .../umfpack/umf_zi_start_front.c                   |    2 -
 .../umfpack/umf_zi_store_lu.c                      |    2 -
 .../umfpack/umf_zi_store_lu_drop.c                 |    3 -
 .../umfpack/umf_zi_symbolic_usage.c                |    2 -
 .../umfpack/umf_zi_transpose.c                     |    2 -
 .../umfpack/umf_zi_tuple_lengths.c                 |    2 -
 .../umfpack/umf_zi_uhsolve.c                       |    3 -
 .../umfpack/umf_zi_usolve.c                        |    2 -
 .../umfpack/umf_zi_utsolve.c                       |    2 -
 .../umfpack/umf_zi_valid_numeric.c                 |    2 -
 .../umfpack/umf_zi_valid_symbolic.c                |    2 -
 .../umfpack/umf_zl_assemble.c                      |    3 -
 .../umfpack/umf_zl_assemble_fixq.c                 |    3 -
 .../umfpack/umf_zl_blas3_update.c                  |    3 -
 .../umfpack/umf_zl_build_tuples.c                  |    3 -
 .../umfpack/umf_zl_create_elememt.c                |    3 -
 .../umfpack/umf_zl_extend_front.c                  |    3 -
 .../umfpack/umf_zl_garbage_collection.c            |    3 -
 .../umfpack/umf_zl_get_memory.c                    |    3 -
 .../umfpack/umf_zl_grow_front.c                    |    3 -
 .../umfpack/umf_zl_init_front.c                    |    3 -
 .../umfpack/umf_zl_kernel.c                        |    3 -
 .../umfpack/umf_zl_kernel_init.c                   |    3 -
 .../umfpack/umf_zl_kernel_wrapup.c                 |    3 -
 .../umfpack/umf_zl_lhsolve.c                       |    4 -
 .../umfpack/umf_zl_local_search.c                  |    3 -
 .../umfpack/umf_zl_lsolve.c                        |    3 -
 .../umfpack/umf_zl_ltsolve.c                       |    3 -
 .../umfpack/umf_zl_mem_alloc_element.c             |    3 -
 .../umfpack/umf_zl_mem_alloc_head_block.c          |    3 -
 .../umfpack/umf_zl_mem_alloc_tail_block.c          |    3 -
 .../umfpack/umf_zl_mem_free_tail_block.c           |    3 -
 .../umfpack/umf_zl_mem_init_memoryspace.c          |    3 -
 .../umfpack/umf_zl_row_search.c                    |    3 -
 .../umfpack/umf_zl_scale.c                         |    3 -
 .../umfpack/umf_zl_scale_column.c                  |    3 -
 .../umfpack/umf_zl_set_stats.c                     |    3 -
 .../umfpack/umf_zl_solve.c                         |    3 -
 .../umfpack/umf_zl_start_front.c                   |    3 -
 .../umfpack/umf_zl_store_lu.c                      |    3 -
 .../umfpack/umf_zl_store_lu_drop.c                 |    3 -
 .../umfpack/umf_zl_symbolic_usage.c                |    3 -
 .../umfpack/umf_zl_transpose.c                     |    3 -
 .../umfpack/umf_zl_tuple_lengths.c                 |    3 -
 .../umfpack/umf_zl_uhsolve.c                       |    4 -
 .../umfpack/umf_zl_usolve.c                        |    3 -
 .../umfpack/umf_zl_utsolve.c                       |    3 -
 .../umfpack/umf_zl_valid_numeric.c                 |    3 -
 .../umfpack/umf_zl_valid_symbolic.c                |    3 -
 .../umfpack/umfpack_di_free_numeric.c              |    2 -
 .../umfpack/umfpack_di_free_symbolic.c             |    2 -
 .../umfpack/umfpack_di_numeric.c                   |    2 -
 .../umfpack/umfpack_di_qsymbolic.c                 |    2 -
 .../umfpack/umfpack_di_solve.c                     |    2 -
 .../umfpack/umfpack_di_symbolic.c                  |    2 -
 .../umfpack/umfpack_dl_free_numeric.c              |    3 -
 .../umfpack/umfpack_dl_free_symbolic.c             |    3 -
 .../umfpack/umfpack_dl_numeric.c                   |    3 -
 .../umfpack/umfpack_dl_qsymbolic.c                 |    3 -
 .../umfpack/umfpack_dl_solve.c                     |    3 -
 .../umfpack/umfpack_dl_symbolic.c                  |    2 -
 .../umfpack/umfpack_zi_free_numeric.c              |    2 -
 .../umfpack/umfpack_zi_free_symbolic.c             |    2 -
 .../umfpack/umfpack_zi_numeric.c                   |    2 -
 .../umfpack/umfpack_zi_qsymbolic.c                 |    2 -
 .../umfpack/umfpack_zi_solve.c                     |    2 -
 .../umfpack/umfpack_zi_symbolic.c                  |    2 -
 .../umfpack/umfpack_zl_free_numeric.c              |    3 -
 .../umfpack/umfpack_zl_free_symbolic.c             |    3 -
 .../umfpack/umfpack_zl_numeric.c                   |    3 -
 .../umfpack/umfpack_zl_qsymbolic.c                 |    3 -
 .../umfpack/umfpack_zl_solve.c                     |    3 -
 .../umfpack/umfpack_zl_symbolic.c                  |    2 -
 561 files changed, 112179 deletions(-)

diff --git a/src/C/SuiteSparse/AMD/Doc/AMD_UserGuide.bib b/src/C/SuiteSparse/AMD/Doc/AMD_UserGuide.bib
deleted file mode 100644
index 03fbfa8..0000000
--- a/src/C/SuiteSparse/AMD/Doc/AMD_UserGuide.bib
+++ /dev/null
@@ -1,98 +0,0 @@
- at string{SIREV       = "{SIAM} Review"}
- at string{SIMAX       = "{SIAM} J. Matrix Anal. Applic."}
- at string{SIAMJSC     = "{SIAM} J. Sci. Comput."}
- at string{TOMS        = "{ACM} Trans. Math. Softw."}
-
- at 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}
-	}
-
- at 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}}
-
- at 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}
-	}
-
- at article{AmestoyDavisDuff04,
-	author={Amestoy, P. R. and Davis, T. A. and Duff, I. S.},
-	title={Algorithm 837: An approximate minimum degree ordering algorithm},
-	journal=TOMS,
-	year={2004}
-	,volume={30}
-	,number={3}
-	,pages={381-388}
-	}
-
- at 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}
-
-
- at 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}
-	}
-
- at 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}
-	}
-
- at 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}
-	}
-
- at 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}
-	}
-
- at article{DavisGilbertLarimoreNg04,
-	author={Davis, T. A. and Gilbert, J. R. and Larimore, S. I. and Ng, E. G.},
-	title={A column approximate minimum degree ordering algorithm},
-	journal=TOMS,
-	year={2004}
-	,volume={30}
-	,pages={353-376}
-	}
-
diff --git a/src/C/SuiteSparse/AMD/Doc/AMD_UserGuide.tex b/src/C/SuiteSparse/AMD/Doc/AMD_UserGuide.tex
deleted file mode 100644
index f0e7af8..0000000
--- a/src/C/SuiteSparse/AMD/Doc/AMD_UserGuide.tex
+++ /dev/null
@@ -1,783 +0,0 @@
-\documentclass[11pt]{article}
-
-\newcommand{\m}[1]{{\bf{#1}}}       % for matrices and vectors
-\newcommand{\tr}{^{\sf T}}          % transpose
-
-\topmargin 0in
-\textheight 9in
-\oddsidemargin 0pt
-\evensidemargin 0pt
-\textwidth 6.5in
-
-%------------------------------------------------------------------------------
-\begin{document}
-%------------------------------------------------------------------------------
-
-\title{AMD User Guide}
-\author{Patrick R. Amestoy\thanks{ENSEEIHT-IRIT,
-2 rue Camichel 31017 Toulouse, France.
-email: amestoy at enseeiht.fr.  http://www.enseeiht.fr/$\sim$amestoy.}
-\and Timothy A. Davis\thanks{
-email: DrTimothyAldenDavis at gmail.com,
-http://www.suitesparse.com.
-This work was supported by the National
-Science Foundation, under grants ASC-9111263, DMS-9223088, and CCR-0203270.
-Portions of the work were done while on sabbatical at Stanford University
-and Lawrence Berkeley National Laboratory (with funding from Stanford
-University and the SciDAC program).
-}
-\and Iain S. Duff\thanks{Rutherford Appleton Laboratory, Chilton, Didcot, 
-Oxon OX11 0QX, England. email: i.s.duff at rl.ac.uk.  
-http://www.numerical.rl.ac.uk/people/isd/isd.html.
-This work was supported by the EPSRC under grant GR/R46441.
-}}
-
-\date{VERSION 2.4.1, Oct 10, 2014}
-\maketitle
-
-%------------------------------------------------------------------------------
-\begin{abstract}
-AMD is a set of routines that implements the approximate minimum degree ordering
-algorithm to permute sparse matrices prior to
-numerical factorization.
-There are versions written in both C and Fortran 77.
-A MATLAB interface is included.
-\end{abstract}
-%------------------------------------------------------------------------------
-
-AMD Copyright\copyright 2013 by Timothy A.
-Davis, Patrick R. Amestoy, and Iain S. Duff.  All Rights Reserved.
-AMD is available under alternate licences; contact T. Davis for details.
-
-{\bf AMD License:}
-    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.
-
-{\bf Availability:}
-    http://www.suitesparse.com
-
-{\bf Acknowledgments:}
-
-    This work was supported by the National Science Foundation, under
-    grants ASC-9111263 and DMS-9223088 and CCR-0203270.
-    The conversion to C, the addition of the elimination tree
-    post-ordering, and the handling of dense rows and columns
-    were done while Davis was on sabbatical at
-    Stanford University and Lawrence Berkeley National Laboratory.
-
-%------------------------------------------------------------------------------
-\newpage
-\section{Overview}
-%------------------------------------------------------------------------------
-
-AMD is a set of routines for preordering a sparse matrix prior to
-numerical factorization.  It uses an approximate minimum degree ordering
-algorithm \cite{AmestoyDavisDuff96,AmestoyDavisDuff04}
-to find a permutation matrix $\m{P}$
-so that the Cholesky factorization $\m{PAP}\tr=\m{LL}\tr$ has fewer
-(often much fewer) nonzero entries than the Cholesky factorization of $\m{A}$.
-The algorithm is typically much faster than other ordering methods
-and  minimum degree ordering
-algorithms that compute an exact degree \cite{GeorgeLiu89}.
-Some methods, such as approximate deficiency
-\cite{RothbergEisenstat98} and graph-partitioning based methods
-\cite{Chaco,KarypisKumar98e,PellegriniRomanAmestoy00,schu:01}
-can produce better orderings, depending on the matrix.
-
-The algorithm starts with an undirected graph representation of a
-symmetric sparse matrix $\m{A}$.  Node $i$ in the graph corresponds to row
-and column $i$ of the matrix, and there is an edge $(i,j)$ in the graph if
-$a_{ij}$ is nonzero.
-The degree of a node is initialized to the number of off-diagonal nonzeros
-in row $i$, which is the size of the set of nodes
-adjacent to $i$ in the graph.
-
-The selection of a pivot $a_{ii}$ from the diagonal of $\m{A}$ and the first
-step of Gaussian elimination corresponds to one step of graph elimination.
-Numerical fill-in causes new nonzero entries in the matrix
-(fill-in refers to
-nonzeros in $\m{L}$ that are not in $\m{A}$).
-Node $i$ is eliminated and edges are added to its neighbors
-so that they form a clique (or {\em element}).  To reduce fill-in,
-node $i$ is selected as the node of least degree in the graph.
-This process repeats until the graph is eliminated.
-
-The clique is represented implicitly.  Rather than listing all the
-new edges in the graph, a single list of nodes is kept which represents
-the clique.  This list corresponds to the nonzero pattern of the first
-column of $\m{L}$.  As the elimination proceeds, some of these cliques
-become subsets of subsequent cliques, and are removed.   This graph
-can be stored in place, that is
-using the same amount of memory as the original graph.
-
-The most costly part of the minimum degree algorithm is the recomputation
-of the degrees of nodes adjacent to the current pivot element.
-Rather than keep track of the exact degree, the approximate minimum degree
-algorithm finds an upper bound on the degree that is easier to compute.
-For nodes of least degree, this bound tends to be tight.  Using the
-approximate degree instead of the exact degree leads to a substantial savings
-in run time, particularly for very irregularly structured matrices.
-It has no effect on the quality of the ordering.
-
-In the C version of AMD, the elimination phase is followed by an
-elimination tree post-ordering.  This has no effect on fill-in, but
-reorganizes the ordering so that the subsequent numerical factorization is
-more efficient.  It also includes a pre-processing phase in which nodes of
-very high degree are removed (without causing fill-in), and placed last in the
-permutation $\m{P}$.  This reduces the run time substantially if the matrix
-has a few rows with many nonzero entries, and has little effect on the quality
-of the ordering.
-The C version operates on the
-symmetric nonzero pattern of $\m{A}+\m{A}\tr$, so it can be given
-an unsymmetric matrix, or either the lower or upper triangular part of
-a symmetric matrix.
-
-The two Fortran versions of AMD are essentially identical to two versions of
-the AMD algorithm discussed in an earlier paper \cite{AmestoyDavisDuff96}
-(approximate minimum external degree, both with and without aggressive
-absorption).
-For a discussion of the long history of the minimum degree algorithm,
-see \cite{GeorgeLiu89}.
-
-%------------------------------------------------------------------------------
-\section{Availability}
-%------------------------------------------------------------------------------
-
-In addition to appearing as a Collected Algorithm of the ACM, \newline
-AMD is available at http://www.suitesparse.com.
-The Fortran version is available as the routine {\tt MC47} in HSL
-(formerly the Harwell Subroutine Library) \cite{hsl:2002}.
-
-%------------------------------------------------------------------------------
-\section{Using AMD in MATLAB}
-%------------------------------------------------------------------------------
-
-The MATLAB function {\tt amd} is now a built-in function in MATLAB 7.3
-(R2006b).  The built-in {\tt amd} and the {\tt amd2} function provided here
-differ in how the optional parameters are passed
-(the 2nd input parameter).
-
-To use AMD2 in MATLAB, you must first compile the AMD2 mexFunction.
-Just type {\tt make} in the Unix system shell, while in the {\tt AMD/MATLAB}
-directory.  You can also type {\tt amd\_make} in MATLAB, while in the
-{\tt AMD/MATLAB} directory.  Place the {\tt AMD/MATLAB} directory in your
-MATLAB path.  This can be done on any system with MATLAB, including Windows.
-See Section~\ref{Install} for more details on how to install AMD.
-
-The MATLAB statement {\tt p=amd(A)} finds a permutation vector {\tt p} such
-that the Cholesky factorization {\tt chol(A(p,p))} is typically sparser than
-{\tt chol(A)}.
-If {\tt A} is unsymmetric, {\tt amd(A)} is identical to {\tt amd(A+A')}
-(ignoring numerical cancellation).
-If {\tt A} is not symmetric positive definite,
-but has substantial diagonal entries and a mostly symmetric nonzero pattern,
-then this ordering is also suitable for LU factorization.  A partial pivoting
-threshold may be required to prevent pivots from being selected off the
-diagonal, such as the statement {\tt [L,U,P] = lu (A (p,p), 0.1)}.
-Type {\tt help lu} for more details.
-The statement {\tt [L,U,P,Q] = lu (A (p,p))} in MATLAB 6.5 is
-not suitable, however, because it uses UMFPACK Version 4.0 and thus
-does not attempt to select pivots from the diagonal.
-UMFPACK Version 4.1 in MATLAB 7.0 and later
-uses several strategies, including a symmetric pivoting strategy, and
-will give you better results if you want to factorize an unsymmetric matrix
-of this type.  Refer to the UMFPACK User Guide for more details, at
-http://www.suitesparse.com.
-
-The AMD mexFunction is much faster than the built-in MATLAB symmetric minimum
-degree ordering methods, SYMAMD and SYMMMD.  Its ordering quality is
-comparable to SYMAMD, and better than SYMMMD
-\cite{DavisGilbertLarimoreNg04}.
-
-An optional input argument can be used to modify the control parameters for
-AMD (aggressive absorption, dense row/column handling, and printing of
-statistics).  An optional output
-argument provides statistics on the ordering, including an analysis of the
-fill-in and the floating-point operation count for a subsequent factorization.
-For more details (once AMD is installed),
-type {\tt help amd} in the MATLAB command window.
-
-%------------------------------------------------------------------------------
-\section{Using AMD in a C program}
-\label{Cversion}
-%------------------------------------------------------------------------------
-
-The C-callable AMD library consists of seven user-callable routines and one
-include file.  There are two versions of each of the routines, with
-{\tt int} and {\tt long} integers.
-The routines with prefix
-{\tt amd\_l\_} use {\tt long} integer arguments; the others use
-{\tt int} integer arguments.  If you compile AMD in the standard
-ILP32 mode (32-bit {\tt int}'s, {\tt long}'s, and pointers) then the versions
-are essentially identical.  You will be able to solve problems using up to 2GB
-of memory.  If you compile AMD in the standard LP64 mode, the size of an
-{\tt int} remains 32-bits, but the size of a {\tt long} and a pointer both get
-promoted to 64-bits.
-
-The following routines are fully described in Section~\ref{Primary}:
-
-\begin{itemize}
-\item {\tt amd\_order}
-({\tt long} version: {\tt amd\_l\_order})
-    {\footnotesize
-    \begin{verbatim}
-    #include "amd.h"
-    int n, Ap [n+1], Ai [nz], P [n] ;
-    double Control [AMD_CONTROL], Info [AMD_INFO] ;
-    int result = amd_order (n, Ap, Ai, P, Control, Info) ;
-    \end{verbatim}
-    }
-    Computes the approximate minimum degree ordering of an $n$-by-$n$ matrix
-    $\m{A}$.  Returns a permutation vector {\tt P} of size {\tt n}, where
-    {\tt P[k] = i} if row and column {\tt i} are the {\tt k}th row and
-    column in the permuted matrix.
-    This routine allocates its own memory of size $1.2e+9n$ integers,
-    where $e$ is the number of nonzeros in $\m{A}+\m{A}\tr$.
-    It computes statistics about the matrix $\m{A}$, such as the symmetry of
-    its nonzero pattern, the number of nonzeros in $\m{L}$,
-    and the number of floating-point operations required for Cholesky and LU
-    factorizations (which are returned in the {\tt Info} array).
-    The user's input matrix is not modified.
-    It returns {\tt AMD\_OK} if successful,
-    {\tt AMD\_OK\_BUT\_JUMBLED} if successful (but the matrix had unsorted
-    and/or duplicate row indices),
-    {\tt AMD\_INVALID} if the matrix is invalid,
-    {\tt AMD\_OUT\_OF\_MEMORY} if out of memory.
-
-\item {\tt amd\_defaults}
-({\tt long} version: {\tt amd\_l\_defaults})
-    {\footnotesize
-    \begin{verbatim}
-    #include "amd.h"
-    double Control [AMD_CONTROL] ;
-    amd_defaults (Control) ;
-    \end{verbatim}
-    }
-    Sets the default control parameters in the {\tt Control} array.  These can
-    then be modified as desired before passing the array to the other AMD
-    routines.
-
-\item {\tt amd\_control}
-({\tt long} version: {\tt amd\_l\_control})
-    {\footnotesize
-    \begin{verbatim}
-    #include "amd.h"
-    double Control [AMD_CONTROL] ;
-    amd_control (Control) ;
-    \end{verbatim}
-    }
-    Prints a description of the control parameters, and their values.
-
-\item {\tt amd\_info}
-({\tt long} version: {\tt amd\_l\_info})
-    {\footnotesize
-    \begin{verbatim}
-    #include "amd.h"
-    double Info [AMD_INFO] ;
-    amd_info (Info) ;
-    \end{verbatim}
-    }
-    Prints a description of the statistics computed by AMD, and their values.
-
-\item {\tt amd\_valid}
-({\tt long} version: {\tt amd\_valid})
-    {\footnotesize
-    \begin{verbatim}
-    #include "amd.h"
-    int n, Ap [n+1], Ai [nz] ;
-    int result = amd_valid (n, n, Ap, Ai) ;
-    \end{verbatim}
-    }
-    Returns {\tt AMD\_OK} or {\tt AMD\_OK\_BUT\_JUMBLED}
-    if the matrix is valid as input to {\tt amd\_order};
-    the latter is returned if the matrix has unsorted and/or duplicate
-    row indices in one or more columns. 
-    Returns {\tt AMD\_INVALID} if the matrix cannot be passed to
-    {\tt amd\_order}.
-    For {\tt amd\_order}, the matrix must
-    also be square.  The first two arguments are the number of rows and the
-    number of columns of the matrix.  For its use in AMD, these must both
-    equal {\tt n}.
-
-\item {\tt amd\_2}
-({\tt long} version: {\tt amd\_l2})
-    AMD ordering kernel.  It is faster than {\tt amd\_order}, and
-    can be called by the user, but it is difficult to use.
-    It does not check its inputs for errors.
-    It does not require the columns of its input matrix to be sorted,
-    but it destroys the matrix on output.  Additional workspace must be passed.
-    Refer to the source file {\tt AMD/Source/amd\_2.c} for a description.
-
-\end{itemize}
-
-The nonzero pattern of the matrix $\m{A}$ is represented in compressed column
-form.
-For an $n$-by-$n$ matrix $\m{A}$ with {\tt nz} nonzero entries, the
-representation consists of two arrays: {\tt Ap} of size {\tt n+1} and {\tt Ai}
-of size {\tt nz}.  The row indices of entries in column {\tt j} are stored in
-    {\tt Ai[Ap[j]} $\ldots$ {\tt Ap[j+1]-1]}.
-For {\tt amd\_order},
-if duplicate row indices are present, or if the row indices in any given
-column are not sorted in ascending order, then {\tt amd\_order} creates
-an internal copy of the matrix with sorted rows and no duplicate entries,
-and orders the copy.  This adds slightly to the time and memory usage of
-{\tt amd\_order}, but is not an error condition.
-
-The matrix is 0-based, and thus
-row indices must be in the range {\tt 0} to {\tt n-1}.
-The first entry {\tt Ap[0]} must be zero.
-The total number of entries in the matrix is thus {\tt nz = Ap[n]}.
-
-The matrix must be square, but it does not need to be symmetric.
-The {\tt amd\_order} routine constructs the nonzero pattern of
-$\m{B} = \m{A}+\m{A}\tr$ (without forming $\m{A}\tr$ explicitly if
-$\m{A}$ has sorted columns and no duplicate entries),
-and then orders the matrix $\m{B}$.  Thus, either the
-lower triangular part of $\m{A}$, the upper triangular part,
-or any combination may be passed.  The transpose $\m{A}\tr$ may also be
-passed to {\tt amd\_order}.
-The diagonal entries may be present, but are ignored.
-
-%------------------------------------------------------------------------------
-\subsection{Control parameters}
-\label{control_param}
-%------------------------------------------------------------------------------
-
-Control parameters are set in an optional {\tt Control} array.
-It is optional in the sense that if
-a {\tt NULL} pointer is passed for the {\tt Control} input argument,
-then default control parameters are used.
-%
-\begin{itemize}
-\item {\tt Control[AMD\_DENSE]} (or {\tt Control(1)} in MATLAB):
-controls the threshold for ``dense''
-rows/columns.  A dense row/column in $\m{A}+\m{A}\tr$
-can cause AMD to spend significant time
-in ordering the matrix.  If {\tt Control[AMD\_DENSE]} $\ge 0$,
-rows/columns with
-more than {\tt Control[AMD\_DENSE]} $\sqrt{n}$ entries are ignored during
-the ordering, and placed last in the output order.  The default
-value of {\tt Control[AMD\_DENSE]} is 10.  If negative, no rows/columns
-are treated as ``dense.''  Rows/columns with 16 or fewer off-diagonal
-entries are never considered ``dense.''
-%
-\item {\tt Control[AMD\_AGGRESSIVE]} (or {\tt Control(2)} in MATLAB):
-controls whether or not to use
-aggressive absorption, in which a prior element is absorbed into the current
-element if it is a subset of the current element, even if it is not
-adjacent to the current pivot element (refer
-to \cite{AmestoyDavisDuff96,AmestoyDavisDuff04}
-for more details).  The default value is nonzero,
-which means that aggressive absorption will be performed.  This nearly always
-leads to a better ordering (because the approximate degrees are more
-accurate) and a lower execution time.  There are cases where it can
-lead to a slightly worse ordering, however.  To turn it off, set
-{\tt Control[AMD\_AGGRESSIVE]} to 0.
-%
-\end{itemize}
-
-Statistics are returned in the {\tt Info} array
-(if {\tt Info} is {\tt NULL}, then no statistics are returned).
-Refer to {\tt amd.h} file, for more details
-(14 different statistics are returned, so the list is not included here).
-
-%------------------------------------------------------------------------------
-\subsection{Sample C program}
-%------------------------------------------------------------------------------
-
-The following program, {\tt amd\_demo.c}, illustrates the basic use of AMD.
-See Section~\ref{Synopsis} for a short description
-of each calling sequence.
-
-{\footnotesize
-\begin{verbatim}
-#include <stdio.h>
-#include "amd.h"
-
-int n = 5 ;
-int Ap [ ] = { 0,   2,       6,       10,  12, 14} ;
-int Ai [ ] = { 0,1, 0,1,2,4, 1,2,3,4, 2,3, 1,4   } ;
-int P [5] ;
-
-int main (void)
-{
-    int k ;
-    (void) amd_order (n, Ap, Ai, P, (double *) NULL, (double *) NULL) ;
-    for (k = 0 ; k < n ; k++) printf ("P [%d] = %d\n", k, P [k]) ;
-    return (0) ;
-}
-\end{verbatim}
-}
-
-The {\tt Ap} and {\tt Ai} arrays represent the binary matrix
-\[
-\m{A} = \left[
-\begin{array}{rrrrr}
- 1 &  1 &  0 &  0 &  0 \\
- 1 &  1 &  1 &  0 &  1 \\
- 0 &  1 &  1 &  1 &  0 \\
- 0 &  0 &  1 &  1 &  0 \\
- 0 &  1 &  1 &  0 &  1 \\
-\end{array}
-\right].
-\]
-The diagonal entries are ignored.
-%
-AMD constructs the pattern of $\m{A}+\m{A}\tr$,
-and returns a permutation vector of $(0, 3, 1, 4, 2)$.
-%
-Since the matrix is unsymmetric but with a mostly symmetric nonzero
-pattern, this would be a suitable permutation for an LU factorization of a
-matrix with this nonzero pattern and whose diagonal entries are not too small.
-The program uses default control settings and does not return any statistics
-about the ordering, factorization, or solution ({\tt Control} and {\tt Info}
-are both {\tt (double *) NULL}).  It also ignores the status value returned by
-{\tt amd\_order}.
-
-More example programs are included with the AMD package.
-The {\tt amd\_demo.c} program provides a more detailed demo of AMD.
-Another example is the AMD mexFunction, {\tt amd\_mex.c}.
-
-%------------------------------------------------------------------------------
-\subsection{A note about zero-sized arrays}
-%------------------------------------------------------------------------------
-
-AMD uses several user-provided arrays of size {\tt n} or {\tt nz}.
-Either {\tt n} or {\tt nz} can be zero.
-If you attempt to {\tt malloc} an array of size zero,
-however, {\tt malloc} will return a null pointer which AMD will report
-as invalid.  If you {\tt malloc} an array of
-size {\tt n} or {\tt nz} to pass to AMD, make sure that you handle the
-{\tt n} = 0 and {\tt nz = 0} cases correctly.
-
-%------------------------------------------------------------------------------
-\section{Synopsis of C-callable routines}
-\label{Synopsis}
-%------------------------------------------------------------------------------
-
-The matrix $\m{A}$ is {\tt n}-by-{\tt n} with {\tt nz} entries.
-
-{\footnotesize
-\begin{verbatim}
-#include "amd.h"
-int n, status, Ap [n+1], Ai [nz], P [n] ;
-double Control [AMD_CONTROL], Info [AMD_INFO] ;
-amd_defaults (Control) ;
-status = amd_order (n, Ap, Ai, P, Control, Info) ;
-amd_control (Control) ;
-amd_info (Info) ;
-status = amd_valid (n, n, Ap, Ai) ;
-\end{verbatim}
-}
-
-The {\tt amd\_l\_*} routines are identical, except that all {\tt int}
-arguments become {\tt long}:
-
-{\footnotesize
-\begin{verbatim}
-#include "amd.h"
-long n, status, Ap [n+1], Ai [nz], P [n] ;
-double Control [AMD_CONTROL], Info [AMD_INFO] ;
-amd_l_defaults (Control) ;
-status = amd_l_order (n, Ap, Ai, P, Control, Info) ;
-amd_l_control (Control) ;
-amd_l_info (Info) ;
-status = amd_l_valid (n, n, Ap, Ai) ;
-\end{verbatim}
-}
-
-%------------------------------------------------------------------------------
-\section{Using AMD in a Fortran program}
-%------------------------------------------------------------------------------
-
-Two Fortran versions of AMD are provided.  The {\tt AMD} routine computes the
-approximate minimum degree ordering, using aggressive absorption.  The
-{\tt AMDBAR} routine is identical, except that it does not perform aggressive
-absorption.  The {\tt AMD} routine is essentially identical to the HSL
-routine {\tt MC47B/BD}.
-Note that earlier versions of the Fortran
-{\tt AMD} and {\tt AMDBAR} routines included an {\tt IOVFLO} argument,
-which is no longer present.
-
-In contrast to the C version, the Fortran routines require a symmetric
-nonzero pattern, with no diagonal entries present although the {\tt MC47A/AD}
-wrapper in HSL allows duplicates, ignores out-of-range entries, and only
-uses entries from the upper triangular part of the matrix.  Although we
-have an experimental Fortran code for treating ``dense'' rows, the Fortran
-codes in this release do not treat
-``dense'' rows and columns of $\m{A}$ differently, and thus their run time
-can be high if there are a few dense rows and columns in the matrix.
-They do not perform a post-ordering of the elimination tree,
-compute statistics on the ordering, or check the validity of their input
-arguments. These facilities are provided by {\tt MC47A/AD} and other
-subroutines from HSL.
-Only one {\tt integer}
-version of each Fortran routine is provided.  
-Both Fortran routines overwrite the user's input
-matrix, in contrast to the C version.  
-%
-The C version does not return the elimination or assembly tree.
-The Fortran version returns an assembly tree;
-refer to the User Guide for details.
-The following is the syntax of the {\tt AMD} Fortran routine.
-The {\tt AMDBAR} routine is identical except for the routine name.
-
-{\footnotesize
-\begin{verbatim}
-        INTEGER N, IWLEN, PFREE, NCMPA, IW (IWLEN), PE (N), DEGREE (N), NV (N),
-     $          NEXT (N), LAST (N), HEAD (N), ELEN (N), W (N), LEN (N)
-        CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
-     $          LAST, HEAD, ELEN, DEGREE, NCMPA, W)
-        CALL AMDBAR (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT,
-     $          LAST, HEAD, ELEN, DEGREE, NCMPA, W)
-\end{verbatim}
-}
-
-The input matrix is provided to {\tt AMD} and {\tt AMDBAR}
-in three arrays, {\tt PE}, of size {\tt N},
-{\tt LEN}, of size {\tt N}, and {\tt IW}, of size {\tt IWLEN}.  The size of
-{\tt IW} must be at least {\tt NZ+N}.  The recommended size is
-{\tt 1.2*NZ + N}.
-On input, the indices of nonzero entries in row {\tt I} are stored in {\tt IW}.
-{\tt PE(I)} is the index in {\tt IW} of the start of row {\tt I}.
-{\tt LEN(I)} is the number of entries in row {\tt I}.
-The matrix is 1-based, with row and column indices in the range 1 to {\tt N}.
-Row {\tt I} is contained in
-{\tt IW (PE(I)} $\ldots \:$ {\tt PE(I) + LEN(I) - 1)}.
-The diagonal entries must not be present.  The indices within each row must
-not contain any duplicates, but they need not be sorted.  The rows
-themselves need not be in any particular order, and there may be empty space
-between the rows.  If {\tt LEN(I)} is zero, then there are no off-diagonal
-entries in row {\tt I}, and {\tt PE(I)} is ignored.  The integer
-{\tt PFREE} defines what part of {\tt IW} contains the user's input matrix,
-which is held in {\tt IW(1}~$\ldots~\:${\tt PFREE-1)}.
-The contents of {\tt IW} and {\tt LEN} are undefined on output,
-and {\tt PE} is modified to contain information about the ordering.
-
-As the algorithm proceeds, it modifies the {\tt IW} array, placing the
-pattern of the partially eliminated matrix in
-{\tt IW(PFREE} $\ldots \:${\tt IWLEN)}.
-If this space is exhausted, the space is compressed.
-The number of compressions performed on the {\tt IW} array is
-returned in the scalar {\tt NCMPA}.  The value of {\tt PFREE} on output is the
-length of {\tt IW} required for no compressions to be needed.
-
-The output permutation is returned in the array {\tt LAST}, of size {\tt N}.
-If {\tt I=LAST(K)}, then {\tt I} is the {\tt K}th row in the permuted
-matrix.  The inverse permutation is returned in the array {\tt ELEN}, where
-{\tt K=ELEN(I)} if {\tt I} is the {\tt K}th row in the permuted matrix.
-On output, the {\tt PE} and {\tt NV} arrays hold the assembly tree,
-a supernodal elimination tree that represents the relationship between
-columns of the Cholesky factor $\m{L}$.
-If {\tt NV(I)} $> 0$, then {\tt I} is a node in the assembly
-tree, and the parent of {\tt I} is {\tt -PE(I)}.  If {\tt I} is a root of
-the tree, then {\tt PE(I)} is zero.  The value of {\tt NV(I)} is the
-number of entries in the corresponding column of $\m{L}$, including the
-diagonal.
-If {\tt NV(I)} is zero, then {\tt I} is a non-principal node that is
-not in the assembly tree.  Node {\tt -PE(I)} is the parent of node {\tt I}
-in a subtree, the root of which is a node in the assembly tree.  All nodes
-in one subtree belong to the same supernode in the assembly tree.
-The other size {\tt N} arrays
-({\tt DEGREE}, {\tt HEAD}, {\tt NEXT}, and {\tt W}) are used as workspace,
-and are not defined on input or output.
-
-If you want to use a simpler user-interface and compute the elimination
-tree post-ordering, you should be able to call the C routines {\tt amd\_order}
-or {\tt amd\_l\_order} from a Fortran program.   Just be sure to take into
-account the 0-based indexing in the {\tt P}, {\tt Ap}, and {\tt Ai} arguments
-to {\tt amd\_order} and {\tt amd\_l\_order}.  A sample interface is provided
-in the files {\tt AMD/Demo/amd\_f77cross.f} and
-{\tt AMD/Demo/amd\_f77wrapper.c}.  To compile the {\tt amd\_f77cross} program,
-type {\tt make cross} in the {\tt AMD/Demo} directory.  The
-Fortran-to-C calling conventions are highly non-portable, so this example
-is not guaranteed to work with your compiler C and Fortran compilers.
-The output of {\tt amd\_f77cross} is in {\tt amd\_f77cross.out}.
-
-%------------------------------------------------------------------------------
-\section{Sample Fortran main program}
-%------------------------------------------------------------------------------
-
-The following program illustrates the basic usage of the Fortran version of AMD.
-The {\tt AP} and {\tt AI} arrays represent the binary matrix
-\[
-\m{A} = \left[
-\begin{array}{rrrrr}
- 1 &  1 &  0 &  0 &  0 \\
- 1 &  1 &  1 &  0 &  1 \\
- 0 &  1 &  1 &  1 &  1 \\
- 0 &  0 &  1 &  1 &  0 \\
- 0 &  1 &  1 &  0 &  1 \\
-\end{array}
-\right]
-\]
-in a conventional 1-based column-oriented form,
-except that the diagonal entries are not present.
-The matrix has the same as nonzero pattern of $\m{A}+\m{A}\tr$ in the C
-program, in Section~\ref{Cversion}.
-The output permutation is $(4, 1, 3, 5, 2)$.
-It differs from the permutation returned by the C routine {\tt amd\_order}
-because a post-order of the elimination tree has not yet been performed.
-
-{\footnotesize
-\begin{verbatim}
-        INTEGER N, NZ, J, K, P, IWLEN, PFREE, NCMPA
-        PARAMETER (N = 5, NZ = 10, IWLEN = 17)
-        INTEGER AP (N+1), AI (NZ), LAST (N), PE (N), LEN (N), ELEN (N),
-     $      IW (IWLEN), DEGREE (N), NV (N), NEXT (N), HEAD (N), W (N)
-        DATA AP / 1, 2,     5,     8,  9,  11/
-        DATA AI / 2, 1,3,5, 2,4,5, 3,  2,3   /
-C       load the matrix into the AMD workspace
-        DO 10 J = 1,N
-            PE (J) = AP (J)
-            LEN (J) = AP (J+1) - AP (J)
-10      CONTINUE
-        DO 20 P = 1,NZ
-            IW (P) = AI (P)
-20      CONTINUE
-        PFREE = NZ + 1
-C       order the matrix (destroys the copy of A in IW, PE, and LEN)
-        CALL AMD (N, PE, IW, LEN, IWLEN, PFREE, NV, NEXT, LAST, HEAD,
-     $      ELEN, DEGREE, NCMPA, W)
-        DO 60 K = 1, N
-            PRINT 50, K, LAST (K)
-50          FORMAT ('P (',I2,') = ', I2)
-60      CONTINUE
-        END
-\end{verbatim}
-}
-
-The {\tt Demo} directory contains an example of how the C version
-may be called from a Fortran program, but this is highly non-portable.
-For this reason, it is placed in the {\tt Demo} directory, not in the
-primary {\tt Source} directory.
-
-%------------------------------------------------------------------------------
-\section{Installation}
-\label{Install}
-%------------------------------------------------------------------------------
-
-The following discussion assumes you have the {\tt make} program, either in
-Unix, or in Windows with Cygwin.
-
-System-dependent configurations are in the
-{\tt ../SuiteSparse\_config/SuiteSparse\_config.mk}
-file.  You can edit that file to customize the compilation.  The default
-settings will work on most systems.
-Sample configuration files are provided
-for 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}.
-Three demo programs of the AMD ordering routine will be compiled and tested in
-the {\tt AMD/Demo} directory.
-The outputs of these demo programs will then be compared with output
-files in the distribution.
-
-To compile and install the Fortran-callable AMD library,
-go to the {\tt AMD} directory and type {\tt make fortran}.
-The library will be placed in {\tt AMD/Lib/libamdf77.a}.
-A demo program will be compiled and tested in the {\tt AMD/Demo} directory.
-The output will be compared with an output file in the distribution.
-
-Typing {\tt make clean} will remove all but the final compiled libraries
-and demo programs.  Typing {\tt make purge} or {\tt make distclean}
-removes all files not in the original distribution.
-If you compile AMD and then later change the
-{\tt ../SuiteSparse\_config/SuiteSparse\_config.mk} file
-then you should type {\tt make purge} and then {\tt make} to recompile.
-
-When you compile your program that uses the C-callable AMD library,
-you need to add the {\tt AMD/Lib/libamd.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 AMD2 mexFunction in MATLAB, you can skip
-the use of the {\tt make} command entirely.  Simply type
-{\tt amd\_make} in MATLAB while in the {\tt AMD/MATLAB} directory.
-This works on any system with MATLAB, including Windows.
-Alternately, type {\tt make} in the {\tt AMD/MATLAB} directory,
-or just use the built-in {\tt amd} in MATLAB 7.3 or later.
-
-If you are including AMD as a subset of a larger library and do not want
-to link the C standard I/O library, or if you simply do not need to use
-them, you can safely remove the {\tt amd\_control.c} and {\tt amd\_info.c}
-files.  Similarly, if you use default parameters (or define your
-own {\tt Control} array), then you can exclude the {\tt amd\_defaults.c}
-file.
-Each of these files contains the user-callable routines of the same
-name.  None of these auxiliary routines are directly called by
-{\tt amd\_order}.
-The {\tt amd\_dump.c} file contains debugging routines
-that are neither used nor compiled unless debugging is enabled.
-The {\tt amd\_internal.h} file must be edited to enable debugging;
-refer to the instructions in that file.
-The bare minimum files required to use just {\tt amd\_order} are
-{\tt amd.h} and {\tt amd\_internal.h}
-in the {\tt Include} directory,
-and
-{\tt amd\_1.c},
-{\tt amd\_2.c},
-{\tt amd\_aat.c},
-{\tt amd\_global.c},
-{\tt and\_order.c},
-{\tt amd\_postorder.c},
-{\tt amd\_post\_tree.c},
-{\tt amd\_preprocess.c},
-and
-{\tt amd\_valid.c}
-in the {\tt Source} directory.
-
-%------------------------------------------------------------------------------
-\newpage
-\section{The AMD routines}
-\label{Primary}
-%------------------------------------------------------------------------------
-
-The file {\tt AMD/Include/amd.h} listed below
-describes each user-callable routine in the C version of AMD,
-and gives details on their use.
-
-{\footnotesize
-\input{amd_h.tex}
-}
-
-
-%------------------------------------------------------------------------------
-\newpage
-% References
-%------------------------------------------------------------------------------
-
-\bibliographystyle{plain}
-\bibliography{AMD_UserGuide}
-
-\end{document}
diff --git a/src/C/SuiteSparse/AMD/Doc/ChangeLog b/src/C/SuiteSparse/AMD/Doc/ChangeLog
deleted file mode 100644
index 89dd783..0000000
--- a/src/C/SuiteSparse/AMD/Doc/ChangeLog
+++ /dev/null
@@ -1,161 +0,0 @@
-Oct 10, 2014: version 2.4.1
-
-    modified MATLAB/amd_make.m.  No change to C code except version number.
-
-July 31, 2013: version 2.4.0
-
-    * changed malloc and printf pointers to use SuiteSparse_config
-
-Jun 20, 2012: verison 2.3.1
-
-    * minor update for Windows (removed filesep)
-
-Jun 1, 2012: version 2.3.0
-
-    * changed from UFconfig to SuiteSparse_config
-
-May 15, 2012: version 2.2.4
-
-    * minor fix to SIZE_T_MAX definition (finicky compiler workaround)
-
-Dec 7, 2011: version 2.2.3
-
-    * fixed the Makefile to better align with CFLAGS and other standards
-
-Jan 25, 2011: version 2.2.2
-
-    * minor fix to "make install"
-
-Nov 30, 2009: version 2.2.1
-
-    * added "make install" and "make uninstall"
-
-May 31, 2007: version 2.2.0
-
-    * port to 64-bit MATLAB
-
-    * Makefile moved from Source/ to Lib/
-
-    * minor changes to printing routines (amd_control.c, amd_info.c)
-
-Dec 12, 2006, version 2.0.4
-
-    * minor MATLAB code cleanup
-
-Nov 29, 2006, version 2.0.3
-
-    * changed MATLAB function name to amd2, so as not to conflict with
-	the now built-in version of AMD in MATLAB (which is the same thing
-	as the AMD here...).
-
-Sept 28, 2006, version 2.0.2
-
-    * #define SIZE_T_MAX not done if already defined (Mac OSX).
-
-Aug 31, 2006:
-
-    * trivial change to comments in amd.m
-
-Apr 30, 2006: AMD Version 2.0:
-
-    * long integer redefined as UF_long, controlled by UFconfig.h.
-
-    * amd_order no longer requires its input to have sorted columns.  It can
-	also tolerate duplicate entries in each column.  If these conditions
-	hold, but the matrix is otherwise valid, amd_order returns
-	AMD_OK_BUT_JUMBLED (a warning, not an error).
-
-    * amd_preprocess no longer deemed user-callable, since it is no longer
-	needed (it was used to ensure the input matrix had sorted columns with
-	no duplicate entries).  It still exists, with additional parameters,
-	and is called by amd_order if necessary.  amd_wpreprocess and
-	amd_preprocess_valid removed.  Fortran interface routine amdpreproc
-	removed.
-
-    * Integer overflow computations modified, to extend the size of problem
-	that the "int" version can solve when used in an LP64 compilation.
-
-    * amd_demo2.c simplified (it tests AMD with a jumbled matrix).
-
-    * amd_valid returned TRUE/FALSE in v1.2.  It now returns AMD_OK,
-	AMD_OK_BUT_JUMBLED, or AMD_INVALID.  Only in the latter case is the
-	matrix unsuitable as input to amd_order.
-
-    * amd_internal.h include file moved from AMD/Source to AMD/Include.
-
-Nov 15, 2005:
-
-    * minor editting of comments; version number (1.2) unchanged.
-
-Aug. 30, 2005: AMD Version 1.2
-
-    * AMD v1.2 is upward compatible with v1.1 and v1.0, except that v1.2 no
-	longer includes the compile-time redefinition of malloc and free.
-
-    * Makefile modified to use UFconfig.mk.  "Make" directory removed.
-
-    * License changed to GNU LGPL.
-
-    * Easier inclusion in C++ programs.
-
-    * option to allow compile-time redefinition of malloc and free
-	(added to v1.1) removed for v1.2.  Replaced with a run-time
-	redefinition.  AMD includes function pointers for malloc, free,
-	calloc, realloc, and printf, so that all those routines can be
-	redefined at compile time.  These function pointers are global
-	variables, and so are not technically thread-safe, unless you
-	use defaults and don't need to change them (the common case)
-	or if you change them in one thread before using them in other
-	threads.
-
-    * added #define'd version number
-
-    * minor modification to AMD_2 to ensure all lines can be tested, without
-	conditional compilation.
-
-    * moved the prototype for AMD_2 from amd_internal.h to amd.h
-
-    * moved the prototype for AMD_valid from amd_internal.h to amd.h
-
-    * MATLAB mexFunction uses libamd.a (compiled with cc) instead of compiling
-	each AMD source file with the mex command
-
-    * long demo (amd_l_demo.c) added.
-
-Jan. 21, 2004: AMD Version 1.1
-
-    * No bugs found or fixed - new features added, only
-    * amd_preprocess added, to allow for more general input of the matrix A.
-    * ME=0 added to amd*.f, unused DEXT variable removed from amdbar.f,
-	to avoid spurious compiler warnings (this was not a bug).
-    * amd_demo2.c and amd_demo2.out added, to test/demo amd_preprocess.
-    * option to allow compile-time redefinition of malloc, free, printf added
-    * amd_demo.c shortened slightly (removed printing of PAP')
-    * User Guide modified (more details added)
-    * linewidth reduced from 80 to 79 columns
-
-Oct. 7, 2003:  AMD version 1.0.1.
-
-    * MATLAB mexFunction modified, to remove call to mexCallMATLAB function.
-      This function can take a long time to call, particularly if you are
-      ordering many small matrices.
-
-May 6, 2003:  AMD Version 1.0 released.
-
-    * converted to C (compare amd.f and amdbar.f with amd_2.c)
-    * dense rows/column removed prior to ordering
-    * elimination tree post-ordering added
-    * demos, user guide written
-    * statistics added (nz in L, flop count, symmetry of A)
-    * computes the pattern of A+A' if A is unsymmetric
-    * user's input matrix no longer overwritten
-    * degree lists initialized differently
-    * IOVFLO argument removed from Fortran versions (amd.f and amdbar.f)
-    * parameters added (dense row/column detection, aggressive absorption)
-    * MATLAB mexFunction added
-
-Jan, 1996:
-
-    * amdbar.f posted at http://www.netlib.org (with a restricted License)
-    * amd.f appears as MC47B/BD in the Harwell Subroutine Library
-	(without the IOVFLO argument)
diff --git a/src/C/SuiteSparse/AMD/Doc/License.txt b/src/C/SuiteSparse/AMD/Doc/License.txt
deleted file mode 100644
index 05f154c..0000000
--- a/src/C/SuiteSparse/AMD/Doc/License.txt
+++ /dev/null
@@ -1,91 +0,0 @@
-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 <YOUR APPLICATION> 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 <YOUR APPLICATION> 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 <YOUR APPLICATION> under the LGPL v2.1 license.
-
-In the event that your package <A> includes another package <B> by another
-author, and <A> and <B> 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/src/C/SuiteSparse/AMD/Doc/Makefile b/src/C/SuiteSparse/AMD/Doc/Makefile
deleted file mode 100644
index 0fea143..0000000
--- a/src/C/SuiteSparse/AMD/Doc/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-#------------------------------------------------------------------------------
-# AMD Makefile for compiling on Unix systems (for GNU or original make)
-#------------------------------------------------------------------------------
-
-default: dist
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-#------------------------------------------------------------------------------
-# Remove all but the files in the original distribution
-#------------------------------------------------------------------------------
-
-clean:
-	- $(RM) $(CLEAN)
-
-purge: distclean
-
-distclean: clean
-	- $(RM) *.aux *.bbl *.blg *.log *.toc
-
-#------------------------------------------------------------------------------
-# Create the User Guide and Quick Start Guide
-#------------------------------------------------------------------------------
-
-AMD_UserGuide.pdf: AMD_UserGuide.tex AMD_UserGuide.bib ../Include/amd.h
-	echo '\\begin{verbatim}' > amd_h.tex
-	expand -8 ../Include/amd.h >> amd_h.tex
-	echo '\end{verbatim}' >> amd_h.tex
-	pdflatex AMD_UserGuide
-	bibtex AMD_UserGuide
-	pdflatex AMD_UserGuide
-	pdflatex AMD_UserGuide
-
-dist:  AMD_UserGuide.pdf
-	- $(RM) *.aux *.bbl *.blg *.log *.toc amd_h.tex
-
diff --git a/src/C/SuiteSparse/AMD/Doc/lesser.txt b/src/C/SuiteSparse/AMD/Doc/lesser.txt
deleted file mode 100644
index 8add30a..0000000
--- a/src/C/SuiteSparse/AMD/Doc/lesser.txt
+++ /dev/null
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-

-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-

-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-

-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-

-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-

-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-

-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-

-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-

-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/src/C/SuiteSparse/AMD/Include/amd.h b/src/C/SuiteSparse/AMD/Include/amd.h
deleted file mode 100644
index c80de1a..0000000
--- a/src/C/SuiteSparse/AMD/Include/amd.h
+++ /dev/null
@@ -1,400 +0,0 @@
-/* ========================================================================= */
-/* === AMD:  approximate minimum degree ordering =========================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD Version 2.4, Copyright (c) 1996-2013 by Timothy A. Davis,             */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* AMD finds a symmetric ordering P of a matrix A so that the Cholesky
- * factorization of P*A*P' has fewer nonzeros and takes less work than the
- * Cholesky factorization of A.  If A is not symmetric, then it performs its
- * ordering on the matrix A+A'.  Two sets of user-callable routines are
- * provided, one for int integers and the other for SuiteSparse_long integers.
- *
- * The method is based on the approximate minimum degree algorithm, discussed
- * in Amestoy, Davis, and Duff, "An approximate degree ordering algorithm",
- * SIAM Journal of Matrix Analysis and Applications, vol. 17, no. 4, pp.
- * 886-905, 1996.  This package can perform both the AMD ordering (with
- * aggressive absorption), and the AMDBAR ordering (without aggressive
- * absorption) discussed in the above paper.  This package differs from the
- * Fortran codes discussed in the paper:
- *
- *       (1) it can ignore "dense" rows and columns, leading to faster run times
- *       (2) it computes the ordering of A+A' if A is not symmetric
- *       (3) it is followed by a depth-first post-ordering of the assembly tree
- *           (or supernodal elimination tree)
- *
- * For historical reasons, the Fortran versions, amd.f and amdbar.f, have
- * been left (nearly) unchanged.  They compute the identical ordering as
- * described in the above paper.
- */
-
-#ifndef AMD_H
-#define AMD_H
-
-/* make it easy for C++ programs to include AMD */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* get the definition of size_t: */
-#include <stddef.h>
-
-#include "SuiteSparse_config.h"
-
-int amd_order                  /* returns AMD_OK, AMD_OK_BUT_JUMBLED,
-                                * AMD_INVALID, or AMD_OUT_OF_MEMORY */
-(
-    int n,                     /* A is n-by-n.  n must be >= 0. */
-    const int Ap [ ],          /* column pointers for A, of size n+1 */
-    const int Ai [ ],          /* row indices of A, of size nz = Ap [n] */
-    int P [ ],                 /* output permutation, of size n */
-    double Control [ ],        /* input Control settings, of size AMD_CONTROL */
-    double Info [ ]            /* output Info statistics, of size AMD_INFO */
-) ;
-
-SuiteSparse_long amd_l_order    /* see above for description of arguments */
-(
-    SuiteSparse_long n,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    SuiteSparse_long P [ ],
-    double Control [ ],
-    double Info [ ]
-) ;
-
-/* Input arguments (not modified):
- *
- *       n: the matrix A is n-by-n.
- *       Ap: an int/SuiteSparse_long array of size n+1, containing column
- *              pointers of A.
- *       Ai: an int/SuiteSparse_long array of size nz, containing the row
- *              indices of A, where nz = Ap [n].
- *       Control:  a double array of size AMD_CONTROL, containing control
- *           parameters.  Defaults are used if Control is NULL.
- *
- * Output arguments (not defined on input):
- *
- *       P: an int/SuiteSparse_long array of size n, containing the output
- *           permutation. If row i is the kth pivot row, then P [k] = i.  In
- *           MATLAB notation, the reordered matrix is A (P,P).
- *       Info: a double array of size AMD_INFO, containing statistical
- *           information.  Ignored if Info is NULL.
- *
- * On input, the matrix A is stored in column-oriented form.  The row indices
- * of nonzero entries in column j are stored in Ai [Ap [j] ... Ap [j+1]-1].
- *
- * If the row indices appear in ascending order in each column, and there
- * are no duplicate entries, then amd_order is slightly more efficient in
- * terms of time and memory usage.  If this condition does not hold, a copy
- * of the matrix is created (where these conditions do hold), and the copy is
- * ordered.  This feature is new to v2.0 (v1.2 and earlier required this
- * condition to hold for the input matrix).
- * 
- * Row indices must be in the range 0 to
- * n-1.  Ap [0] must be zero, and thus nz = Ap [n] is the number of nonzeros
- * in A.  The array Ap is of size n+1, and the array Ai is of size nz = Ap [n].
- * The matrix does not need to be symmetric, and the diagonal does not need to
- * be present (if diagonal entries are present, they are ignored except for
- * the output statistic Info [AMD_NZDIAG]).  The arrays Ai and Ap are not
- * modified.  This form of the Ap and Ai arrays to represent the nonzero
- * pattern of the matrix A is the same as that used internally by MATLAB.
- * If you wish to use a more flexible input structure, please see the
- * umfpack_*_triplet_to_col routines in the UMFPACK package, at
- * http://www.suitesparse.com.
- *
- * Restrictions:  n >= 0.  Ap [0] = 0.  Ap [j] <= Ap [j+1] for all j in the
- *       range 0 to n-1.  nz = Ap [n] >= 0.  Ai [0..nz-1] must be in the range 0
- *       to n-1.  Finally, Ai, Ap, and P must not be NULL.  If any of these
- *       restrictions are not met, AMD returns AMD_INVALID.
- *
- * AMD returns:
- *
- *       AMD_OK if the matrix is valid and sufficient memory can be allocated to
- *           perform the ordering.
- *
- *       AMD_OUT_OF_MEMORY if not enough memory can be allocated.
- *
- *       AMD_INVALID if the input arguments n, Ap, Ai are invalid, or if P is
- *           NULL.
- *
- *       AMD_OK_BUT_JUMBLED if the matrix had unsorted columns, and/or duplicate
- *           entries, but was otherwise valid.
- *
- * The AMD routine first forms the pattern of the matrix A+A', and then
- * computes a fill-reducing ordering, P.  If P [k] = i, then row/column i of
- * the original is the kth pivotal row.  In MATLAB notation, the permuted
- * matrix is A (P,P), except that 0-based indexing is used instead of the
- * 1-based indexing in MATLAB.
- *
- * The Control array is used to set various parameters for AMD.  If a NULL
- * pointer is passed, default values are used.  The Control array is not
- * modified.
- *
- *       Control [AMD_DENSE]:  controls the threshold for "dense" rows/columns.
- *           A dense row/column in A+A' can cause AMD to spend a lot of time in
- *           ordering the matrix.  If Control [AMD_DENSE] >= 0, rows/columns
- *           with more than Control [AMD_DENSE] * sqrt (n) entries are ignored
- *           during the ordering, and placed last in the output order.  The
- *           default value of Control [AMD_DENSE] is 10.  If negative, no
- *           rows/columns are treated as "dense".  Rows/columns with 16 or
- *           fewer off-diagonal entries are never considered "dense".
- *
- *       Control [AMD_AGGRESSIVE]: controls whether or not to use aggressive
- *           absorption, in which a prior element is absorbed into the current
- *           element if is a subset of the current element, even if it is not
- *           adjacent to the current pivot element (refer to Amestoy, Davis,
- *           & Duff, 1996, for more details).  The default value is nonzero,
- *           which means to perform aggressive absorption.  This nearly always
- *           leads to a better ordering (because the approximate degrees are
- *           more accurate) and a lower execution time.  There are cases where
- *           it can lead to a slightly worse ordering, however.  To turn it off,
- *           set Control [AMD_AGGRESSIVE] to 0.
- *
- *       Control [2..4] are not used in the current version, but may be used in
- *           future versions.
- *
- * The Info array provides statistics about the ordering on output.  If it is
- * not present, the statistics are not returned.  This is not an error
- * condition.
- * 
- *       Info [AMD_STATUS]:  the return value of AMD, either AMD_OK,
- *           AMD_OK_BUT_JUMBLED, AMD_OUT_OF_MEMORY, or AMD_INVALID.
- *
- *       Info [AMD_N]: n, the size of the input matrix
- *
- *       Info [AMD_NZ]: the number of nonzeros in A, nz = Ap [n]
- *
- *       Info [AMD_SYMMETRY]:  the symmetry of the matrix A.  It is the number
- *           of "matched" off-diagonal entries divided by the total number of
- *           off-diagonal entries.  An entry A(i,j) is matched if A(j,i) is also
- *           an entry, for any pair (i,j) for which i != j.  In MATLAB notation,
- *                S = spones (A) ;
- *                B = tril (S, -1) + triu (S, 1) ;
- *                symmetry = nnz (B & B') / nnz (B) ;
- *
- *       Info [AMD_NZDIAG]: the number of entries on the diagonal of A.
- *
- *       Info [AMD_NZ_A_PLUS_AT]:  the number of nonzeros in A+A', excluding the
- *           diagonal.  If A is perfectly symmetric (Info [AMD_SYMMETRY] = 1)
- *           with a fully nonzero diagonal, then Info [AMD_NZ_A_PLUS_AT] = nz-n
- *           (the smallest possible value).  If A is perfectly unsymmetric
- *           (Info [AMD_SYMMETRY] = 0, for an upper triangular matrix, for
- *           example) with no diagonal, then Info [AMD_NZ_A_PLUS_AT] = 2*nz
- *           (the largest possible value).
- *
- *       Info [AMD_NDENSE]: the number of "dense" rows/columns of A+A' that were
- *           removed from A prior to ordering.  These are placed last in the
- *           output order P.
- *
- *       Info [AMD_MEMORY]: the amount of memory used by AMD, in bytes.  In the
- *           current version, this is 1.2 * Info  [AMD_NZ_A_PLUS_AT] + 9*n
- *           times the size of an integer.  This is at most 2.4nz + 9n.  This
- *           excludes the size of the input arguments Ai, Ap, and P, which have
- *           a total size of nz + 2*n + 1 integers.
- *
- *       Info [AMD_NCMPA]: the number of garbage collections performed.
- *
- *       Info [AMD_LNZ]: the number of nonzeros in L (excluding the diagonal).
- *           This is a slight upper bound because mass elimination is combined
- *           with the approximate degree update.  It is a rough upper bound if
- *           there are many "dense" rows/columns.  The rest of the statistics,
- *           below, are also slight or rough upper bounds, for the same reasons.
- *           The post-ordering of the assembly tree might also not exactly
- *           correspond to a true elimination tree postordering.
- *
- *       Info [AMD_NDIV]: the number of divide operations for a subsequent LDL'
- *           or LU factorization of the permuted matrix A (P,P).
- *
- *       Info [AMD_NMULTSUBS_LDL]:  the number of multiply-subtract pairs for a
- *           subsequent LDL' factorization of A (P,P).
- *
- *       Info [AMD_NMULTSUBS_LU]:  the number of multiply-subtract pairs for a
- *           subsequent LU factorization of A (P,P), assuming that no numerical
- *           pivoting is required.
- *
- *       Info [AMD_DMAX]:  the maximum number of nonzeros in any column of L,
- *           including the diagonal.
- *
- *       Info [14..19] are not used in the current version, but may be used in
- *           future versions.
- */    
-
-/* ------------------------------------------------------------------------- */
-/* direct interface to AMD */
-/* ------------------------------------------------------------------------- */
-
-/* amd_2 is the primary AMD ordering routine.  It is not meant to be
- * user-callable because of its restrictive inputs and because it destroys
- * the user's input matrix.  It does not check its inputs for errors, either.
- * However, if you can work with these restrictions it can be faster than
- * amd_order and use less memory (assuming that you can create your own copy
- * of the matrix for AMD to destroy).  Refer to AMD/Source/amd_2.c for a
- * description of each parameter. */
-
-void amd_2
-(
-    int n,
-    int Pe [ ],
-    int Iw [ ],
-    int Len [ ],
-    int iwlen,
-    int pfree,
-    int Nv [ ],
-    int Next [ ], 
-    int Last [ ],
-    int Head [ ],
-    int Elen [ ],
-    int Degree [ ],
-    int W [ ],
-    double Control [ ],
-    double Info [ ]
-) ;
-
-void amd_l2
-(
-    SuiteSparse_long n,
-    SuiteSparse_long Pe [ ],
-    SuiteSparse_long Iw [ ],
-    SuiteSparse_long Len [ ],
-    SuiteSparse_long iwlen,
-    SuiteSparse_long pfree,
-    SuiteSparse_long Nv [ ],
-    SuiteSparse_long Next [ ], 
-    SuiteSparse_long Last [ ],
-    SuiteSparse_long Head [ ],
-    SuiteSparse_long Elen [ ],
-    SuiteSparse_long Degree [ ],
-    SuiteSparse_long W [ ],
-    double Control [ ],
-    double Info [ ]
-) ;
-
-/* ------------------------------------------------------------------------- */
-/* amd_valid */
-/* ------------------------------------------------------------------------- */
-
-/* Returns AMD_OK or AMD_OK_BUT_JUMBLED if the matrix is valid as input to
- * amd_order; the latter is returned if the matrix has unsorted and/or
- * duplicate row indices in one or more columns.  Returns AMD_INVALID if the
- * matrix cannot be passed to amd_order.  For amd_order, the matrix must also
- * be square.  The first two arguments are the number of rows and the number
- * of columns of the matrix.  For its use in AMD, these must both equal n.
- *
- * NOTE: this routine returned TRUE/FALSE in v1.2 and earlier.
- */
-
-int amd_valid
-(
-    int n_row,                 /* # of rows */
-    int n_col,                 /* # of columns */
-    const int Ap [ ],          /* column pointers, of size n_col+1 */
-    const int Ai [ ]           /* row indices, of size Ap [n_col] */
-) ;
-
-SuiteSparse_long amd_l_valid
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ]
-) ;
-
-/* ------------------------------------------------------------------------- */
-/* AMD memory manager and printf routines */
-/* ------------------------------------------------------------------------- */
-
-    /* moved to SuiteSparse_config.c */
-
-/* ------------------------------------------------------------------------- */
-/* AMD Control and Info arrays */
-/* ------------------------------------------------------------------------- */
-
-/* amd_defaults:  sets the default control settings */
-void amd_defaults   (double Control [ ]) ;
-void amd_l_defaults (double Control [ ]) ;
-
-/* amd_control: prints the control settings */
-void amd_control    (double Control [ ]) ;
-void amd_l_control  (double Control [ ]) ;
-
-/* amd_info: prints the statistics */
-void amd_info       (double Info [ ]) ;
-void amd_l_info     (double Info [ ]) ;
-
-#define AMD_CONTROL 5          /* size of Control array */
-#define AMD_INFO 20            /* size of Info array */
-
-/* contents of Control */
-#define AMD_DENSE 0            /* "dense" if degree > Control [0] * sqrt (n) */
-#define AMD_AGGRESSIVE 1    /* do aggressive absorption if Control [1] != 0 */
-
-/* default Control settings */
-#define AMD_DEFAULT_DENSE 10.0          /* default "dense" degree 10*sqrt(n) */
-#define AMD_DEFAULT_AGGRESSIVE 1    /* do aggressive absorption by default */
-
-/* contents of Info */
-#define AMD_STATUS 0           /* return value of amd_order and amd_l_order */
-#define AMD_N 1                /* A is n-by-n */
-#define AMD_NZ 2      /* number of nonzeros in A */ 
-#define AMD_SYMMETRY 3         /* symmetry of pattern (1 is sym., 0 is unsym.) */
-#define AMD_NZDIAG 4           /* # of entries on diagonal */
-#define AMD_NZ_A_PLUS_AT 5  /* nz in A+A' */
-#define AMD_NDENSE 6           /* number of "dense" rows/columns in A */
-#define AMD_MEMORY 7           /* amount of memory used by AMD */
-#define AMD_NCMPA 8            /* number of garbage collections in AMD */
-#define AMD_LNZ 9     /* approx. nz in L, excluding the diagonal */
-#define AMD_NDIV 10            /* number of fl. point divides for LU and LDL' */
-#define AMD_NMULTSUBS_LDL 11 /* number of fl. point (*,-) pairs for LDL' */
-#define AMD_NMULTSUBS_LU 12  /* number of fl. point (*,-) pairs for LU */
-#define AMD_DMAX 13             /* max nz. in any column of L, incl. diagonal */
-
-/* ------------------------------------------------------------------------- */
-/* return values of AMD */
-/* ------------------------------------------------------------------------- */
-
-#define AMD_OK 0           /* success */
-#define AMD_OUT_OF_MEMORY -1        /* malloc failed, or problem too large */
-#define AMD_INVALID -2              /* input arguments are not valid */
-#define AMD_OK_BUT_JUMBLED 1        /* input matrix is OK for amd_order, but
-    * columns were not sorted, and/or duplicate entries were present.  AMD had
-    * to do extra work before ordering the matrix.  This is a warning, not an
-    * error.  */
-
-/* ========================================================================== */
-/* === AMD version ========================================================== */
-/* ========================================================================== */
-
-/* AMD Version 1.2 and later include the following definitions.
- * As an example, to test if the version you are using is 1.2 or later:
- *
- * #ifdef AMD_VERSION
- *       if (AMD_VERSION >= AMD_VERSION_CODE (1,2)) ...
- * #endif
- *
- * This also works during compile-time:
- *
- *       #if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE (1,2))
- *           printf ("This is version 1.2 or later\n") ;
- *       #else
- *           printf ("This is an early version\n") ;
- *       #endif
- *
- * Versions 1.1 and earlier of AMD do not include a #define'd version number.
- */
-
-#define AMD_DATE "Oct 10, 2014"
-#define AMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub))
-#define AMD_MAIN_VERSION 2
-#define AMD_SUB_VERSION 4
-#define AMD_SUBSUB_VERSION 1
-#define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION,AMD_SUB_VERSION)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/C/SuiteSparse/AMD/Include/amd_internal.h b/src/C/SuiteSparse/AMD/Include/amd_internal.h
deleted file mode 100644
index 6730527..0000000
--- a/src/C/SuiteSparse/AMD/Include/amd_internal.h
+++ /dev/null
@@ -1,326 +0,0 @@
-/* ========================================================================= */
-/* === amd_internal.h ====================================================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,                                      */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* This file is for internal use in AMD itself, and does not normally need to
- * be included in user code (it is included in UMFPACK, however).   All others
- * should use amd.h instead.
- */
-
-/* ========================================================================= */
-/* === NDEBUG ============================================================== */
-/* ========================================================================= */
-
-/*
- * Turning on debugging takes some work (see below).   If you do not edit this
- * file, then debugging is always turned off, regardless of whether or not
- * -DNDEBUG is specified in your compiler options.
- *
- * If AMD is being compiled as a mexFunction, then MATLAB_MEX_FILE is defined,
- * and mxAssert is used instead of assert.  If debugging is not enabled, no
- * MATLAB include files or functions are used.  Thus, the AMD library libamd.a
- * can be safely used in either a stand-alone C program or in another
- * mexFunction, without any change.
- */
-
-/*
-    AMD will be exceedingly slow when running in debug mode.  The next three
-    lines ensure that debugging is turned off.
-*/
-#ifndef NDEBUG
-#define NDEBUG
-#endif
-
-/*
-    To enable debugging, uncomment the following line:
-#undef NDEBUG
-*/
-
-/* ------------------------------------------------------------------------- */
-/* ANSI include files */
-/* ------------------------------------------------------------------------- */
-
-/* from stdlib.h:  size_t, malloc, free, realloc, and calloc */
-#include <stdlib.h>
-
-#if !defined(NPRINT) || !defined(NDEBUG)
-/* from stdio.h:  printf.  Not included if NPRINT is defined at compile time.
- * fopen and fscanf are used when debugging. */
-#include <stdio.h>
-#endif
-
-/* from limits.h:  INT_MAX and LONG_MAX */
-#include <limits.h>
-
-/* from math.h: sqrt */
-#include <math.h>
-
-/* ------------------------------------------------------------------------- */
-/* MATLAB include files (only if being used in or via MATLAB) */
-/* ------------------------------------------------------------------------- */
-
-#ifdef MATLAB_MEX_FILE
-#include "matrix.h"
-#include "mex.h"
-#endif
-
-/* ------------------------------------------------------------------------- */
-/* basic definitions */
-/* ------------------------------------------------------------------------- */
-
-#ifdef FLIP
-#undef FLIP
-#endif
-
-#ifdef MAX
-#undef MAX
-#endif
-
-#ifdef MIN
-#undef MIN
-#endif
-
-#ifdef EMPTY
-#undef EMPTY
-#endif
-
-#ifdef GLOBAL
-#undef GLOBAL
-#endif
-
-#ifdef PRIVATE
-#undef PRIVATE
-#endif
-
-/* FLIP is a "negation about -1", and is used to mark an integer i that is
- * normally non-negative.  FLIP (EMPTY) is EMPTY.  FLIP of a number > EMPTY
- * is negative, and FLIP of a number < EMTPY is positive.  FLIP (FLIP (i)) = i
- * for all integers i.  UNFLIP (i) is >= EMPTY. */
-#define EMPTY (-1)
-#define FLIP(i) (-(i)-2)
-#define UNFLIP(i) ((i < EMPTY) ? FLIP (i) : (i))
-
-/* for integer MAX/MIN, or for doubles when we don't care how NaN's behave: */
-#define MAX(a,b) (((a) > (b)) ? (a) : (b))
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-
-/* logical expression of p implies q: */
-#define IMPLIES(p,q) (!(p) || (q))
-
-/* Note that the IBM RS 6000 xlc predefines TRUE and FALSE in <types.h>. */
-/* The Compaq Alpha also predefines TRUE and FALSE. */
-#ifdef TRUE
-#undef TRUE
-#endif
-#ifdef FALSE
-#undef FALSE
-#endif
-
-#define TRUE (1)
-#define FALSE (0)
-#define PRIVATE static
-#define GLOBAL
-#define EMPTY (-1)
-
-/* Note that Linux's gcc 2.96 defines NULL as ((void *) 0), but other */
-/* compilers (even gcc 2.95.2 on Solaris) define NULL as 0 or (0).  We */
-/* need to use the ANSI standard value of 0. */
-#ifdef NULL
-#undef NULL
-#endif
-
-#define NULL 0
-
-/* largest value of size_t */
-#ifndef SIZE_T_MAX
-#ifdef SIZE_MAX
-/* C99 only */
-#define SIZE_T_MAX SIZE_MAX
-#else
-#define SIZE_T_MAX ((size_t) (-1))
-#endif
-#endif
-
-/* ------------------------------------------------------------------------- */
-/* integer type for AMD: int or SuiteSparse_long */
-/* ------------------------------------------------------------------------- */
-
-#include "amd.h"
-
-#if defined (DLONG) || defined (ZLONG)
-
-#define Int SuiteSparse_long
-#define ID  SuiteSparse_long_id
-#define Int_MAX SuiteSparse_long_max
-
-#define AMD_order amd_l_order
-#define AMD_defaults amd_l_defaults
-#define AMD_control amd_l_control
-#define AMD_info amd_l_info
-#define AMD_1 amd_l1
-#define AMD_2 amd_l2
-#define AMD_valid amd_l_valid
-#define AMD_aat amd_l_aat
-#define AMD_postorder amd_l_postorder
-#define AMD_post_tree amd_l_post_tree
-#define AMD_dump amd_l_dump
-#define AMD_debug amd_l_debug
-#define AMD_debug_init amd_l_debug_init
-#define AMD_preprocess amd_l_preprocess
-
-#else
-
-#define Int int
-#define ID "%d"
-#define Int_MAX INT_MAX
-
-#define AMD_order amd_order
-#define AMD_defaults amd_defaults
-#define AMD_control amd_control
-#define AMD_info amd_info
-#define AMD_1 amd_1
-#define AMD_2 amd_2
-#define AMD_valid amd_valid
-#define AMD_aat amd_aat
-#define AMD_postorder amd_postorder
-#define AMD_post_tree amd_post_tree
-#define AMD_dump amd_dump
-#define AMD_debug amd_debug
-#define AMD_debug_init amd_debug_init
-#define AMD_preprocess amd_preprocess
-
-#endif
-
-/* ------------------------------------------------------------------------- */
-/* AMD routine definitions (not user-callable) */
-/* ------------------------------------------------------------------------- */
-
-GLOBAL size_t AMD_aat
-(
-    Int n,
-    const Int Ap [ ],
-    const Int Ai [ ],
-    Int Len [ ],
-    Int Tp [ ],
-    double Info [ ]
-) ;
-
-GLOBAL void AMD_1
-(
-    Int n,
-    const Int Ap [ ],
-    const Int Ai [ ],
-    Int P [ ],
-    Int Pinv [ ],
-    Int Len [ ],
-    Int slen,
-    Int S [ ],
-    double Control [ ],
-    double Info [ ]
-) ;
-
-GLOBAL void AMD_postorder
-(
-    Int nn,
-    Int Parent [ ],
-    Int Npiv [ ],
-    Int Fsize [ ],
-    Int Order [ ],
-    Int Child [ ],
-    Int Sibling [ ],
-    Int Stack [ ]
-) ;
-
-GLOBAL Int AMD_post_tree
-(
-    Int root,
-    Int k,
-    Int Child [ ],
-    const Int Sibling [ ],
-    Int Order [ ],
-    Int Stack [ ]
-#ifndef NDEBUG
-    , Int nn
-#endif
-) ;
-
-GLOBAL void AMD_preprocess
-(
-    Int n,
-    const Int Ap [ ],
-    const Int Ai [ ],
-    Int Rp [ ],
-    Int Ri [ ],
-    Int W [ ],
-    Int Flag [ ]
-) ;
-
-/* ------------------------------------------------------------------------- */
-/* debugging definitions */
-/* ------------------------------------------------------------------------- */
-
-#ifndef NDEBUG
-
-/* from assert.h:  assert macro */
-#include <assert.h>
-
-#ifndef EXTERN
-#define EXTERN extern
-#endif
-
-EXTERN Int AMD_debug ;
-
-GLOBAL void AMD_debug_init ( char *s ) ;
-
-GLOBAL void AMD_dump
-(
-    Int n,
-    Int Pe [ ],
-    Int Iw [ ],
-    Int Len [ ],
-    Int iwlen,
-    Int pfree,
-    Int Nv [ ],
-    Int Next [ ],
-    Int Last [ ],
-    Int Head [ ],
-    Int Elen [ ],
-    Int Degree [ ],
-    Int W [ ],
-    Int nel
-) ;
-
-#ifdef ASSERT
-#undef ASSERT
-#endif
-
-/* Use mxAssert if AMD is compiled into a mexFunction */
-#ifdef MATLAB_MEX_FILE
-#define ASSERT(expression) (mxAssert ((expression), ""))
-#else
-#define ASSERT(expression) (assert (expression))
-#endif
-
-#define AMD_DEBUG0(params) { SUITESPARSE_PRINTF (params) ; }
-#define AMD_DEBUG1(params) { if (AMD_debug >= 1) SUITESPARSE_PRINTF (params) ; }
-#define AMD_DEBUG2(params) { if (AMD_debug >= 2) SUITESPARSE_PRINTF (params) ; }
-#define AMD_DEBUG3(params) { if (AMD_debug >= 3) SUITESPARSE_PRINTF (params) ; }
-#define AMD_DEBUG4(params) { if (AMD_debug >= 4) SUITESPARSE_PRINTF (params) ; }
-
-#else
-
-/* no debugging */
-#define ASSERT(expression)
-#define AMD_DEBUG0(params)
-#define AMD_DEBUG1(params)
-#define AMD_DEBUG2(params)
-#define AMD_DEBUG3(params)
-#define AMD_DEBUG4(params)
-
-#endif
diff --git a/src/C/SuiteSparse/AMD/Lib/GNUmakefile b/src/C/SuiteSparse/AMD/Lib/GNUmakefile
deleted file mode 100644
index 8e6d899..0000000
--- a/src/C/SuiteSparse/AMD/Lib/GNUmakefile
+++ /dev/null
@@ -1,75 +0,0 @@
-#-------------------------------------------------------------------------------
-# AMD Makefile for compiling on Unix systems (for GNU make only)
-#-------------------------------------------------------------------------------
-
-default: libamd.a
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-C = $(CC) $(CF) -I../Include -I../../SuiteSparse_config
-
-#-------------------------------------------------------------------------------
-# 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
-
-CONFIG = ../../SuiteSparse_config/SuiteSparse_config.h
-
-INC = ../Include/amd.h ../Include/amd_internal.h $(CONFIG)
-
-#-------------------------------------------------------------------------------
-# 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: ../Source/amd_%.c $(INC)
-	$(C) -DDINT -c $< -o $@
-
-amd_l_%.o: ../Source/amd_%.c $(INC)
-	$(C) -DDLONG -c $< -o $@
-
-#-------------------------------------------------------------------------------
-# Create the libamd.a library (C versions only)
-#-------------------------------------------------------------------------------
-
-libamd.a: $(AMDI) $(AMDL)
-	$(ARCHIVE) libamd.a $^
-	- $(RANLIB) libamd.a
-
-#-------------------------------------------------------------------------------
-# compile the Fortran versions and the libamdf77.a library
-#-------------------------------------------------------------------------------
-
-fortran: libamdf77.a
-
-AMDF77 = amd.o amdbar.o
-
-amd.o: ../Source/amd.f
-	$(F77) $(F77FLAGS) -c ../Source/amd.f -o amd.o
-
-amdbar.o: ../Source/amdbar.f
-	$(F77) $(F77FLAGS) -c ../Source/amdbar.f -o amdbar.o
-
-libamdf77.a: $(AMDF77)
-	$(ARCHIVE) libamdf77.a $^
-	- $(RANLIB) libamdf77.a
-
-#-------------------------------------------------------------------------------
-# Remove all but the files in the original distribution
-#-------------------------------------------------------------------------------
-
-clean:
-	- $(RM) $(CLEAN)
-
-purge: distclean
-
-distclean: clean
-	- $(RM) libamd.a libamdf77.a
diff --git a/src/C/SuiteSparse/AMD/Lib/Makefile b/src/C/SuiteSparse/AMD/Lib/Makefile
deleted file mode 100644
index ac3424e..0000000
--- a/src/C/SuiteSparse/AMD/Lib/Makefile
+++ /dev/null
@@ -1,69 +0,0 @@
-#-------------------------------------------------------------------------------
-# 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.
-
-default: everything
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-C = $(CC) $(CF) -I../Include -I../../SuiteSparse_config
-
-everything:
-	$(C) -DDINT -c ../Source/amd_aat.c -o amd_i_aat.o
-	$(C) -DDINT -c ../Source/amd_1.c -o amd_i_1.o
-	$(C) -DDINT -c ../Source/amd_2.c -o amd_i_2.o
-	$(C) -DDINT -c ../Source/amd_dump.c -o amd_i_dump.o
-	$(C) -DDINT -c ../Source/amd_postorder.c -o amd_i_postorder.o
-	$(C) -DDINT -c ../Source/amd_post_tree.c -o amd_i_post_tree.o
-	$(C) -DDINT -c ../Source/amd_defaults.c -o amd_i_defaults.o
-	$(C) -DDINT -c ../Source/amd_order.c -o amd_i_order.o
-	$(C) -DDINT -c ../Source/amd_control.c -o amd_i_control.o
-	$(C) -DDINT -c ../Source/amd_info.c -o amd_i_info.o
-	$(C) -DDINT -c ../Source/amd_valid.c -o amd_i_valid.o
-	$(C) -DDINT -c ../Source/amd_preprocess.c -o amd_i_preprocess.o
-	$(C) -DDLONG -c ../Source/amd_aat.c -o amd_l_aat.o
-	$(C) -DDLONG -c ../Source/amd_1.c -o amd_l_1.o
-	$(C) -DDLONG -c ../Source/amd_2.c -o amd_l_2.o
-	$(C) -DDLONG -c ../Source/amd_dump.c -o amd_l_dump.o
-	$(C) -DDLONG -c ../Source/amd_postorder.c -o amd_l_postorder.o
-	$(C) -DDLONG -c ../Source/amd_post_tree.c -o amd_l_post_tree.o
-	$(C) -DDLONG -c ../Source/amd_defaults.c -o amd_l_defaults.o
-	$(C) -DDLONG -c ../Source/amd_order.c -o amd_l_order.o
-	$(C) -DDLONG -c ../Source/amd_control.c -o amd_l_control.o
-	$(C) -DDLONG -c ../Source/amd_info.c -o amd_l_info.o
-	$(C) -DDLONG -c ../Source/amd_valid.c -o amd_l_valid.o
-	$(C) -DDLONG -c ../Source/amd_preprocess.c -o amd_l_preprocess.o
-	$(ARCHIVE)  ../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 ../Source/amd.f -o amd.o
-	$(F77) $(F77FLAGS) -c ../Source/amdbar.f -o amdbar.o
-	$(ARCHIVE)  ../Lib/libamdf77.a amd.o amdbar.o
-	- $(RANLIB) ../Lib/libamdf77.a
-
-#-------------------------------------------------------------------------------
-# Remove all but the files in the original distribution
-#-------------------------------------------------------------------------------
-
-clean:
-	- $(RM) $(CLEAN)
-
-purge: distclean
-
-distclean: clean
-	- $(RM) ../Lib/libamd.a ../Lib/libamdf77.a
diff --git a/src/C/SuiteSparse/AMD/Lib/libamd.def b/src/C/SuiteSparse/AMD/Lib/libamd.def
deleted file mode 100644
index 8ed43fc..0000000
--- a/src/C/SuiteSparse/AMD/Lib/libamd.def
+++ /dev/null
@@ -1,12 +0,0 @@
-LIBRARY libamd.dll
-EXPORTS
-amd_order
-amd_defaults
-amd_control
-amd_info
-amd_2
-amd_l_order
-amd_l_defaults
-amd_l_control
-amd_l_info
-amd_l2
diff --git a/src/C/SuiteSparse/AMD/Makefile b/src/C/SuiteSparse/AMD/Makefile
deleted file mode 100644
index 0b1e01b..0000000
--- a/src/C/SuiteSparse/AMD/Makefile
+++ /dev/null
@@ -1,73 +0,0 @@
-#------------------------------------------------------------------------------
-# AMD Makefile (for GNU Make or original make)
-#------------------------------------------------------------------------------
-
-VERSION = 2.4.1
-
-default: all
-
-include ../SuiteSparse_config/SuiteSparse_config.mk
-
-demos: all
-
-# Compile all C code.  Do not compile the FORTRAN versions.
-all:
-	( cd Lib    ; $(MAKE) )
-	( cd Demo   ; $(MAKE) )
-
-# compile just the C-callable libraries (not Demos)
-library:
-	( cd Lib    ; $(MAKE) )
-
-# compile the FORTRAN libraries and demo programs (not compiled by "make all")
-fortran:
-	( cd Lib    ; $(MAKE) fortran )
-	( cd Demo   ; $(MAKE) fortran )
-
-# compile a FORTRAN demo program that calls the C version of AMD
-# (not compiled by "make all")
-cross:
-	( cd Demo   ; $(MAKE) cross )
-
-# remove object files, but keep the compiled programs and library archives
-clean:
-	( cd Lib    ; $(MAKE) clean )
-	( cd Demo   ; $(MAKE) clean )
-	( cd MATLAB ; $(RM) $(CLEAN) )
-	( cd Doc    ; $(MAKE) clean )
-
-# clean, and then remove compiled programs and library archives
-purge:
-	( cd Lib    ; $(MAKE) purge )
-	( cd Demo   ; $(MAKE) purge )
-	( cd MATLAB ; $(RM) $(CLEAN) ; $(RM) *.mex* )
-	( cd Doc    ; $(MAKE) purge )
-
-distclean: purge
-
-# create PDF documents for the original distribution
-docs:
-	( cd Doc    ; $(MAKE) )
-
-# get ready for distribution
-dist: purge
-	( cd Demo   ; $(MAKE) dist )
-	( cd Doc    ; $(MAKE) )
-
-ccode: library
-
-lib: library
-
-# install AMD
-install:
-	$(CP) Lib/libamd.a $(INSTALL_LIB)/libamd.$(VERSION).a
-	( cd $(INSTALL_LIB) ; ln -sf libamd.$(VERSION).a libamd.a )
-	$(CP) Include/amd.h $(INSTALL_INCLUDE)
-	chmod 644 $(INSTALL_LIB)/libamd*
-	chmod 644 $(INSTALL_INCLUDE)/amd.h
-
-# uninstall AMD
-uninstall:
-	$(RM) $(INSTALL_LIB)/libamd*.a
-	$(RM) $(INSTALL_INCLUDE)/amd.h
-
diff --git a/src/C/SuiteSparse/AMD/README.txt b/src/C/SuiteSparse/AMD/README.txt
deleted file mode 100644
index f6c970d..0000000
--- a/src/C/SuiteSparse/AMD/README.txt
+++ /dev/null
@@ -1,213 +0,0 @@
-AMD, Copyright (c) 2009-2013 by Timothy A. Davis (http://www.suitesparse.com),
-Patrick R. Amestoy, and Iain S. Duff.  All Rights Reserved.  AMD is available
-under alternate licences; contact T. Davis for details.
-
-AMD:  a set of routines for permuting sparse matrices prior to
-    factorization.  Includes a version in C, a version in Fortran, and a MATLAB
-    mexFunction.
-
-Requires SuiteSparse_config, in the ../SuiteSparse_config directory relative to
-this directory.
-
-Quick start (Unix, or Windows with Cygwin):
-
-    To compile, test, and install AMD, you may wish to first configure the
-    installation by editting the ../SuiteSparse_config/SuiteSparse_config.mk
-    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
-    ../SuiteSparse_config/SuiteSparse_config.mk 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.
-
--------------------------------------------------------------------------------
-
-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
-
--------------------------------------------------------------------------------
-
-This is the AMD 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 (DrTimothyAldenDavis at gmail.com)
-    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 distribution:
--------------------------------------------------------------------------------
-
-    ---------------------------------------------------------------------------
-    Subdirectories of the AMD directory:
-    ---------------------------------------------------------------------------
-
-    Doc		documentation
-    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.txt	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)
-    lesser.txt			the GNU LGPL license
-
-    ---------------------------------------------------------------------------
-    Source directory:
-    ---------------------------------------------------------------------------
-
-    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			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_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_preprocess.c		non-user-callable, computes A', removes duplic
-
-    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
-    amd_internal.h		non-user-callable, include file for 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_demo2.c			C demo program for AMD, jumbled matrix
-    amd_demo2.out		output of amd_demo2.c
-
-    amd_l_demo.c		C demo program for AMD (long integer version)
-    amd_l_demo.out		output of amd_l_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 amd2" listing of toolbox contents
-
-    amd2.m			MATLAB help file for AMD
-    amd_make.m			MATLAB m-file for compiling AMD mexFunction
-    amd_install.m		compile and install the 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
-    ---------------------------------------------------------------------------
-
-    GNUmakefile			a nice Makefile, for GNU make
-    Makefile			an ugly Unix Makefile (for older make's)
-    libamd.def			AMD definitions for Windows
diff --git a/src/C/SuiteSparse/AMD/Source/amd.f b/src/C/SuiteSparse/AMD/Source/amd.f
deleted file mode 100644
index ccfe3e8..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd.f
+++ /dev/null
@@ -1,1214 +0,0 @@
-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 --git a/src/C/SuiteSparse/AMD/Source/amd_1.c b/src/C/SuiteSparse/AMD/Source/amd_1.c
deleted file mode 100644
index 2be486e..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_1.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* ========================================================================= */
-/* === AMD_1 =============================================================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* 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_valid).
- */
-
-#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) == AMD_OK) ;
-
-    /* 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 --git a/src/C/SuiteSparse/AMD/Source/amd_2.c b/src/C/SuiteSparse/AMD/Source/amd_2.c
deleted file mode 100644
index f144722..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_2.c
+++ /dev/null
@@ -1,1842 +0,0 @@
-/* ========================================================================= */
-/* === AMD_2 =============================================================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* 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"
-
-/* ========================================================================= */
-/* === clear_flag ========================================================== */
-/* ========================================================================= */
-
-static Int clear_flag (Int wflg, Int wbig, Int W [ ], Int n)
-{
-    Int x ;
-    if (wflg < 2 || 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 */
-    return (wflg) ;
-}
-
-
-/* ========================================================================= */
-/* === AMD_2 =============================================================== */
-/* ========================================================================= */
-
-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 SuiteSparse_long versions are provided.  In the
- *      descriptions below and integer is and int or SuiteSparse_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, 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, (SuiteSparse_long_max - n)
- *                  for the SuiteSparse_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 ;
-
-    mindeg = 0 ;
-    ncmpa = 0 ;
-    nel = 0 ;
-    lemax = 0 ;
-
-    /* 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 ;
-    }
-    /* Note: if alpha is NaN, this is undefined: */
-    if (alpha < 0)
-    {
-	/* only remove completely dense rows/columns */
-	dense = n-2 ;
-    }
-    else
-    {
-	dense = alpha * sqrt ((double) n) ;
-    }
-    dense = MAX (16, dense) ;
-    dense = MIN (n,  dense) ;
-    AMD_DEBUG1 (("\n\nAMD (debug), alpha %g, aggr. "ID"\n",
-	alpha, aggressive)) ;
-
-    for (i = 0 ; i < n ; i++)
-    {
-	Last [i] = EMPTY ;
-	Head [i] = EMPTY ;
-	Next [i] = EMPTY ;
-	/* if separate 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" initial\n", nel)) ;
-    AMD_dump (n, Pe, Iw, Len, iwlen, pfree, Nv, Next, Last,
-		Head, Elen, Degree, W, -1) ;
-#endif
-
-    /* initialize wflg */
-    wbig = Int_MAX - n ;
-    wflg = clear_flag (0, wbig, W, n) ;
-
-    /* --------------------------------------------------------------------- */
-    /* initialize degree lists and eliminate dense and empty rows */
-    /* --------------------------------------------------------------------- */
-
-    ndense = 0 ;
-
-    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 */
-
-	wflg = clear_flag (wflg, wbig, W, n) ;
-
-/* ========================================================================= */
-/* 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] + Len [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 separate 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 ;
-	wflg = clear_flag (wflg, wbig, W, n) ;
-	/*  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 separate 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) ;
-			/* skip 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 ;
-    }
-
-/* ========================================================================= */
-/* POST-ORDERING */
-/* ========================================================================= */
-
-/* -------------------------------------------------------------------------
- * 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.)
- * ------------------------------------------------------------------------- */
-
-    /* restore Pe */
-    for (i = 0 ; i < n ; i++)
-    {
-	Pe [i] = FLIP (Pe [i]) ;
-    }
-
-    /* restore Elen, for output information, and for postordering */
-    for (i = 0 ; i < n ; 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 --git a/src/C/SuiteSparse/AMD/Source/amd_aat.c b/src/C/SuiteSparse/AMD/Source/amd_aat.c
deleted file mode 100644
index 67c03f7..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_aat.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* ========================================================================= */
-/* === AMD_aat ============================================================= */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* AMD_aat:  compute the symmetry of the pattern of A, and count the number of
- * nonzeros each column of A+A' (excluding the diagonal).  Assumes the input
- * matrix has no errors, with sorted columns and no duplicates
- * (AMD_valid (n, n, Ap, Ai) must be AMD_OK, but this condition is not
- * checked).
- */
-
-#include "amd_internal.h"
-
-GLOBAL size_t 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 ;
-    double sym ;
-    size_t nzaat ;
-
-#ifndef NDEBUG
-    AMD_debug_init ("AMD AAT") ;
-    for (k = 0 ; k < n ; k++) Tp [k] = EMPTY ;
-    ASSERT (AMD_valid (n, n, Ap, Ai) == AMD_OK) ;
-#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 = (2 * (double) 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) = %g\n",
-	(double) 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 --git a/src/C/SuiteSparse/AMD/Source/amd_control.c b/src/C/SuiteSparse/AMD/Source/amd_control.c
deleted file mode 100644
index f6a5e9a..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_control.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* ========================================================================= */
-/* === AMD_control ========================================================= */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* 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 ;
-    }
-
-    SUITESPARSE_PRINTF ((
-        "\nAMD version %d.%d.%d, %s: approximate minimum degree ordering\n"
-	"    dense row parameter: %g\n", AMD_MAIN_VERSION, AMD_SUB_VERSION,
-	AMD_SUBSUB_VERSION, AMD_DATE, alpha)) ;
-
-    if (alpha < 0)
-    {
-	SUITESPARSE_PRINTF (("    no rows treated as dense\n")) ;
-    }
-    else
-    {
-	SUITESPARSE_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)
-    {
-	SUITESPARSE_PRINTF (("    aggressive absorption:  yes\n")) ;
-    }
-    else
-    {
-	SUITESPARSE_PRINTF (("    aggressive absorption:  no\n")) ;
-    }
-
-    SUITESPARSE_PRINTF (("    size of AMD integer: %d\n\n", sizeof (Int))) ;
-}
diff --git a/src/C/SuiteSparse/AMD/Source/amd_defaults.c b/src/C/SuiteSparse/AMD/Source/amd_defaults.c
deleted file mode 100644
index b9a9079..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_defaults.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ========================================================================= */
-/* === AMD_defaults ======================================================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* User-callable.  Sets default control parameters for AMD.  See amd.h
- * for details.
- */
-
-#include "amd_internal.h"
-
-/* ========================================================================= */
-/* === AMD defaults ======================================================== */
-/* ========================================================================= */
-
-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 --git a/src/C/SuiteSparse/AMD/Source/amd_dump.c b/src/C/SuiteSparse/AMD/Source/amd_dump.c
deleted file mode 100644
index e58aaf5..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_dump.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/* ========================================================================= */
-/* === AMD_dump ============================================================ */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* 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) ;
-    AMD_DEBUG3 (("\nAMD dump, pfree: "ID"\n", pfree)) ;
-    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 + len <= 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 + len <= 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": \n", 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 --git a/src/C/SuiteSparse/AMD/Source/amd_global.c b/src/C/SuiteSparse/AMD/Source/amd_global.c
deleted file mode 100644
index 453e970..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_global.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* ========================================================================= */
-/* === amd_global ========================================================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* In prior versions of AMD, this file declared the amd_malloc, amd_free,
-   amd_realloc, amd_calloc, and amd_printf functions.  They are now replaced
-   by functions defined in SuiteSparse_config/SuiteSparse_config.c.
- */
diff --git a/src/C/SuiteSparse/AMD/Source/amd_info.c b/src/C/SuiteSparse/AMD/Source/amd_info.c
deleted file mode 100644
index 062651f..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_info.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/* ========================================================================= */
-/* === AMD_info ============================================================ */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* 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) { SUITESPARSE_PRINTF ((format, x)) ; }}
-
-GLOBAL void AMD_info
-(
-    double Info [ ]
-)
-{
-    double n, ndiv, nmultsubs_ldl, nmultsubs_lu, lnz, lnzd ;
-
-    SUITESPARSE_PRINTF (("\nAMD version %d.%d.%d, %s, results:\n",
-	AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE)) ;
-
-    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 */
-    SUITESPARSE_PRINTF (("    status: ")) ;
-    if (Info [AMD_STATUS] == AMD_OK)
-    {
-	SUITESPARSE_PRINTF (("OK\n")) ;
-    }
-    else if (Info [AMD_STATUS] == AMD_OUT_OF_MEMORY)
-    {
-	SUITESPARSE_PRINTF (("out of memory\n")) ;
-    }
-    else if (Info [AMD_STATUS] == AMD_INVALID)
-    {
-	SUITESPARSE_PRINTF (("invalid matrix\n")) ;
-    }
-    else if (Info [AMD_STATUS] == AMD_OK_BUT_JUMBLED)
-    {
-	SUITESPARSE_PRINTF (("OK, but jumbled\n")) ;
-    }
-    else
-    {
-	SUITESPARSE_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 */
-    SUITESPARSE_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)
-    {
-	SUITESPARSE_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 --git a/src/C/SuiteSparse/AMD/Source/amd_order.c b/src/C/SuiteSparse/AMD/Source/amd_order.c
deleted file mode 100644
index 7f199ae..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_order.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/* ========================================================================= */
-/* === AMD_order =========================================================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* User-callable AMD minimum degree ordering routine.  See amd.h for
- * documentation.
- */
-
-#include "amd_internal.h"
-
-/* ========================================================================= */
-/* === AMD_order =========================================================== */
-/* ========================================================================= */
-
-GLOBAL Int AMD_order
-(
-    Int n,
-    const Int Ap [ ],
-    const Int Ai [ ],
-    Int P [ ],
-    double Control [ ],
-    double Info [ ]
-)
-{
-    Int *Len, *S, nz, i, *Pinv, info, status, *Rp, *Ri, *Cp, *Ci, ok ;
-    size_t nzaat, slen ;
-    double mem = 0 ;
-
-#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) ;
-    }
-
-    /* check if n or nz will cause size_t overflow */
-    if (((size_t) n) >= SIZE_T_MAX / sizeof (Int)
-     || ((size_t) nz) >= SIZE_T_MAX / sizeof (Int))
-    {
-	if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ;
-	return (AMD_OUT_OF_MEMORY) ;	    /* problem too large */
-    }
-
-    /* check the input matrix:	AMD_OK, AMD_INVALID, or AMD_OK_BUT_JUMBLED */
-    status = AMD_valid (n, n, Ap, Ai) ;
-
-    if (status == AMD_INVALID)
-    {
-	if (info) Info [AMD_STATUS] = AMD_INVALID ;
-	return (AMD_INVALID) ;	    /* matrix is invalid */
-    }
-
-    /* allocate two size-n integer workspaces */
-    Len  = SuiteSparse_malloc (n, sizeof (Int)) ;
-    Pinv = SuiteSparse_malloc (n, sizeof (Int)) ;
-    mem += n ;
-    mem += n ;
-    if (!Len || !Pinv)
-    {
-	/* :: out of memory :: */
-	SuiteSparse_free (Len) ;
-	SuiteSparse_free (Pinv) ;
-	if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ;
-	return (AMD_OUT_OF_MEMORY) ;
-    }
-
-    if (status == AMD_OK_BUT_JUMBLED)
-    {
-	/* sort the input matrix and remove duplicate entries */
-	AMD_DEBUG1 (("Matrix is jumbled\n")) ;
-	Rp = SuiteSparse_malloc (n+1, sizeof (Int)) ;
-	Ri = SuiteSparse_malloc (nz,  sizeof (Int)) ;
-	mem += (n+1) ;
-	mem += MAX (nz,1) ;
-	if (!Rp || !Ri)
-	{
-	    /* :: out of memory :: */
-	    SuiteSparse_free (Rp) ;
-	    SuiteSparse_free (Ri) ;
-	    SuiteSparse_free (Len) ;
-	    SuiteSparse_free (Pinv) ;
-	    if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ;
-	    return (AMD_OUT_OF_MEMORY) ;
-	}
-	/* use Len and Pinv as workspace to create R = A' */
-	AMD_preprocess (n, Ap, Ai, Rp, Ri, Len, Pinv) ;
-	Cp = Rp ;
-	Ci = Ri ;
-    }
-    else
-    {
-	/* order the input matrix as-is.  No need to compute R = A' first */
-	Rp = NULL ;
-	Ri = NULL ;
-	Cp = (Int *) Ap ;
-	Ci = (Int *) Ai ;
-    }
-
-    /* --------------------------------------------------------------------- */
-    /* determine the symmetry and count off-diagonal nonzeros in A+A' */
-    /* --------------------------------------------------------------------- */
-
-    nzaat = AMD_aat (n, Cp, Ci, Len, P, Info) ;
-    AMD_DEBUG1 (("nzaat: %g\n", (double) nzaat)) ;
-    ASSERT ((MAX (nz-n, 0) <= nzaat) && (nzaat <= 2 * (size_t) nz)) ;
-
-    /* --------------------------------------------------------------------- */
-    /* allocate workspace for matrix, elbow room, and 6 size-n vectors */
-    /* --------------------------------------------------------------------- */
-
-    S = NULL ;
-    slen = nzaat ;			/* space for matrix */
-    ok = ((slen + nzaat/5) >= slen) ;	/* check for size_t overflow */
-    slen += nzaat/5 ;			/* add elbow room */
-    for (i = 0 ; ok && i < 7 ; i++)
-    {
-	ok = ((slen + n) > slen) ;	/* check for size_t overflow */
-	slen += n ;			/* size-n elbow room, 6 size-n work */
-    }
-    mem += slen ;
-    ok = ok && (slen < SIZE_T_MAX / sizeof (Int)) ; /* check for overflow */
-    ok = ok && (slen < Int_MAX) ;	/* S[i] for Int i must be OK */
-    if (ok)
-    {
-	S = SuiteSparse_malloc (slen, sizeof (Int)) ;
-    }
-    AMD_DEBUG1 (("slen %g\n", (double) slen)) ;
-    if (!S)
-    {
-	/* :: out of memory :: (or problem too large) */
-	SuiteSparse_free (Rp) ;
-	SuiteSparse_free (Ri) ;
-	SuiteSparse_free (Len) ;
-	SuiteSparse_free (Pinv) ;
-	if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ;
-	return (AMD_OUT_OF_MEMORY) ;
-    }
-    if (info)
-    {
-	/* memory usage, in bytes. */
-	Info [AMD_MEMORY] = mem * sizeof (Int) ;
-    }
-
-    /* --------------------------------------------------------------------- */
-    /* order the matrix */
-    /* --------------------------------------------------------------------- */
-
-    AMD_1 (n, Cp, Ci, P, Pinv, Len, slen, S, Control, Info) ;
-
-    /* --------------------------------------------------------------------- */
-    /* free the workspace */
-    /* --------------------------------------------------------------------- */
-
-    SuiteSparse_free (Rp) ;
-    SuiteSparse_free (Ri) ;
-    SuiteSparse_free (Len) ;
-    SuiteSparse_free (Pinv) ;
-    SuiteSparse_free (S) ;
-    if (info) Info [AMD_STATUS] = status ;
-    return (status) ;	    /* successful ordering */
-}
diff --git a/src/C/SuiteSparse/AMD/Source/amd_post_tree.c b/src/C/SuiteSparse/AMD/Source/amd_post_tree.c
deleted file mode 100644
index 516c95c..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_post_tree.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/* ========================================================================= */
-/* === AMD_post_tree ======================================================= */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* 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 --git a/src/C/SuiteSparse/AMD/Source/amd_postorder.c b/src/C/SuiteSparse/AMD/Source/amd_postorder.c
deleted file mode 100644
index e5aea7b..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_postorder.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* ========================================================================= */
-/* === AMD_postorder ======================================================= */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* 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 --git a/src/C/SuiteSparse/AMD/Source/amd_preprocess.c b/src/C/SuiteSparse/AMD/Source/amd_preprocess.c
deleted file mode 100644
index a8139c3..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_preprocess.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* ========================================================================= */
-/* === AMD_preprocess ====================================================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* Sorts, removes duplicate entries, and transposes from the nonzero pattern of
- * a column-form matrix A, to obtain the matrix R.  The input matrix can have
- * duplicate entries and/or unsorted columns (AMD_valid (n,Ap,Ai) must not be
- * AMD_INVALID).
- *
- * This input condition is NOT checked.  This routine is not user-callable.
- */
-
-#include "amd_internal.h"
-
-/* ========================================================================= */
-/* === AMD_preprocess ====================================================== */
-/* ========================================================================= */
-
-/* AMD_preprocess does not check its input for errors or allocate workspace.
- * On input, the condition (AMD_valid (n,n,Ap,Ai) != AMD_INVALID) must hold.
- */
-
-GLOBAL void AMD_preprocess
-(
-    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 ;
-
-    ASSERT (AMD_valid (n, n, Ap, Ai) != AMD_INVALID) ;
-
-    /* --------------------------------------------------------------------- */
-    /* 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
-    ASSERT (AMD_valid (n, n, Rp, Ri) == AMD_OK) ;
-    for (j = 0 ; j < n ; j++)
-    {
-	ASSERT (W [j] == Rp [j+1]) ;
-    }
-#endif
-}
diff --git a/src/C/SuiteSparse/AMD/Source/amd_valid.c b/src/C/SuiteSparse/AMD/Source/amd_valid.c
deleted file mode 100644
index 609abca..0000000
--- a/src/C/SuiteSparse/AMD/Source/amd_valid.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* ========================================================================= */
-/* === AMD_valid =========================================================== */
-/* ========================================================================= */
-
-/* ------------------------------------------------------------------------- */
-/* AMD, Copyright (c) Timothy A. Davis,					     */
-/* Patrick R. Amestoy, and Iain S. Duff.  See ../README.txt for License.     */
-/* email: DrTimothyAldenDavis at gmail.com                                      */
-/* ------------------------------------------------------------------------- */
-
-/* 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.
- *      Ai [0 ... nz-1] must be in the range 0 to n_row-1.
- *
- * If any of the above conditions hold, AMD_INVALID is returned.  If the
- * following condition holds, AMD_OK_BUT_JUMBLED is returned (a warning,
- * not an error):
- *
- *	row indices in Ai [Ap [j] ... Ap [j+1]-1] are not sorted in ascending
- *	    order, and/or duplicate entries exist.
- *
- * Otherwise, AMD_OK is returned.
- *
- * In v1.2 and earlier, this function returned TRUE if the matrix was valid
- * (now returns AMD_OK), or FALSE otherwise (now returns AMD_INVALID or
- * AMD_OK_BUT_JUMBLED).
- */
-
-#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, result = AMD_OK ;
-
-    if (n_row < 0 || n_col < 0 || Ap == NULL || Ai == NULL)
-    {
-	return (AMD_INVALID) ;
-    }
-    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 (AMD_INVALID) ;
-    }
-    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 (AMD_INVALID) ;
-	}
-	ilast = EMPTY ;
-	for (p = p1 ; p < p2 ; p++)
-	{
-	    i = Ai [p] ;
-	    AMD_DEBUG3 (("row: "ID"\n", i)) ;
-	    if (i < 0 || i >= n_row)
-	    {
-		/* row index out of range */
-		AMD_DEBUG0 (("index out of range, col "ID" row "ID"\n", j, i));
-		return (AMD_INVALID) ;
-	    }
-	    if (i <= ilast)
-	    {
-		/* row index unsorted, or duplicate entry present */
-		AMD_DEBUG1 (("index unsorted/dupl col "ID" row "ID"\n", j, i));
-		result = AMD_OK_BUT_JUMBLED ;
-	    }
-	    ilast = i ;
-	}
-    }
-    return (result) ;
-}
diff --git a/src/C/SuiteSparse/AMD/Source/amdbar.f b/src/C/SuiteSparse/AMD/Source/amdbar.f
deleted file mode 100644
index 1384392..0000000
--- a/src/C/SuiteSparse/AMD/Source/amdbar.f
+++ /dev/null
@@ -1,1206 +0,0 @@
-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 --git a/src/C/SuiteSparse/CHOLMOD/Check/License.txt b/src/C/SuiteSparse/CHOLMOD/Check/License.txt
deleted file mode 100644
index ba50e66..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Check/License.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-CHOLMOD/Check Module.  Copyright (C) 2005-2006, Timothy A. Davis
-CHOLMOD is also available under other licenses; contact authors for details.
-http://www.suitesparse.com
-
-Note that this license is for the CHOLMOD/Check module only.
-All CHOLMOD modules are licensed separately.
-
-
---------------------------------------------------------------------------------
-
-
-This Module 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 Module is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this Module; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
diff --git a/src/C/SuiteSparse/CHOLMOD/Check/cholmod_check.c b/src/C/SuiteSparse/CHOLMOD/Check/cholmod_check.c
deleted file mode 100644
index 4fa9cd2..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Check/cholmod_check.c
+++ /dev/null
@@ -1,2710 +0,0 @@
-/* ========================================================================== */
-/* === Check/cholmod_check ================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Check Module.  Copyright (C) 2005-2013, Timothy A. Davis
- * The CHOLMOD/Check Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Routines to check and print the contents of the 5 CHOLMOD objects:
- *
- * No CHOLMOD routine calls the check or print routines.  If a user wants to
- * check CHOLMOD's input parameters, a separate call to the appropriate check
- * routine should be used before calling other CHOLMOD routines.
- *
- * cholmod_check_common		check statistics and workspace in Common
- * cholmod_check_sparse		check sparse matrix in compressed column form
- * cholmod_check_dense		check dense matrix
- * cholmod_check_factor		check factorization
- * cholmod_check_triplet	check sparse matrix in triplet form
- *
- * cholmod_print_common		print statistics in Common
- * cholmod_print_sparse		print sparse matrix in compressed column form
- * cholmod_print_dense		print dense matrix
- * cholmod_print_factor		print factorization
- * cholmod_print_triplet	print sparse matrix in triplet form
- *
- * In addition, this file contains routines to check and print three types of
- * integer vectors:
- * 
- * cholmod_check_perm		check a permutation of 0:n-1 (no duplicates)
- * cholmod_check_subset		check a subset of 0:n-1 (duplicates OK)
- * cholmod_check_parent		check an elimination tree
- *
- * cholmod_print_perm		print a permutation
- * cholmod_print_subset		print a subset
- * cholmod_print_parent		print an elimination tree
- *
- * Each Common->print level prints the items at or below the given level:
- *
- *	0: print nothing; just check the data structures and return TRUE/FALSE
- *	1: error messages
- *	2: warning messages
- *	3: one-line summary of each object printed
- *	4: short summary of each object (first and last few entries)
- *	5: entire contents of the object
- *
- * No CHOLMOD routine calls these routines, so no printing occurs unless
- * the user specifically calls a cholmod_print_* routine.  Thus, the default
- * print level is 3.
- *
- * Common->precise controls the # of digits printed for numerical entries
- * (5 if FALSE, 15 if TRUE).
- *
- * If SuiteSparse_config.printf_func is NULL, then no printing occurs.  The
- * cholmod_check_* and cholmod_print_* routines still check their inputs and
- * return TRUE/FALSE if the object is valid or not.
- *
- * This file also includes debugging routines that are enabled only when
- * NDEBUG is defined in cholmod_internal.h (cholmod_dump_*).
- */
-
-#ifndef NCHECK
-
-#include "cholmod_internal.h"
-#include "cholmod_check.h"
-
-/* ========================================================================== */
-/* === printing definitions ================================================= */
-/* ========================================================================== */
-
-#ifdef LONG
-#define I8 "%8ld"
-#define I_8 "%-8ld"
-#else
-#define I8 "%8d"
-#define I_8 "%-8d"
-#endif
-
-#define PR(i,format,arg) \
-{ \
-    if (print >= i && SuiteSparse_config.printf_func != NULL) \
-    { \
-	SuiteSparse_config.printf_func (format, arg) ; \
-    } \
-}
-
-#define P1(format,arg) PR(1,format,arg)
-#define P2(format,arg) PR(2,format,arg)
-#define P3(format,arg) PR(3,format,arg)
-#define P4(format,arg) PR(4,format,arg)
-
-#define ERR(msg) \
-{ \
-    P1 ("\nCHOLMOD ERROR: %s: ", type) ; \
-    if (name != NULL) \
-    { \
-	P1 ("%s", name) ; \
-    } \
-    P1 (": %s\n", msg) ; \
-    ERROR (CHOLMOD_INVALID, "invalid") ; \
-    return (FALSE) ; \
-}
-
-/* print a numerical value */
-#define PRINTVALUE(value) \
-{ \
-    if (Common->precise) \
-    { \
-	P4 (" %23.15e", value) ; \
-    } \
-    else \
-    { \
-	P4 (" %.5g", value) ; \
-    } \
-}
-
-/* start printing */
-#define ETC_START(count,limit) \
-{ \
-    count = (init_print == 4) ? (limit) : (-1) ; \
-}
-
-/* re-enable printing if condition is met */
-#define ETC_ENABLE(condition,count,limit) \
-{ \
-    if ((condition) && init_print == 4) \
-    { \
-	count = limit ; \
-	print = 4 ; \
-    } \
-}
-
-/* turn off printing if limit is reached */
-#define ETC_DISABLE(count) \
-{ \
-    if ((count >= 0) && (count-- == 0) && print == 4) \
-    { \
-	P4 ("%s", "    ...\n")  ; \
-	print = 3 ; \
-    } \
-}
-
-/* re-enable printing, or turn if off after limit is reached */
-#define ETC(condition,count,limit) \
-{ \
-    ETC_ENABLE (condition, count, limit) ; \
-    ETC_DISABLE (count) ; \
-}
-
-#define BOOLSTR(x) ((x) ? "true " : "false")
-
-/* ========================================================================== */
-/* === print_value ========================================================== */
-/* ========================================================================== */
-
-static void print_value
-(
-    Int print,
-    Int xtype,
-    double *Xx,
-    double *Xz,
-    Int p,
-    cholmod_common *Common)
-{
-    if (xtype == CHOLMOD_REAL)
-    {
-	PRINTVALUE (Xx [p]) ;
-    }
-    else if (xtype == CHOLMOD_COMPLEX)
-    {
-	P4 ("%s", "(") ;
-	PRINTVALUE (Xx [2*p  ]) ;
-	P4 ("%s", " , ") ;
-	PRINTVALUE (Xx [2*p+1]) ;
-	P4 ("%s", ")") ;
-    }
-    else if (xtype == CHOLMOD_ZOMPLEX)
-    {
-	P4 ("%s", "(") ;
-	PRINTVALUE (Xx [p]) ;
-	P4 ("%s", " , ") ;
-	PRINTVALUE (Xz [p]) ;
-	P4 ("%s", ")") ;
-    }
-}
-
-/* ========================================================================== */
-/* === cholmod_check_common ================================================= */
-/* ========================================================================== */
-
-/* Print and verify the contents of Common */
-
-static int check_common
-(
-    Int print,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    double fl, lnz ;
-    double *Xwork ;
-    Int *Flag, *Head ;
-    SuiteSparse_long mark ;
-    Int i, nrow, nmethods, ordering, xworksize, amd_backup, init_print ;
-    const char *type = "common" ;
-
-    /* ---------------------------------------------------------------------- */
-    /* print control parameters and statistics */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    init_print = print ;
-
-    P2 ("%s", "\n") ;
-
-    P1 ("CHOLMOD version %d", CHOLMOD_MAIN_VERSION) ;
-    P1 (".%d", CHOLMOD_SUB_VERSION) ;
-    P1 (".%d", CHOLMOD_SUBSUB_VERSION) ;
-    P1 (", %s: ", CHOLMOD_DATE) ;
-
-    if (name != NULL)
-    {
-	P1 ("%s: ", name) ;
-    }
-    switch (Common->status)
-    {
-
-	case CHOLMOD_OK:
-	    P1 ("%s", "status: OK\n") ;
-	    break ;
-
-	case CHOLMOD_OUT_OF_MEMORY:
-	    P1 ("%s", "status: ERROR, out of memory\n") ;
-	    break ;
-
-	case CHOLMOD_INVALID:
-	    P1 ("%s", "status: ERROR, invalid parameter\n") ;
-	    break ;
-
-	case CHOLMOD_TOO_LARGE:
-	    P1 ("%s", "status: ERROR, problem too large\n") ;
-	    break ;
-
-	case CHOLMOD_NOT_INSTALLED:
-	    P1 ("%s", "status: ERROR, method not installed\n") ;
-	    break ;
-
-	case CHOLMOD_GPU_PROBLEM:
-	    P1 ("%s", "status: ERROR, GPU had a fatal error\n") ;
-	    break ;
-
-	case CHOLMOD_NOT_POSDEF:
-	    P1 ("%s", "status: warning, matrix not positive definite\n") ;
-	    break ;
-
-	case CHOLMOD_DSMALL:
-	    P1 ("%s", "status: warning, diagonal entry has tiny abs. value\n") ;
-	    break ;
-
-	default:
-	    ERR ("unknown status") ;
-    }
-
-    P2 ("  Architecture: %s\n", CHOLMOD_ARCHITECTURE) ;
-    P3 ("    sizeof(int):      %d\n", (int) sizeof (int)) ;
-    P3 ("    sizeof(SuiteSparse_long):  %d\n", (int) sizeof (SuiteSparse_long));
-    P3 ("    sizeof(void *):   %d\n", (int) sizeof (void *)) ;
-    P3 ("    sizeof(double):   %d\n", (int) sizeof (double)) ;
-    P3 ("    sizeof(Int):      %d (CHOLMOD's basic integer)\n", (int) sizeof (Int)) ;
-    P3 ("    sizeof(BLAS_INT): %d (integer used in the BLAS)\n",
-	    (int) sizeof (BLAS_INT)) ;
-
-    if (Common->fl != EMPTY)
-    {
-	P2 ("%s", "  Results from most recent analysis:\n") ;
-	P2 ("    Cholesky flop count: %.5g\n", Common->fl) ;
-	P2 ("    Nonzeros in L:       %.5g\n", Common->lnz) ;
-    }
-    if (Common->modfl != EMPTY)
-    {
-	P2 ("    Update/downdate flop count: %.5g\n", Common->modfl) ;
-    }
-
-    P2 ("  memory blocks in use:    %8.0f\n", (double) (Common->malloc_count)) ;
-    P2 ("  memory in use (MB):      %8.1f\n", 
-	(double) (Common->memory_inuse) / 1048576.) ;
-    P2 ("  peak memory usage (MB):  %8.1f\n", 
-	(double) (Common->memory_usage) / 1048576.) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* primary control parameters and related ordering statistics */
-    /* ---------------------------------------------------------------------- */
-
-    P3 ("  maxrank:    update/downdate rank:   "ID"\n",
-	    (Int) CHOLMOD(maxrank) (0, Common)) ;
-    P3 ("  supernodal control: %d", Common->supernodal) ;
-    P3 (" %g ", Common->supernodal_switch) ;
-    if (Common->supernodal <= CHOLMOD_SIMPLICIAL)
-    {
-	P3 ("%s", "(always do simplicial)\n") ;
-    }
-    else if (Common->supernodal == CHOLMOD_AUTO)
-    {
-	P3 ("(supernodal if flops/lnz >= %g)\n", Common->supernodal_switch) ;
-    }
-    else
-    {
-	P3 ("%s", "(always do supernodal)\n") ;
-    }
-
-    nmethods = MIN (Common->nmethods, CHOLMOD_MAXMETHODS) ;
-    nmethods = MAX (0, nmethods) ;
-
-    if (nmethods > 0)
-    {
-	P3 ("%s", "  nmethods:   number of ordering methods to try: ") ;
-	P3 (""ID"\n", nmethods) ;
-        amd_backup = (nmethods > 1) || (nmethods == 1 &&
-            (Common->method [0].ordering == CHOLMOD_METIS ||
-             Common->method [0].ordering == CHOLMOD_NESDIS)) ;
-    }
-    else
-    {
-	P3 ("%s", "  nmethods=0: default strategy:  Try user permutation if "
-		"given.  Try AMD.\n") ;
-#ifndef NPARTITION
-	if (Common->default_nesdis)
-	{
-	    P3 ("%s", "    Try NESDIS if AMD reports flops/nnz(L) >= 500 and "
-		"nnz(L)/nnz(A) >= 5.\n") ;
-	}
-	else
-	{
-	    P3 ("%s", "    Try METIS if AMD reports flops/nnz(L) >= 500 and "
-		"nnz(L)/nnz(A) >= 5.\n") ;
-	}
-#endif
-	P3 ("%s", "    Select best ordering tried.\n") ;
-	Common->method [0].ordering = CHOLMOD_GIVEN ;
-	Common->method [1].ordering = CHOLMOD_AMD ;
-	Common->method [2].ordering = 
-            (Common->default_nesdis ? CHOLMOD_NESDIS : CHOLMOD_METIS) ;
-        amd_backup = FALSE ;
-#ifndef NPARTITION
-	nmethods = 3 ;
-#else
-	nmethods = 2 ;
-#endif
-    }
-
-    for (i = 0 ; i < nmethods ; i++)
-    {
-	P3 ("    method "ID": ", i) ;
-	ordering = Common->method [i].ordering ;
-	fl = Common->method [i].fl ;
-	lnz = Common->method [i].lnz ;
-	switch (ordering)
-	{
-
-	    case CHOLMOD_NATURAL:
-		P3 ("%s", "natural\n") ;
-		break ;
-
-	    case CHOLMOD_GIVEN:
-		P3 ("%s", "user permutation (if given)\n") ;
-		break ;
-
-	    case CHOLMOD_AMD:
-		P3 ("%s", "AMD (or COLAMD if factorizing AA')\n") ;
-		amd_backup = FALSE ;
-		break ;
-
-	    case CHOLMOD_COLAMD:
-		P3 ("%s", "AMD if factorizing A, COLAMD if factorizing AA')\n");
-		amd_backup = FALSE ;
-		break ;
-
-	    case CHOLMOD_METIS:
-		P3 ("%s", "METIS_NodeND nested dissection\n") ;
-		break ;
-
-	    case CHOLMOD_NESDIS:
-		P3 ("%s", "CHOLMOD nested dissection\n") ;
-
-		P3 ("        nd_small: # nodes in uncut subgraph: "ID"\n",
-			(Int) (Common->method [i].nd_small)) ;
-		P3 ("        nd_compress: compress the graph:     %s\n",
-			BOOLSTR (Common->method [i].nd_compress)) ;
-		P3 ("        nd_camd: use constrained min degree: %s\n",
-			BOOLSTR (Common->method [i].nd_camd)) ;
-		break ;
-
-	    default:
-		P3 (ID, ordering) ;
-		ERR ("unknown ordering method") ;
-		break ;
-
-	}
-
-	if (!(ordering == CHOLMOD_NATURAL || ordering == CHOLMOD_GIVEN))
-	{
-	    if (Common->method [i].prune_dense < 0)
-	    {
-		P3 ("        prune_dense: for pruning dense nodes:   %s\n",
-			" none pruned") ;
-	    }
-	    else
-	    {
-		P3 ("        prune_dense: for pruning dense nodes:   "
-		    "%.5g\n",
-		    Common->method [i].prune_dense) ;
-		P3 ("        a dense node has degree "
-			">= max(16,(%.5g)*sqrt(n))\n",
-		    Common->method [i].prune_dense) ;
-	    }
-	}
-
-	if (ordering == CHOLMOD_COLAMD || ordering == CHOLMOD_NESDIS)
-	{
-	    if (Common->method [i].prune_dense2 < 0)
-	    {
-		P3 ("        prune_dense2: for pruning dense rows for AA':"
-			"  %s\n", " none pruned") ;
-	    }
-	    else
-	    {
-		P3 ("        prune_dense2: for pruning dense rows for AA':"
-		    " %.5g\n", Common->method [i].prune_dense2) ;
-		P3 ("        a dense row has degree "
-			">= max(16,(%.5g)*sqrt(ncol))\n",
-		    Common->method [i].prune_dense2) ;
-	    }
-	}
-
-	if (fl  != EMPTY) P3 ("        flop count: %.5g\n", fl) ;
-	if (lnz != EMPTY) P3 ("        nnz(L):     %.5g\n", lnz) ;
-    }
-
-    /* backup AMD results, if any */
-    if (amd_backup)
-    {
-	P3 ("%s", "    backup method: ") ;
-	P3 ("%s", "AMD (or COLAMD if factorizing AA')\n") ;
-	fl = Common->method [nmethods].fl ;
-	lnz = Common->method [nmethods].lnz ;
-	if (fl  != EMPTY) P3 ("        AMD flop count: %.5g\n", fl) ;
-	if (lnz != EMPTY) P3 ("        AMD nnz(L):     %.5g\n", lnz) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* arcane control parameters */
-    /* ---------------------------------------------------------------------- */
-
-    if (Common->final_asis)
-    {
-	P4 ("%s", "  final_asis: TRUE, leave as is\n") ;
-    }
-    else
-    {
-	P4 ("%s", "  final_asis: FALSE, convert when done\n") ;
-	if (Common->final_super)
-	{
-	    P4 ("%s", "  final_super: TRUE, leave in supernodal form\n") ;
-	}
-	else
-	{
-	    P4 ("%s", "  final_super: FALSE, convert to simplicial form\n") ;
-	}
-	if (Common->final_ll)
-	{
-	    P4 ("%s", "  final_ll: TRUE, convert to LL' form\n") ;
-	}
-	else
-	{
-	    P4 ("%s", "  final_ll: FALSE, convert to LDL' form\n") ;
-	}
-	if (Common->final_pack)
-	{
-	    P4 ("%s", "  final_pack: TRUE, pack when done\n") ;
-	}
-	else
-	{
-	    P4 ("%s", "  final_pack: FALSE, do not pack when done\n") ;
-	}
-	if (Common->final_monotonic)
-	{
-	    P4 ("%s", "  final_monotonic: TRUE, ensure L is monotonic\n") ;
-	}
-	else
-	{
-	    P4 ("%s",
-		"  final_monotonic: FALSE, do not ensure L is monotonic\n") ;
-	}
-	P4 ("  final_resymbol: remove zeros from amalgamation: %s\n",
-		BOOLSTR (Common->final_resymbol)) ;
-    }
-
-    P4 ("  dbound:  LDL' diagonal threshold: % .5g\n    Entries with abs. value"
-	    " less than dbound are replaced with +/- dbound.\n",
-	    Common->dbound) ;
-
-    P4 ("  grow0: memory reallocation: % .5g\n", Common->grow0) ;
-    P4 ("  grow1: memory reallocation: % .5g\n", Common->grow1) ;
-    P4 ("  grow2: memory reallocation: %g\n", (double) (Common->grow2)) ;
-
-    P4 ("%s", "  nrelax, zrelax:  supernodal amalgamation rule:\n") ;
-    P4 ("%s", "    s = # columns in two adjacent supernodes\n") ;
-    P4 ("%s", "    z = % of zeros in new supernode if they are merged.\n") ;
-    P4 ("%s", "    Two supernodes are merged if") ;
-    P4 (" (s <= %g) or (no new zero entries) or\n",
-	    (double) (Common->nrelax [0])) ;
-    P4 ("    (s <= %g and ",  (double) (Common->nrelax [1])) ;
-    P4 ("z < %.5g%%) or",      Common->zrelax [0] * 100) ;
-    P4 (" (s <= %g and ",     (double) (Common->nrelax [2])) ;
-    P4 ("z < %.5g%%) or",      Common->zrelax [1] * 100) ;
-    P4 (" (z < %.5g%%)\n",     Common->zrelax [2] * 100) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check workspace */
-    /* ---------------------------------------------------------------------- */
-
-    mark = Common->mark ;
-    nrow = Common->nrow ;
-    Flag = Common->Flag ;
-    Head = Common->Head ;
-    if (nrow > 0)
-    {
-	if (mark < 0 || Flag == NULL || Head == NULL)
-	{
-	    ERR ("workspace corrupted (Flag and/or Head missing)") ;
-	}
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    if (Flag [i] >= mark)
-	    {
-		PRINT0 (("Flag ["ID"]="ID", mark = %ld\n", i, Flag [i], mark)) ;
-		ERR ("workspace corrupted (Flag)") ;
-	    }
-	}
-	for (i = 0 ; i <= nrow ; i++)
-	{
-	    if (Head [i] != EMPTY)
-	    {
-		PRINT0 (("Head ["ID"] = "ID",\n", i, Head [i])) ;
-		ERR ("workspace corrupted (Head)") ;
-	    }
-	}
-    }
-    xworksize = Common->xworksize ;
-    Xwork = Common->Xwork ;
-    if (xworksize > 0)
-    {
-	if (Xwork == NULL)
-	{
-	    ERR ("workspace corrupted (Xwork missing)") ;
-	}
-	for (i = 0 ; i < xworksize ; i++)
-	{
-	    if (Xwork [i] != 0.)
-	    {
-		PRINT0 (("Xwork ["ID"] = %g\n", i, Xwork [i])) ;
-		ERR ("workspace corrupted (Xwork)") ;
-	    }
-	}
-    }
-
-    /* workspace and parameters are valid */
-    P3 ("%s", "  OK\n") ;
-    P4 ("%s", "\n") ;
-    return (TRUE) ;
-}
-
-
-int CHOLMOD(check_common)
-(
-    cholmod_common *Common
-)
-{
-    return (check_common (0, NULL, Common)) ;
-}
-
-
-int CHOLMOD(print_common)
-(
-    /* ---- input ---- */
-    const char *name,		/* printed name of Common object */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int print = (Common == NULL) ? 3 : (Common->print) ;
-    return (check_common (print, name, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_gpu_stats ==================================================== */
-/* ========================================================================== */
-
-/* Print CPU / GPU statistics.  If the timer is not installed, the times are
-   reported as zero, but this function still works.  Likewise, the function
-   still works if the GPU BLAS is not installed. */
-
-int CHOLMOD(gpu_stats)
-(
-    cholmod_common *Common      /* input */
-)
-{
-    double cpu_time, gpu_time ;
-    int print ;
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    print = Common->print ;
-
-    P2 ("%s", "\nCHOLMOD GPU/CPU statistics:\n") ;
-    P2 ("SYRK  CPU calls %12.0f", (double) Common->CHOLMOD_CPU_SYRK_CALLS) ;
-    P2 (" time %12.4e\n", Common->CHOLMOD_CPU_SYRK_TIME) ;
-    P2 ("      GPU calls %12.0f", (double) Common->CHOLMOD_GPU_SYRK_CALLS) ;
-    P2 (" time %12.4e\n", Common->CHOLMOD_GPU_SYRK_TIME) ;
-    P2 ("GEMM  CPU calls %12.0f", (double) Common->CHOLMOD_CPU_GEMM_CALLS) ;
-    P2 (" time %12.4e\n", Common->CHOLMOD_CPU_GEMM_TIME) ;
-    P2 ("      GPU calls %12.0f", (double) Common->CHOLMOD_GPU_GEMM_CALLS) ;
-    P2 (" time %12.4e\n", Common->CHOLMOD_GPU_GEMM_TIME) ;
-    P2 ("POTRF CPU calls %12.0f", (double) Common->CHOLMOD_CPU_POTRF_CALLS) ;
-    P2 (" time %12.4e\n", Common->CHOLMOD_CPU_POTRF_TIME) ;
-    P2 ("      GPU calls %12.0f", (double) Common->CHOLMOD_GPU_POTRF_CALLS) ;
-    P2 (" time %12.4e\n", Common->CHOLMOD_GPU_POTRF_TIME) ;
-    P2 ("TRSM  CPU calls %12.0f", (double) Common->CHOLMOD_CPU_TRSM_CALLS) ;
-    P2 (" time %12.4e\n", Common->CHOLMOD_CPU_TRSM_TIME) ;
-    P2 ("      GPU calls %12.0f", (double) Common->CHOLMOD_GPU_TRSM_CALLS) ;
-    P2 (" time %12.4e\n", Common->CHOLMOD_GPU_TRSM_TIME) ;
-
-    cpu_time = Common->CHOLMOD_CPU_SYRK_TIME + Common->CHOLMOD_CPU_TRSM_TIME +
-               Common->CHOLMOD_CPU_GEMM_TIME + Common->CHOLMOD_CPU_POTRF_TIME ;
-
-    gpu_time = Common->CHOLMOD_GPU_SYRK_TIME + Common->CHOLMOD_GPU_TRSM_TIME +
-               Common->CHOLMOD_GPU_GEMM_TIME + Common->CHOLMOD_GPU_POTRF_TIME ;
-
-    P2 ("time in the BLAS: CPU %12.4e", cpu_time) ;
-    P2 (" GPU %12.4e", gpu_time) ;
-    P2 (" total: %12.4e\n", cpu_time + gpu_time) ;
-
-    P2 ("assembly time %12.4e", Common->CHOLMOD_ASSEMBLE_TIME) ;
-    P2 ("  %12.4e\n", Common->CHOLMOD_ASSEMBLE_TIME2) ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_check_sparse ================================================= */
-/* ========================================================================== */
-
-/* Ensure that a sparse matrix in column-oriented form is valid, and optionally
- * print it.  Returns the number of entries on the diagonal or -1 if error.
- *
- * workspace: Iwork (nrow)
- */
-
-static SuiteSparse_long check_sparse
-(
-    Int *Wi,
-    Int print,
-    const char *name,
-    cholmod_sparse *A,
-    SuiteSparse_long *nnzdiag,
-    cholmod_common *Common
-)
-{
-    double *Ax, *Az ;
-    Int *Ap, *Ai, *Anz ;
-    Int nrow, ncol, nzmax, sorted, packed, j, p, pend, i, nz, ilast,
-	space, init_print, dnz, count, xtype ;
-    const char *type = "sparse" ;
-
-    /* ---------------------------------------------------------------------- */
-    /* print header information */
-    /* ---------------------------------------------------------------------- */
-
-    P4 ("%s", "\n") ;
-    P3 ("%s", "CHOLMOD sparse:  ") ;
-    if (name != NULL)
-    {
-	P3 ("%s: ", name) ;
-    }
-
-    if (A == NULL)
-    {
-	ERR ("null") ;
-    }
-
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-    nzmax = A->nzmax ;
-    sorted = A->sorted ;
-    packed = A->packed ;
-    xtype = A->xtype ;
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Az = A->z ;
-    Anz = A->nz ;
-    nz = CHOLMOD(nnz) (A, Common) ;
-
-    P3 (" "ID"", nrow) ;
-    P3 ("-by-"ID", ", ncol) ;
-    P3 ("nz "ID",", nz) ;
-    if (A->stype > 0)
-    {
-	P3 ("%s", " upper.") ;
-    }
-    else if (A->stype < 0)
-    {
-	P3 ("%s", " lower.") ;
-    }
-    else
-    {
-	P3 ("%s", " up/lo.") ;
-    }
-
-    P4 ("\n  nzmax "ID", ", nzmax) ;
-    if (nz > nzmax)
-    {
-	ERR ("nzmax too small") ;
-    }
-    if (!sorted)
-    {
-	P4 ("%s", "un") ;
-    }
-    P4 ("%s", "sorted, ") ;
-    if (!packed)
-    {
-	P4 ("%s", "un") ;
-    }
-    P4 ("%s", "packed, ") ;
-
-    switch (A->itype)
-    {
-	case CHOLMOD_INT:     P4 ("%s", "\n  scalar types: int, ") ; break ;
-	case CHOLMOD_INTLONG: ERR ("mixed int/long type unsupported") ;
-	case CHOLMOD_LONG:    P4 ("%s", "\n  scalar types: SuiteSparse_long, ");
-        break ;
-	default:	      ERR ("unknown itype") ;
-    }
-
-    switch (A->xtype)
-    {
-	case CHOLMOD_PATTERN: P4 ("%s", "pattern") ;	break ;
-	case CHOLMOD_REAL:    P4 ("%s", "real") ;	break ;
-	case CHOLMOD_COMPLEX: P4 ("%s", "complex") ;	break ;
-	case CHOLMOD_ZOMPLEX: P4 ("%s", "zomplex") ;	break ;
-	default:	      ERR ("unknown xtype") ;
-    }
-
-    switch (A->dtype)
-    {
-	case CHOLMOD_DOUBLE:  P4 ("%s", ", double\n") ;	       break ;
-	case CHOLMOD_SINGLE:  ERR ("float unsupported") ;
-	default:	      ERR ("unknown dtype") ;
-    }
-
-    if (A->itype != ITYPE || A->dtype != DTYPE)
-    {
-	ERR ("integer and real type must match routine") ;
-    }
-
-    if (A->stype && nrow != ncol)
-    {
-	ERR ("symmetric but not square") ;
-    }
-
-    /* check for existence of Ap, Ai, Anz, Ax, and Az arrays */
-    if (Ap == NULL)
-    {
-	ERR ("p array not present") ;
-    }
-    if (Ai == NULL)
-    {
-	ERR ("i array not present") ;
-    }
-    if (!packed && Anz == NULL)
-    {
-	ERR ("nz array not present") ;
-    }
-    if (xtype != CHOLMOD_PATTERN && Ax == NULL)
-    {
-	ERR ("x array not present") ;
-    }
-    if (xtype == CHOLMOD_ZOMPLEX && Az == NULL)
-    {
-	ERR ("z array not present") ;
-    }
-
-    /* packed matrices must start at Ap [0] = 0 */
-    if (packed && Ap [0] != 0)
-    {
-	ERR ("p [0] must be zero") ;
-    }
-    if (packed && (Ap [ncol] < Ap [0] || Ap [ncol] > nzmax))
-    {
-	ERR ("p [ncol] invalid") ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace if needed */
-    /* ---------------------------------------------------------------------- */
-
-    if (!sorted)
-    {
-	if (Wi == NULL)
-	{
-	    CHOLMOD(allocate_work) (0, nrow, 0, Common) ;
-	    Wi = Common->Iwork ;	/* size nrow, (i/i/l) */
-	}
-	if (Common->status < CHOLMOD_OK)
-	{
-	    return (FALSE) ;	    /* out of memory */
-	}
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    Wi [i] = EMPTY ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* check and print each column */
-    /* ---------------------------------------------------------------------- */
-
-    init_print = print ;
-    dnz = 0 ;
-    ETC_START (count, 8) ;
-
-    for (j = 0 ; j < ncol ; j++)
-    {
-	ETC (j == ncol-1, count, 4) ;
-	p = Ap [j] ;
-	if (packed)
-	{
-	    pend = Ap [j+1] ;
-	    nz = pend - p ;
-	}
-	else
-	{
-	    /* Note that Anz [j] < 0 is treated as zero */
-	    nz = MAX (0, Anz [j]) ;
-	    pend = p + nz ;
-	}
-	/* Note that space can be negative if the matrix is non-monotonic */
-	space = Ap [j+1] - p ;
-	P4 ("  col "ID":", j) ;
-	P4 (" nz "ID"", nz) ;
-	P4 (" start "ID"", p) ;
-	P4 (" end "ID"", pend) ;
-	if (!packed)
-	{
-	    P4 (" space "ID"", space) ;
-	}
-	P4 ("%s", ":\n") ;
-	if (p < 0 || pend > nzmax)
-	{
-	    ERR ("pointer invalid") ;
-	}
-	if (nz < 0 || nz > nrow)
-	{
-	    ERR ("nz invalid") ;
-	}
-	ilast = EMPTY ;
-
-	for ( ; p < pend ; p++)
-	{
-	    ETC (j == ncol-1 && p >= pend-4, count, -1) ;
-	    i = Ai [p] ;
-	    P4 ("  "I8":", i) ;
-
-	    print_value (print, xtype, Ax, Az, p, Common) ;
-
-	    if (i == j)
-	    {
-		dnz++ ;
-	    }
-	    if (i < 0 || i >= nrow)
-	    {
-		ERR ("row index out of range") ;
-	    }
-	    if (sorted && i <= ilast)
-	    {
-		ERR ("row indices out of order") ;
-	    }
-	    if (!sorted && Wi [i] == j)
-	    {
-		ERR ("duplicate row index") ;
-	    }
-	    P4 ("%s", "\n") ;
-	    ilast = i ;
-	    if (!sorted)
-	    {
-		Wi [i] = j ;
-	    }
-	}
-    }
-
-    /* matrix is valid */
-    P4 ("  nnz on diagonal: "ID"\n", dnz) ;
-    P3 ("%s", "  OK\n") ;
-    P4 ("%s", "\n") ;
-    *nnzdiag = dnz ;
-    return (TRUE) ;
-}
-
-
-int CHOLMOD(check_sparse)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* sparse matrix to check */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    SuiteSparse_long nnzdiag ;
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_sparse (NULL, 0, NULL, A, &nnzdiag, Common)) ;
-}
-
-
-int CHOLMOD(print_sparse)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* sparse matrix to print */
-    const char *name,	/* printed name of sparse matrix */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    SuiteSparse_long nnzdiag ;
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_sparse (NULL, Common->print, name, A, &nnzdiag, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_check_dense ================================================== */
-/* ========================================================================== */
-
-/* Ensure a dense matrix is valid, and optionally print it. */
-
-static int check_dense
-(
-    Int print,
-    const char *name,
-    cholmod_dense *X,
-    cholmod_common *Common
-)
-{
-    double *Xx, *Xz ;
-    Int i, j, d, nrow, ncol, nzmax, nz, init_print, count, xtype ;
-    const char *type = "dense" ;
-
-    /* ---------------------------------------------------------------------- */
-    /* print header information */
-    /* ---------------------------------------------------------------------- */
-
-    P4 ("%s", "\n") ;
-    P3 ("%s", "CHOLMOD dense:   ") ;
-    if (name != NULL)
-    {
-	P3 ("%s: ", name) ;
-    }
-
-    if (X == NULL)
-    {
-	ERR ("null") ;
-    }
-
-    nrow = X->nrow ;
-    ncol = X->ncol ;
-    nzmax = X->nzmax ;
-    d = X->d ;
-    Xx = X->x ;
-    Xz = X->z ;
-    xtype = X->xtype ;
-
-    P3 (" "ID"", nrow) ;
-    P3 ("-by-"ID", ", ncol) ;
-    P4 ("\n  leading dimension "ID", ", d) ;
-    P4 ("nzmax "ID", ", nzmax) ;
-    if (d * ncol > nzmax)
-    {
-	ERR ("nzmax too small") ;
-    }
-    if (d < nrow)
-    {
-	ERR ("leading dimension must be >= # of rows") ;
-    }
-    if (Xx == NULL)
-    {
-	ERR ("null") ;
-    }
-
-    switch (X->xtype)
-    {
-	case CHOLMOD_PATTERN: ERR ("pattern unsupported") ;  break ;
-	case CHOLMOD_REAL:    P4 ("%s", "real") ;	break ;
-	case CHOLMOD_COMPLEX: P4 ("%s", "complex") ;	break ;
-	case CHOLMOD_ZOMPLEX: P4 ("%s", "zomplex") ;	break ;
-	default:	      ERR ("unknown xtype") ;
-    }
-
-    switch (X->dtype)
-    {
-	case CHOLMOD_DOUBLE:  P4 ("%s", ", double\n") ;	       break ;
-	case CHOLMOD_SINGLE:  ERR ("single unsupported") ;
-	default:	      ERR ("unknown dtype") ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* check and print each entry */
-    /* ---------------------------------------------------------------------- */
-
-    if (print >= 4)
-    {
-	init_print = print ;
-	ETC_START (count, 9) ;
-	nz = nrow * ncol ;
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    ETC (j == ncol-1, count, 5) ;
-	    P4 ("  col "ID":\n", j) ;
-	    for (i = 0 ; i < nrow ; i++)
-	    {
-		ETC (j == ncol-1 && i >= nrow-4, count, -1) ;
-		P4 ("  "I8":", i) ;
-
-		print_value (print, xtype, Xx, Xz, i+j*d, Common) ;
-
-		P4 ("%s", "\n") ;
-	    }
-	}
-    }
-
-    /* dense  is valid */
-    P3 ("%s", "  OK\n") ;
-    P4 ("%s", "\n") ;
-    return (TRUE) ;
-}
-
-
-int CHOLMOD(check_dense)
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* dense matrix to check */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_dense (0, NULL, X, Common)) ;
-}
-
-
-int CHOLMOD(print_dense)
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* dense matrix to print */
-    const char *name,	/* printed name of dense matrix */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_dense (Common->print, name, X, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_check_subset ================================================= */
-/* ========================================================================== */
-
-/* Ensure S (0:len-1) is a subset of 0:n-1.  Duplicates are allowed.  S may be
- * NULL.  A negative len denotes the set 0:n-1.
- *
- * To check the rset and cset for A(rset,cset), where nc and nr are the length
- * of cset and rset respectively:
- *
- *	cholmod_check_subset (cset, nc, A->ncol, Common) ;
- *	cholmod_check_subset (rset, nr, A->nrow, Common) ;
- *
- * workspace: none
- */
-
-static int check_subset
-(
-    Int *S,
-    SuiteSparse_long len,
-    size_t n,
-    Int print,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    Int i, k, init_print, count ;
-    const char *type = "subset" ;
-
-    init_print = print ;
-
-    if (S == NULL)
-    {
-	/* zero len denotes S = [ ], negative len denotes S = 0:n-1 */
-	len = (len < 0) ? (-1) : 0 ;
-    }
-
-    P4 ("%s", "\n") ;
-    P3 ("%s", "CHOLMOD subset:  ") ;
-    if (name != NULL)
-    {
-	P3 ("%s: ", name) ;
-    }
-
-    P3 (" len: %ld ", len) ;
-    if (len < 0)
-    {
-	P3 ("%s", "(denotes 0:n-1) ") ;
-    }
-    P3 ("n: "ID"", (Int) n) ;
-    P4 ("%s", "\n") ;
-
-    if (len <= 0 || S == NULL)
-    {
-	P3 ("%s", "  OK\n") ;
-	P4 ("%s", "\n") ;
-	return (TRUE) ;
-    }
-
-    if (print >= 4)
-    {
-	ETC_START (count, 8) ;
-	for (k = 0 ; k < ((Int) len) ; k++)
-	{
-	    ETC (k == ((Int) len) - 4, count, -1) ;
-	    i = S [k] ;
-	    P4 ("  "I8":", k) ;
-	    P4 (" "ID"\n", i) ;
-	    if (i < 0 || i >= ((Int) n))
-	    {
-		ERR ("entry out range") ;
-	    }
-	}
-    }
-    else
-    {
-	for (k = 0 ; k < ((Int) len) ; k++)
-	{
-	    i = S [k] ;
-	    if (i < 0 || i >= ((Int) n))
-	    {
-		ERR ("entry out range") ;
-	    }
-	}
-    }
-    P3 ("%s", "  OK\n") ;
-    P4 ("%s", "\n") ;
-    return (TRUE) ;
-}
-
-
-int CHOLMOD(check_subset)
-(
-    /* ---- input ---- */
-    Int *Set,		/* Set [0:len-1] is a subset of 0:n-1.  Duplicates OK */
-    SuiteSparse_long len, /* size of Set (an integer array), or < 0 if 0:n-1 */
-    size_t n,		/* 0:n-1 is valid range */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_subset (Set, len, n, 0, NULL, Common)) ;
-}
-
-
-int CHOLMOD(print_subset)
-(
-    /* ---- input ---- */
-    Int *Set,		/* Set [0:len-1] is a subset of 0:n-1.  Duplicates OK */
-    SuiteSparse_long len, /* size of Set (an integer array), or < 0 if 0:n-1 */
-    size_t n,		/* 0:n-1 is valid range */
-    const char *name,	/* printed name of Set */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_subset (Set, len, n, Common->print, name, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_check_perm =================================================== */
-/* ========================================================================== */
-
-/* Ensure that Perm [0..len-1] is a permutation of a subset of 0:n-1.  Perm
- * may be NULL, which is interpreted as the identity permutation.  There can
- * be no duplicate entries (len must be <= n).
- *
- * If n <= Common->nrow, then this routine takes O(len) time and does not
- * allocate any memory, by using Common->Flag.  Otherwise, it takes O(n) time
- * and ensures that Common->Iwork is at least n*sizeof(Int) in size.
- *
- * To check the fset:	    cholmod_check_perm (fset, fsize, ncol, Common) ;
- * To check a permutation:  cholmod_check_perm (Perm, n, n, Common) ;
- *
- * workspace:  Flag (n) if n <= Common->nrow, Iwork (n) otherwise.
- */
-
-static int check_perm
-(
-    Int *Wi,
-    Int print,
-    const char *name,
-    Int *Perm,
-    size_t len,
-    size_t n,
-    cholmod_common *Common
-)
-{
-    Int *Flag ;
-    Int i, k, mark, init_print, count ;
-    const char *type = "perm" ;
-
-    /* ---------------------------------------------------------------------- */
-    /* checks that take O(1) time */
-    /* ---------------------------------------------------------------------- */
-
-    if (Perm == NULL || n == 0)
-    {
-	/* Perm is valid implicit identity, or empty */
-	return (TRUE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* checks that take O(n) time or require memory allocation */
-    /* ---------------------------------------------------------------------- */
-
-    init_print = print ;
-    ETC_START (count, 8) ;
-
-    if (Wi == NULL && n <= Common->nrow)
-    {
-	/* use the Common->Flag array if it's big enough */
-	mark = CHOLMOD(clear_flag) (Common) ;
-	Flag = Common->Flag ;
-	ASSERT (CHOLMOD(dump_work) (TRUE, FALSE, 0, Common)) ;
-	if (print >= 4)
-	{
-	    for (k = 0 ; k < ((Int) len) ; k++)
-	    {
-		ETC (k >= ((Int) len) - 4, count, -1) ;
-		i = Perm [k] ;
-		P4 ("  "I8":", k) ;
-		P4 (""ID"\n", i) ;
-		if (i < 0 || i >= ((Int) n) || Flag [i] == mark)
-		{
-		    CHOLMOD(clear_flag) (Common) ;
-		    ERR ("invalid permutation") ;
-		}
-		Flag [i] = mark ;
-	    }
-	}
-	else
-	{
-	    for (k = 0 ; k < ((Int) len) ; k++)
-	    {
-		i = Perm [k] ;
-		if (i < 0 || i >= ((Int) n) || Flag [i] == mark)
-		{
-		    CHOLMOD(clear_flag) (Common) ;
-		    ERR ("invalid permutation") ;
-		}
-		Flag [i] = mark ;
-	    }
-	}
-	CHOLMOD(clear_flag) (Common) ;
-	ASSERT (CHOLMOD(dump_work) (TRUE, FALSE, 0, Common)) ;
-    }
-    else
-    {
-	if (Wi == NULL)
-	{
-	    /* use Common->Iwork instead, but initialize it first */
-	    CHOLMOD(allocate_work) (0, n, 0, Common) ;
-	    Wi = Common->Iwork ;		    /* size n, (i/i/i) is OK */
-	}
-	if (Common->status < CHOLMOD_OK)
-	{
-	    return (FALSE) ;	    /* out of memory */
-	}
-	for (i = 0 ; i < ((Int) n) ; i++)
-	{
-	    Wi [i] = FALSE ;
-	}
-	if (print >= 4)
-	{
-	    for (k = 0 ; k < ((Int) len) ; k++)
-	    {
-		ETC (k >= ((Int) len) - 4, count, -1) ;
-		i = Perm [k] ;
-		P4 ("  "I8":", k) ;
-		P4 (""ID"\n", i) ;
-		if (i < 0 || i >= ((Int) n) || Wi [i])
-		{
-		    ERR ("invalid permutation") ;
-		}
-		Wi [i] = TRUE ;
-	    }
-	}
-	else
-	{
-	    for (k = 0 ; k < ((Int) len) ; k++)
-	    {
-		i = Perm [k] ;
-		if (i < 0 || i >= ((Int) n) || Wi [i])
-		{
-		    ERR ("invalid permutation") ;
-		}
-		Wi [i] = TRUE ;
-	    }
-	}
-    }
-
-    /* perm is valid */
-    return (TRUE) ;
-}
-
-
-int CHOLMOD(check_perm)
-(
-    /* ---- input ---- */
-    Int *Perm,		/* Perm [0:len-1] is a permutation of subset of 0:n-1 */
-    size_t len,		/* size of Perm (an integer array) */
-    size_t n,		/* 0:n-1 is valid range */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_perm (NULL, 0, NULL, Perm, len, n, Common)) ;
-}
-
-
-int CHOLMOD(print_perm)
-(
-    /* ---- input ---- */
-    Int *Perm,		/* Perm [0:len-1] is a permutation of subset of 0:n-1 */
-    size_t len,		/* size of Perm (an integer array) */
-    size_t n,		/* 0:n-1 is valid range */
-    const char *name,	/* printed name of Perm */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int ok, print ;
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    print = Common->print ;
-    P4 ("%s", "\n") ;
-    P3 ("%s", "CHOLMOD perm:    ") ;
-    if (name != NULL)
-    {
-	P3 ("%s: ", name) ;
-    }
-    P3 (" len: "ID"", (Int) len) ;
-    P3 (" n: "ID"", (Int) n) ;
-    P4 ("%s", "\n") ;
-    ok = check_perm (NULL, print, name, Perm, len, n, Common) ;
-    if (ok)
-    {
-	P3 ("%s", "  OK\n") ;
-	P4 ("%s", "\n") ;
-    }
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_check_parent ================================================= */
-/* ========================================================================== */
-
-/* Ensure that Parent is a valid elimination tree of nodes 0 to n-1.
- * If j is a root of the tree then Parent [j] is EMPTY (-1).
- *
- * NOTE: this check will fail if applied to the component tree (CParent) in
- * cholmod_nested_dissection, unless it has been postordered and renumbered.
- *
- * workspace: none
- */
-
-static int check_parent
-(
-    Int *Parent,
-    size_t n,
-    Int print,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    Int j, p, init_print, count ;
-    const char *type = "parent" ;
-
-    init_print = print ;
-
-    P4 ("%s", "\n") ;
-    P3 ("%s", "CHOLMOD parent:  ") ;
-    if (name != NULL)
-    {
-	P3 ("%s: ", name) ;
-    }
-
-    P3 (" n: "ID"", (Int) n) ;
-    P4 ("%s", "\n") ;
-
-    if (Parent == NULL)
-    {
-	ERR ("null") ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* checks that take O(n) time */
-    /* ---------------------------------------------------------------------- */
-
-    ETC_START (count, 8) ;
-    for (j = 0 ; j < ((Int) n) ; j++)
-    {
-	ETC (j == ((Int) n) - 4, count, -1) ;
-	p = Parent [j] ;
-	P4 ("  "I8":", j) ;
-	P4 (" "ID"\n", p) ;
-	if (!(p == EMPTY || p > j))
-	{
-	    ERR ("invalid") ;
-	}
-    }
-    P3 ("%s", "  OK\n") ;
-    P4 ("%s", "\n") ;
-    return (TRUE) ;
-}
-
-
-int CHOLMOD(check_parent)
-(
-    /* ---- input ---- */
-    Int *Parent,	/* Parent [0:n-1] is an elimination tree */
-    size_t n,		/* size of Parent */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_parent (Parent, n, 0, NULL, Common)) ;
-}
-
-
-int CHOLMOD(print_parent)
-(
-    /* ---- input ---- */
-    Int *Parent,	/* Parent [0:n-1] is an elimination tree */
-    size_t n,		/* size of Parent */
-    const char *name,	/* printed name of Parent */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_parent (Parent, n, Common->print, name, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_check_factor ================================================= */
-/* ========================================================================== */
-
-static int check_factor
-(
-    Int *Wi,
-    Int print,
-    const char *name,
-    cholmod_factor *L,
-    cholmod_common *Common
-)
-{
-    double *Lx, *Lz ;
-    Int *Lp, *Li, *Lnz, *Lnext, *Lprev, *Perm, *ColCount, *Lpi, *Lpx, *Super,
-	*Ls ;
-    Int n, nzmax, j, p, pend, i, nz, ordering, space, is_monotonic, minor,
-	count, precise, init_print, ilast, lnz, head, tail, jprev, plast,
-	jnext, examine_super, nsuper, s, k1, k2, psi, psend, psx, nsrow, nscol,
-	ps2, psxend, ssize, xsize, maxcsize, maxesize, nsrow2, jj, ii, xtype ;
-    Int check_Lpx ;
-    const char *type = "factor" ;
-
-    /* ---------------------------------------------------------------------- */
-    /* print header information */
-    /* ---------------------------------------------------------------------- */
-
-    P4 ("%s", "\n") ;
-    P3 ("%s", "CHOLMOD factor:  ") ;
-    if (name != NULL)
-    {
-	P3 ("%s: ", name) ;
-    }
-
-    if (L == NULL)
-    {
-	ERR ("null") ;
-    }
-
-    n = L->n ;
-    minor = L->minor ;
-    ordering = L->ordering ;
-    xtype = L->xtype ;
-
-    Perm = L->Perm ;
-    ColCount = L->ColCount ;
-    lnz = 0 ;
-
-    precise = Common->precise ;
-
-    P3 (" "ID"", n) ;
-    P3 ("-by-"ID"", n) ;
-
-    if (minor < n)
-    {
-	P3 (" not positive definite (column "ID")", minor) ;
-    }
-
-    switch (L->itype)
-    {
-	case CHOLMOD_INT:     P4 ("%s", "\n  scalar types: int, ") ; break ;
-	case CHOLMOD_INTLONG: ERR ("mixed int/long type unsupported") ;
-	case CHOLMOD_LONG:    P4 ("%s", "\n  scalar types: SuiteSparse_long, ");
-        break ;
-	default:	      ERR ("unknown itype") ;
-    }
-
-    switch (L->xtype)
-    {
-	case CHOLMOD_PATTERN: P4 ("%s", "pattern") ;	break ;
-	case CHOLMOD_REAL:    P4 ("%s", "real") ;	break ;
-	case CHOLMOD_COMPLEX: P4 ("%s", "complex") ;	break ;
-	case CHOLMOD_ZOMPLEX: P4 ("%s", "zomplex") ;	break ;
-	default:	      ERR ("unknown xtype") ;
-    }
-
-    switch (L->dtype)
-    {
-	case CHOLMOD_DOUBLE:  P4 ("%s", ", double\n") ;	       break ;
-	case CHOLMOD_SINGLE:  ERR ("single unsupported") ;
-	default:	      ERR ("unknown dtype") ;
-    }
-
-    if (L->itype != ITYPE || L->dtype != DTYPE)
-    {
-	ERR ("integer and real type must match routine") ;
-    }
-
-    if (L->is_super)
-    {
-	P3 ("%s", "  supernodal") ;
-    }
-    else
-    {
-	P3 ("%s", "  simplicial") ;
-    }
-
-    if (L->is_ll)
-    {
-	P3 ("%s", ", LL'.") ;
-    }
-    else
-    {
-	P3 ("%s", ", LDL'.") ;
-    }
-
-    P4 ("%s", "\n  ordering method used: ") ;
-    switch (L->ordering)
-    {
-	case CHOLMOD_POSTORDERED:P4 ("%s", "natural (postordered)") ;	 break ;
-	case CHOLMOD_NATURAL:	P4 ("%s", "natural") ;			 break ;
-	case CHOLMOD_GIVEN:	P4 ("%s", "user-provided") ;		 break ;
-	case CHOLMOD_AMD:	P4 ("%s", "AMD") ;			 break ;
-	case CHOLMOD_COLAMD:	P4 ("%s", "AMD for A, COLAMD for A*A'") ;break ;
-#ifndef NPARTITION
-	case CHOLMOD_METIS:	P4 ("%s", "METIS NodeND") ;		 break ;
-	case CHOLMOD_NESDIS:	P4 ("%s", "CHOLMOD nested dissection") ; break ;
-#endif
-	default:		ERR ("unknown ordering") ;
-    }
-
-    P4 ("%s", "\n") ;
-
-    init_print = print ;
-
-    if (L->is_super && L->xtype == CHOLMOD_ZOMPLEX)
-    {
-	ERR ("Supernodal zomplex L not supported") ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* check L->Perm */
-    /* ---------------------------------------------------------------------- */
-
-    if (!check_perm (Wi, print, name, Perm, n, n, Common))
-    {
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* check L->ColCount */
-    /* ---------------------------------------------------------------------- */
-
-    if (ColCount == NULL)
-    {
-	ERR ("ColCount vector invalid") ;
-    }
-
-    ETC_START (count, 8) ;
-    for (j = 0 ; j < n ; j++)
-    {
-	ETC (j >= n-4, count, -1) ;
-	P4 ("  col: "ID" ", j) ;
-	nz = ColCount [j] ;
-	P4 ("colcount: "ID"\n", nz) ;
-	if (nz < 0 || nz > n-j)
-	{
-	    ERR ("ColCount out of range") ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* check factor */
-    /* ---------------------------------------------------------------------- */
-
-    if (L->xtype == CHOLMOD_PATTERN && !(L->is_super))
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* check simplicial symbolic factor */
-	/* ------------------------------------------------------------------ */
-
-	/* nothing else to do */ ;
-
-    }
-    else if (L->xtype != CHOLMOD_PATTERN && !(L->is_super))
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* check simplicial numerical factor */
-	/* ------------------------------------------------------------------ */
-
-	P4 ("monotonic: %d\n", L->is_monotonic) ;
-	nzmax = L->nzmax ;
-	P3 (" nzmax "ID".", nzmax) ;
-	P4 ("%s", "\n") ;
-	Lp = L->p ;
-	Li = L->i ;
-	Lx = L->x ;
-	Lz = L->z ;
-	Lnz = L->nz ;
-	Lnext = L->next ;
-	Lprev = L->prev ;
-
-	/* check for existence of Lp, Li, Lnz, Lnext, Lprev, and Lx arrays */
-	if (Lp == NULL)
-	{
-	    ERR ("p array not present") ;
-	}
-	if (Li == NULL)
-	{
-	    ERR ("i array not present") ;
-	}
-	if (Lnz == NULL)
-	{
-	    ERR ("nz array not present") ;
-	}
-	if (Lx == NULL)
-	{
-	    ERR ("x array not present") ;
-	}
-	if (xtype == CHOLMOD_ZOMPLEX && Lz == NULL)
-	{
-	    ERR ("z array not present") ;
-	}
-	if (Lnext == NULL)
-	{
-	    ERR ("next array not present") ;
-	}
-	if (Lprev == NULL)
-	{
-	    ERR ("prev array not present") ;
-	}
-
-	ETC_START (count, 8) ;
-
-	/* check each column of L */
-	plast = 0 ;
-	is_monotonic = TRUE ;
-	for (j = 0 ; j < n ; j++)
-	{
-	    ETC (j >= n-3, count, -1) ;
-	    p = Lp [j] ;
-	    nz = Lnz [j] ;
-	    pend = p + nz ;
-	    lnz += nz ;
-
-	    P4 ("  col "ID":", j) ;
-	    P4 (" nz "ID"", nz) ;
-	    P4 (" start "ID"", p) ;
-	    P4 (" end "ID"", pend) ;
-
-	    if (Lnext [j] < 0 || Lnext [j] > n)
-	    {
-		ERR ("invalid link list")  ;
-	    }
-	    space = Lp [Lnext [j]] - p ;
-
-	    P4 (" space "ID"", space) ;
-	    P4 (" free "ID":\n", space - nz) ;
-
-	    if (p < 0 || pend > nzmax || space < 1)
-	    {
-		ERR ("pointer invalid") ;
-	    }
-	    if (nz < 1 || nz > (n-j) || nz > space)
-	    {
-		ERR ("nz invalid") ;
-	    }
-	    ilast = j-1 ;
-
-	    if (p < plast)
-	    {
-		is_monotonic = FALSE ;
-	    }
-	    plast = p ;
-
-	    i = Li [p] ;
-	    P4 ("  "I8":", i) ;
-	    if (i != j)
-	    {
-		ERR ("diagonal missing") ;
-	    }
-
-	    print_value (print, xtype, Lx, Lz, p, Common) ;
-
-	    P4 ("%s", "\n") ;
-	    ilast = j ;
-	    for (p++ ; p < pend ; p++)
-	    {
-		ETC_DISABLE (count) ;
-		i = Li [p] ;
-		P4 ("  "I8":", i) ;
-		if (i < j || i >= n)
-		{
-		    ERR ("row index out of range") ;
-		}
-		if (i <= ilast)
-		{
-		    ERR ("row indices out of order") ;
-		}
-
-		print_value (print, xtype, Lx, Lz, p, Common) ;
-
-		P4 ("%s", "\n") ;
-		ilast = i ;
-	    }
-	}
-
-	if (L->is_monotonic && !is_monotonic)
-	{
-	    ERR ("columns not monotonic") ;
-	}
-
-	/* check the link list */
-	head = n+1 ;
-	tail = n ;
-	j = head ;
-	jprev = EMPTY ;
-	count = 0 ;
-	for ( ; ; )
-	{
-	    if (j < 0 || j > n+1 || count > n+2)
-	    {
-		ERR ("invalid link list") ;
-	    }
-	    jnext = Lnext [j] ;
-	    if (j >= 0 && j < n)
-	    {
-		if (jprev != Lprev [j])
-		{
-		    ERR ("invalid link list") ;
-		}
-	    }
-	    count++ ;
-	    if (j == tail)
-	    {
-		break ;
-	    }
-	    jprev = j ;
-	    j = jnext ;
-	}
-	if (Lnext [tail] != EMPTY || count != n+2)
-	{
-	    ERR ("invalid link list") ;
-	}
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* check supernodal numeric or symbolic factor */
-	/* ------------------------------------------------------------------ */
-
-	nsuper = L->nsuper ;
-	ssize = L->ssize ;
-	xsize = L->xsize ;
-	maxcsize = L->maxcsize ;
-	maxesize = L->maxesize ;
-	Ls = L->s ;
-	Lpi = L->pi ;
-	Lpx = L->px ;
-	Super = L->super ;
-	Lx = L->x ;
-	ETC_START (count, 8) ;
-
-	P4 ("  ssize "ID" ", ssize) ;
-	P4 ("xsize "ID" ", xsize) ;
-	P4 ("maxcsize "ID" ", maxcsize) ;
-	P4 ("maxesize "ID"\n", maxesize) ;
-
-	if (Ls == NULL)
-	{
-	    ERR ("invalid: L->s missing") ;
-	}
-	if (Lpi == NULL)
-	{
-	    ERR ("invalid: L->pi missing") ;
-	}
-	if (Lpx == NULL)
-	{
-	    ERR ("invalid: L->px missing") ;
-	}
-	if (Super == NULL)
-	{
-	    ERR ("invalid: L->super missing") ;
-	}
-
-	if (L->xtype != CHOLMOD_PATTERN)
-	{
-	    /* numerical supernodal factor */
-	    if (Lx == NULL)
-	    {
-		ERR ("invalid: L->x missing") ;
-	    }
-	    if (Ls [0] == EMPTY)
-	    {
-		ERR ("invalid: L->s not defined") ;
-	    }
-	    examine_super = TRUE ;
-	}
-	else
-	{
-	    /* symbolic supernodal factor, but only if it has been computed */
-	    examine_super = (Ls [0] != EMPTY) ;
-	}
-
-	if (examine_super)
-	{
-	    if (Lpi [0] != 0 || MAX (1, Lpi [nsuper]) != ssize)
-	    {
-		PRINT0 (("Lpi [0] "ID", Lpi [nsuper = "ID"] = "ID"\n",
-			Lpi [0], nsuper, Lpi [nsuper])) ;
-		ERR ("invalid: L->pi invalid") ;
-	    }
-
-            /* If Lpx [0] is 123456, then supernodes are present but
-               Lpx [0...nsuper] is not defined, so don't check it.  This is
-               used in the non-GPU accelerated SPQR */
-            check_Lpx = (Lpx [0] != 123456) ;
-	    if (check_Lpx && (Lpx [0] != 0 || MAX (1, Lpx[nsuper]) != xsize))
-	    {
-		ERR ("invalid: L->px invalid") ;
-	    }
-
-	    /* check and print each supernode */
-	    for (s = 0 ; s < nsuper ; s++)
-	    {
-		k1 = Super [s] ;
-		k2 = Super [s+1] ;
-		psi = Lpi [s] ;
-		psend = Lpi [s+1] ;
-		nsrow = psend - psi ;
-		nscol = k2 - k1 ;
-		nsrow2 = nsrow - nscol ;
-		ps2 = psi + nscol ;
-
-                if (check_Lpx)
-                {
-                    psx = Lpx [s] ;
-                    psxend = Lpx [s+1] ;
-                }
-
-		ETC (s == nsuper-1, count, 4) ;
-
-		P4 ("  supernode "ID", ", s) ;
-		P4 ("col "ID" ", k1) ;
-		P4 ("to "ID". ", k2-1) ;
-		P4 ("nz in first col: "ID".\n", nsrow) ;
-
-                if (check_Lpx)
-                {
-                    P4 ("  values start "ID", ", psx) ;
-                    P4 ("end "ID"\n", psxend) ;
-                }
-
-		if (k1 > k2 || k1 < 0 || k2 > n || nsrow < nscol || nsrow2 < 0
-                    || (check_Lpx && psxend - psx != nsrow * nscol))
-		{
-		    ERR ("invalid supernode") ;
-		}
-
-		lnz += nscol * nsrow - (nscol*nscol - nscol)/2 ;
-
-		if (L->xtype != CHOLMOD_PATTERN)
-		{
-		    /* print each column of the supernode */
-		    for (jj = 0 ; jj < nscol ; jj++)
-		    {
-			ETC_ENABLE (s == nsuper-1 && jj >= nscol-3, count, -1) ;
-			j = k1 + jj ;
-			P4 ("  col "ID"\n", j) ;
-			ilast = j ;
-			i = Ls [psi + jj] ;
-			P4 ("  "I8":", i) ;
-			if (i != j)
-			{
-			    ERR ("row index invalid") ;
-			}
-
-			/* PRINTVALUE (Lx [psx + jj + jj*nsrow]) ; */
-			print_value (print, xtype, Lx, NULL,
-				psx + jj + jj*nsrow, Common) ;
-
-			P4 ("%s", "\n") ;
-			for (ii = jj + 1 ; ii < nsrow ; ii++)
-			{
-			    ETC_DISABLE (count) ;
-			    i = Ls [psi + ii] ;
-			    P4 ("  "I8":", i) ;
-			    if (i <= ilast || i > n)
-			    {
-				ERR ("row index out of range") ;
-			    }
-
-			    /* PRINTVALUE (Lx [psx + ii + jj*nsrow]) ; */
-			    print_value (print, xtype, Lx, NULL,
-				    psx + ii + jj*nsrow, Common) ;
-
-			    P4 ("%s", "\n") ;
-			    ilast = i ;
-			}
-		    }
-		}
-		else
-		{
-		    /* just print the leading column of the supernode */
-		    P4 ("  col "ID"\n", k1) ;
-		    for (jj = 0 ; jj < nscol ; jj++)
-		    {
-			ETC (s == nsuper-1 && jj >= nscol-3, count, -1) ;
-			j = k1 + jj ;
-			i = Ls [psi + jj] ;
-			P4 ("  "I8"", i) ;
-			if (i != j)
-			{
-			    ERR ("row index invalid") ;
-			}
-			P4 ("%s", "\n") ;
-		    }
-		    ilast = j ;
-		    for (ii = nscol ; ii < nsrow ; ii++)
-		    {
-			ETC_DISABLE (count) ;
-			i = Ls [psi + ii] ;
-			P4 ("  "I8"", i) ;
-			if (i <= ilast || i > n)
-			{
-			    ERR ("row index out of range") ;
-			}
-			P4 ("%s", "\n") ;
-			ilast = i ;
-		    }
-		}
-	    }
-	}
-    }
-
-    /* factor is valid */
-    P3 ("  nz "ID"", lnz) ;
-    P3 ("%s", "  OK\n") ;
-    P4 ("%s", "\n") ;
-    return (TRUE) ;
-}
-
-
-int CHOLMOD(check_factor)
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to check */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_factor (NULL, 0, NULL, L, Common)) ;
-}
-
-
-int CHOLMOD(print_factor)
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to print */
-    const char *name,	/* printed name of factor */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_factor (NULL, Common->print, name, L, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_check_triplet ================================================ */
-/* ========================================================================== */
-
-/* Ensure a triplet matrix is valid, and optionally print it. */
-
-static int check_triplet
-(
-    Int print,
-    const char *name,
-    cholmod_triplet *T,
-    cholmod_common *Common
-)
-{
-    double *Tx, *Tz ;
-    Int *Ti, *Tj ;
-    Int i, j, p, nrow, ncol, nzmax, nz, xtype, init_print, count ;
-    const char *type = "triplet" ;
-
-    /* ---------------------------------------------------------------------- */
-    /* print header information */
-    /* ---------------------------------------------------------------------- */
-
-    P4 ("%s", "\n") ;
-    P3 ("%s", "CHOLMOD triplet: ") ;
-    if (name != NULL)
-    {
-	P3 ("%s: ", name) ;
-    }
-
-    if (T == NULL)
-    {
-	ERR ("null") ;
-    }
-
-    nrow = T->nrow ;
-    ncol = T->ncol ;
-    nzmax = T->nzmax ;
-    nz = T->nnz ;
-    Ti = T->i ;
-    Tj = T->j ;
-    Tx = T->x ;
-    Tz = T->z ;
-    xtype = T->xtype ;
-
-
-    P3 (" "ID"", nrow) ;
-    P3 ("-by-"ID", ", ncol) ;
-    P3 ("nz "ID",", nz) ;
-    if (T->stype > 0)
-    {
-	P3 ("%s", " upper.") ;
-    }
-    else if (T->stype < 0)
-    {
-	P3 ("%s", " lower.") ;
-    }
-    else
-    {
-	P3 ("%s", " up/lo.") ;
-    }
-
-    P4 ("\n  nzmax "ID", ", nzmax) ;
-    if (nz > nzmax)
-    {
-	ERR ("nzmax too small") ;
-    }
-
-    switch (T->itype)
-    {
-	case CHOLMOD_INT:     P4 ("%s", "\n  scalar types: int, ") ; break ;
-	case CHOLMOD_INTLONG: ERR ("mixed int/long type unsupported") ;
-	case CHOLMOD_LONG:    P4 ("%s", "\n  scalar types: SuiteSparse_long, ");
-        break ;
-	default:	      ERR ("unknown itype") ;
-    }
-
-    switch (T->xtype)
-    {
-	case CHOLMOD_PATTERN: P4 ("%s", "pattern") ;	break ;
-	case CHOLMOD_REAL:    P4 ("%s", "real") ;	break ;
-	case CHOLMOD_COMPLEX: P4 ("%s", "complex") ;	break ;
-	case CHOLMOD_ZOMPLEX: P4 ("%s", "zomplex") ;	break ;
-	default:	      ERR ("unknown xtype") ;
-    }
-
-    switch (T->dtype)
-    {
-	case CHOLMOD_DOUBLE:  P4 ("%s", ", double\n") ;	       break ;
-	case CHOLMOD_SINGLE:  ERR ("single unsupported") ;
-	default:	      ERR ("unknown dtype") ;
-    }
-
-    if (T->itype != ITYPE || T->dtype != DTYPE)
-    {
-	ERR ("integer and real type must match routine") ;
-    }
-
-    if (T->stype && nrow != ncol)
-    {
-	ERR ("symmetric but not square") ;
-    }
-
-    /* check for existence of Ti, Tj, Tx arrays */
-    if (Tj == NULL)
-    {
-	ERR ("j array not present") ;
-    }
-    if (Ti == NULL)
-    {
-	ERR ("i array not present") ;
-    }
-
-    if (xtype != CHOLMOD_PATTERN && Tx == NULL)
-    {
-	ERR ("x array not present") ;
-    }
-    if (xtype == CHOLMOD_ZOMPLEX && Tz == NULL)
-    {
-	ERR ("z array not present") ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* check and print each entry */
-    /* ---------------------------------------------------------------------- */
-
-    init_print = print ;
-    ETC_START (count, 8) ;
-
-    for (p = 0 ; p < nz ; p++)
-    {
-	ETC (p >= nz-4, count, -1) ;
-	i = Ti [p] ;
-	P4 ("  "I8":", p) ;
-	P4 (" "I_8"", i) ;
-	if (i < 0 || i >= nrow)
-	{
-	    ERR ("row index out of range") ;
-	}
-	j = Tj [p] ;
-	P4 (" "I_8"", j) ;
-	if (j < 0 || j >= ncol)
-	{
-	    ERR ("column index out of range") ;
-	}
-
-	print_value (print, xtype, Tx, Tz, p, Common) ;
-
-	P4 ("%s", "\n") ;
-    }
-
-    /* triplet matrix is valid */
-    P3 ("%s", "  OK\n") ;
-    P4 ("%s", "\n") ;
-    return (TRUE) ;
-}
-
-
-
-int CHOLMOD(check_triplet)
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* triplet matrix to check */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_triplet (0, NULL, T, Common)) ;
-}
-
-
-int CHOLMOD(print_triplet)
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* triplet matrix to print */
-    const char *name,	/* printed name of triplet matrix */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    return (check_triplet (Common->print, name, T, Common)) ;
-}
-
-
-
-/* ========================================================================== */
-/* === CHOLMOD debugging routines =========================================== */
-/* ========================================================================== */
-
-#ifndef NDEBUG
-
-/* The global variables present only when debugging enabled. */
-int CHOLMOD(dump) = 0 ;
-int CHOLMOD(dump_malloc) = -1 ;
-
-/* workspace: no debug routines use workspace in Common */
-
-/* ========================================================================== */
-/* === cholmod_dump_init ==================================================== */
-/* ========================================================================== */
-
-void CHOLMOD(dump_init) (const char *s, cholmod_common *Common)
-{
-    int i = 0 ;
-    FILE *f ;
-    f = fopen ("debug", "r") ;
-    CHOLMOD(dump) = 0 ;
-    if (f != NULL)
-    {
-	i = fscanf (f, "%d", &CHOLMOD(dump)) ;
-	fclose (f) ;
-    }
-    PRINT1 (("%s: cholmod_dump_init, D = %d\n", s, CHOLMOD(dump))) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_sparse ================================================== */
-/* ========================================================================== */
-
-/* returns nnz (diag (A)) or EMPTY if error */
-
-SuiteSparse_long CHOLMOD(dump_sparse)
-(
-    cholmod_sparse *A,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    Int *Wi ;
-    SuiteSparse_long nnzdiag ;
-    Int ok ;
-
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return (0) ;
-    }
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    Wi = malloc (MAX (1, A->nrow) * sizeof (Int)) ;
-    ok = check_sparse (Wi, CHOLMOD(dump), name, A, &nnzdiag, Common) ;
-    if (Wi != NULL) free (Wi) ;
-    return (ok ? nnzdiag : EMPTY) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_factor ================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(dump_factor)
-(
-    cholmod_factor *L,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    Int *Wi ;
-    int ok ;
-
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return (TRUE) ;
-    }
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    Wi = malloc (MAX (1, L->n) * sizeof (Int)) ;
-    ok = check_factor (Wi, CHOLMOD(dump), name, L, Common) ;
-    if (Wi != NULL) free (Wi) ;
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_perm ==================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(dump_perm)
-(
-    Int *Perm,
-    size_t len,
-    size_t n,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    Int *Wi ;
-    int ok ;
-
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return (TRUE) ;
-    }
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Wi = malloc (MAX (1, n) * sizeof (Int)) ;
-    ok = check_perm (Wi, CHOLMOD(dump), name, Perm, len, n,Common) ;
-    if (Wi != NULL) free (Wi) ;
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_dense =================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(dump_dense)
-(
-    cholmod_dense *X,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return (TRUE) ;
-    }
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    return (check_dense (CHOLMOD(dump), name, X, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_triplet ================================================= */
-/* ========================================================================== */
-
-int CHOLMOD(dump_triplet)
-(
-    cholmod_triplet *T,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return (TRUE) ;
-    }
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    return (check_triplet (CHOLMOD(dump), name, T, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_subset ================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(dump_subset)
-(
-    Int *S,
-    size_t len,
-    size_t n,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return (TRUE) ;
-    }
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    return (check_subset (S, len, n, CHOLMOD(dump), name, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_parent ================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(dump_parent)
-(
-    Int *Parent,
-    size_t n,
-    const char *name,
-    cholmod_common *Common
-)
-{
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return (TRUE) ;
-    }
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    return (check_parent (Parent, n, CHOLMOD(dump), name, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_real ==================================================== */
-/* ========================================================================== */
-
-void CHOLMOD(dump_real)
-(
-    const char *name,
-    Real *X, SuiteSparse_long nrow, SuiteSparse_long ncol, int lower,
-    int xentry, cholmod_common *Common
-)
-{
-    /* dump an nrow-by-ncol real dense matrix */
-    SuiteSparse_long i, j ;
-    double x, z ;
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return ;
-    }
-    PRINT1 (("%s: dump_real, nrow: %ld ncol: %ld lower: %d\n",
-		name, nrow, ncol, lower)) ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	PRINT2 (("    col %ld\n", j)) ;
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    /* X is stored in column-major form */
-	    if (lower && i < j)
-	    {
-		PRINT2 (("        %5ld: -", i)) ;
-	    }
-	    else
-	    {
-		x = *X ;
-		PRINT2 (("        %5ld: %e", i, x)) ;
-		if (xentry == 2)
-		{
-		    z = *(X+1) ;
-		    PRINT2 ((", %e", z)) ;
-		}
-	    }
-	    PRINT2 (("\n")) ;
-	    X += xentry ;
-	}
-    }
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_super =================================================== */
-/* ========================================================================== */
-
-void CHOLMOD(dump_super)
-(
-    SuiteSparse_long s,
-    Int *Super, Int *Lpi, Int *Ls, Int *Lpx, double *Lx,
-    int xentry,
-    cholmod_common *Common
-)
-{
-    Int k1, k2, do_values, psi, psx, nsrow, nscol, psend, ilast, p, i ;
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return ;
-    }
-    k1 = Super [s] ;
-    k2 = Super [s+1] ;
-    nscol = k2 - k1 ;
-    do_values = (Lpx != NULL) && (Lx != NULL) ;
-    psi = Lpi [s] ;
-    psend = Lpi [s+1] ;
-    nsrow = psend - psi ;
-    PRINT1 (("\nSuper %ld, columns "ID" to "ID", "ID" rows "ID" cols\n",
-		s, k1, k2-1, nsrow, nscol)) ;
-    ilast = -1 ;
-    for (p = psi ; p < psend ; p++)
-    {
-	i = Ls [p] ;
-	PRINT2 (("  "ID" : p-psi "ID"\n", i, p-psi)) ;
-	ASSERT (IMPLIES (p-psi < nscol, i == k1 + (p-psi))) ;
-	if (p-psi == nscol-1) PRINT2 (("------\n")) ;
-	ASSERT (i > ilast) ;
-	ilast = i ;
-    }
-    if (do_values)
-    {
-	psx = Lpx [s] ;
-	CHOLMOD(dump_real) ("Supernode", Lx + xentry*psx, nsrow, nscol, TRUE, 
-		xentry, Common) ;
-    }
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_mem ===================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(dump_mem)
-(
-    const char *where,
-    SuiteSparse_long should,
-    cholmod_common *Common
-)
-{
-    SuiteSparse_long diff = should - Common->memory_inuse ;
-    if (diff != 0)
-    {
-	PRINT0 (("mem: %-15s peak %10g inuse %10g should %10g\n",
-	    where, (double) Common->memory_usage, (double) Common->memory_inuse,
-	    (double) should)) ;
-	PRINT0 (("mem: %s diff %ld !\n", where, diff)) ;
-    }
-    return (diff == 0) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_partition =============================================== */
-/* ========================================================================== */
-
-/* make sure we have a proper separator (for debugging only)
- *
- * workspace: none
- */
-
-int CHOLMOD(dump_partition)
-(
-    SuiteSparse_long n,
-    Int *Cp,
-    Int *Ci,
-    Int *Cnw,
-    Int *Part,
-    SuiteSparse_long sepsize,
-    cholmod_common *Common
-)
-{
-    Int chek [3], which, ok, i, j, p ;
-    PRINT1 (("bisect sepsize %ld\n", sepsize)) ;
-    ok = TRUE ;
-    chek [0] = 0 ;
-    chek [1] = 0 ;
-    chek [2] = 0 ;
-    for (j = 0 ; j < n ; j++)
-    {
-	PRINT2 (("--------j "ID" in part "ID" nw "ID"\n", j, Part [j], Cnw[j]));
-	which = Part [j] ;
-	for (p = Cp [j] ; p < Cp [j+1] ; p++)
-	{
-	    i = Ci [p] ;
-	    PRINT3 (("i "ID", part "ID"\n", i, Part [i])) ;
-	    if (which == 0)
-	    {
-		if (Part [i] == 1)
-		{
-		    PRINT0 (("Error! "ID" "ID"\n", i, j)) ;
-		    ok = FALSE ;
-		}
-	    }
-	    else if (which == 1)
-	    {
-		if (Part [i] == 0)
-		{
-		    PRINT0 (("Error! "ID" "ID"\n", i, j)) ;
-		    ok = FALSE ;
-		}
-	    }
-	}
-	if (which < 0 || which > 2)
-	{
-	    PRINT0 (("Part out of range\n")) ;
-	    ok = FALSE ;
-	}
-	chek [which] += Cnw [j] ;
-    }
-    PRINT1 (("sepsize %ld check "ID" "ID" "ID"\n",
-		sepsize, chek[0], chek[1],chek[2]));
-    if (sepsize != chek[2])
-    {
-	PRINT0 (("mismatch!\n")) ;
-	ok = FALSE ;
-    }
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dump_work ==================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(dump_work) (int flag, int head, SuiteSparse_long wsize,
-    cholmod_common *Common)
-{
-    double *W ;
-    Int *Flag, *Head ;
-    Int k, nrow, mark ;
-
-    if (CHOLMOD(dump) < -1)
-    {
-	/* no checks if debug level is -2 or less */
-	return (TRUE) ;
-    }
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    nrow = Common->nrow ;
-    Flag = Common->Flag ;
-    Head = Common->Head ;
-    W = Common->Xwork ;
-    mark = Common->mark ;
-
-    if (wsize < 0)
-    {
-	/* check all of Xwork */
-	wsize = Common->xworksize ;
-    }
-    else
-    {
-	/* check on the first wsize doubles in Xwork */
-	wsize = MIN (wsize, (Int) (Common->xworksize)) ;
-    }
-
-    if (flag)
-    {
-	for (k = 0 ; k < nrow ; k++)
-	{
-	    if (Flag [k] >= mark)
-	    {
-		PRINT0 (("Flag invalid, Flag ["ID"] = "ID", mark = "ID"\n",
-			    k, Flag [k], mark)) ;
-		ASSERT (0) ;
-		return (FALSE) ;
-	    }
-	}
-    }
-
-    if (head)
-    {
-	for (k = 0 ; k < nrow ; k++)
-	{
-	    if (Head [k] != EMPTY)
-	    {
-		PRINT0 (("Head invalid, Head ["ID"] = "ID"\n", k, Head [k])) ;
-		ASSERT (0) ;
-		return (FALSE) ;
-	    }
-	}
-    }
-
-    for (k = 0 ; k < wsize ; k++)
-    {
-	if (W [k] != 0.)
-	{
-	    PRINT0 (("W invalid, W ["ID"] = %g\n", k, W [k])) ;
-	    ASSERT (0) ;
-	    return (FALSE) ;
-	}
-    }
-
-    return (TRUE) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Check/cholmod_read.c b/src/C/SuiteSparse/CHOLMOD/Check/cholmod_read.c
deleted file mode 100644
index 144fd60..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Check/cholmod_read.c
+++ /dev/null
@@ -1,1319 +0,0 @@
-/* ========================================================================== */
-/* === Check/cholmod_read =================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Check Module.  Copyright (C) 2005-2006, Timothy A. Davis.
- * The CHOLMOD/Check Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Read a sparse matrix in triplet or dense form.  A triplet matrix can be
- * returned as compressed-column sparse matrix.  The file format is compatible
- * with all variations of the Matrix Market "coordinate" and "array" format
- * (http://www.nist.gov/MatrixMarket).  The format supported by these routines
- * also allow other formats, where the Matrix Market header is optional.
- *
- * Although the Matrix Market header is optional, I recommend that users stick
- * with the strict Matrix Market format.  The optional format appears here to
- * support the reading of symmetric matrices stored with just their upper
- * triangular parts present, for testing and development of the A->stype > 0
- * format in CHOLMOD.  That format is not included in the Matrix Market format.
- *
- * If the first line of the file starts with %%MatrixMarket, then it is
- * interpretted as a file in Matrix Market format.  This line must have
- * the following format:
- *
- *	%%MatrixMarket matrix <fmt> <type> <storage>
- *
- *	<fmt> is one of: coordinate or array.  The former is a sparse matrix in
- *	triplet form.  The latter is a dense matrix in column-major form.
- *
- *	<type> is one of: real, complex, pattern, or integer.
- *	The functions here convert the  "integer" and "pattern" types to real.  
- *
- *	<storage> is one of: general, hermitian, symmetric, or skew-symmetric
- *
- *	The strings are case-insensitive.  Only the first character is
- *	significant (or the first two for skew-symmetric).
- *
- *	<type> is ignored for all matrices; the actual type (real, complex,
- *	or pattern) is inferred from the number of tokens in each line of the
- *	file.  For a "coordinate" matrix: 2: pattern, 3: real, 4: complex; for
- *	a dense "array" matrix: 1: real, 2: complex.  This is compatible with
- *	the Matrix Market format, since pattern matrices must have two tokens
- *	per line, real matrices must have 3, and complex matrices must have 4.
- *	A storage of "general" implies an stype of zero (see below). 
- *	"symmetric" and "hermitian" imply an stype of -1. Skew-symmetric and
- *	complex symmetric matrices are always returned with both upper and lower
- *	triangular parts present, with an stype of zero, since CHOLMOD does not
- *	have a method for representing skew-symmetric and complex symmetric
- *	matrices.  Real symmetric and complex Hermitian matrices may optionally
- *	be returned with both parts present.
- *
- * Any other lines starting with "%" are treated as comments, and are ignored.
- * Blank lines are ignored.  The Matrix Market header is optional in this
- * routine (it is not optional in the Matrix Market format).
- *
- * Note that complex matrices are always returned in CHOLMOD_COMPLEX format,
- * not CHOLMOD_ZOMPLEX.
- *
- * -----------------------------------------------------------------------------
- * Triplet matrices:
- * -----------------------------------------------------------------------------
- *
- * The first data line of a triplet matrix contains 3 or 4 integers:
- *
- *	nrow ncol nnz stype
- *
- * where stype is optional (stype does not appear in the Matrix Market format).
- * The matrix is nrow-by-ncol.  The following nnz lines (excluding comments
- * and blank lines) each contain a single entry.  Duplicates are permitted,
- * and are summed in the output matrix.
- *
- * The stype is first derived from the Matrix Market header.  If the stype
- * appears as the fourth integer in the first data line, it is determined from
- * that line.
- * 
- * If stype is present, it denotes the storage format for the matrix.
- * stype = 0 denotes an unsymmetric matrix (same as Matrix Market "general").
- * stype = -1 denotes a real symmetric or complex Hermitian matrix whose lower
- *	triangular entries are stored.  Entries may be present in the upper
- *	triangular part, but these are ignored (same as Matrix Market
- *	"real symmetric" and "complex Hermitian").
- * stype = 1 denotes a real symmetric or complex Hermitian matrix whose upper
- *	triangular entries are stored.  Entries may be present in the lower
- *	triangular part, but these are ignored.  This option is not present
- *	in the Matrix Market format.
- *
- * If stype is not present (no Matrix Market header and not in the first data
- * line) it is inferred from the rest of the data.  If the matrix is
- * rectangular, or has entries in both the upper and lower triangular parts,
- * then it is assumed to be unsymmetric (stype=0).  If only entries in the
- * lower triangular part are present, the matrix is assumed to have stype = -1.
- * If only entries in the upper triangular part are present, the matrix is
- * assumed to have stype = 1.
- *
- * After the first data line (with nrow, ncol, nnz, and optionally stype),
- * each nonzero consists of one line with 2, 3, or 4 entries.  All lines must
- * have the same number of entries.  The first two entries are the row and
- * column indices of the nonzero.  If 3 entries are present, the 3rd entry is
- * the numerical value, and the matrix is real.  If 4 entries are present,
- * the 3rd and 4th entries in the line are the real and imaginary parts of
- * a complex value.
- *
- * The matrix can be either 0-based or 1-based.  It is first assumed to be
- * one-based (all matrices in the Matrix Market are one-based), with row indices
- * in the range 1 to ncol and column indices in the range 1 to nrow.  If a row
- * or column index of zero is found, the matrix is assumed to be zero-based
- * (with row indices in the range 0 to ncol-1 and column indices in the range 0
- * to nrow-1).
- *
- * If Common->prefer_binary is set to its default value of FALSE, then
- * for symmetric pattern-only matrices, the kth diagonal (if present) is set to
- * one plus the degree of the row/column k, and the off-diagonal entries are set
- * to -1.  A symmetric pattern-only matrix with a zero-free diagonal is thus
- * converted into a symmetric positive definite matrix.  All entries are set to
- * one for an unsymmetric pattern-only matrix.  This differs from the
- * Matrix Market format (A = mmread ('file') returns a binary pattern for A for
- * symmetric pattern-only matrices).  If Common->prefer_binary is TRUE, then
- * this function returns a binary matrix (just like mmread('file')).
- *
- * -----------------------------------------------------------------------------
- * Dense matrices:
- * -----------------------------------------------------------------------------
- *
- * A dense matrix is specified by the Matrix Market "array" format.  The
- * Matrix Market header is optional; if not present, the matrix is assumed to
- * be in the Matrix Market "general" format.  The first data line contains just
- * two integers:
- *
- *	nrow ncol
- *
- * The <type> can be real, integer, or complex (not pattern).  These functions
- * convert an integer type to real.  The entries in the matrix are stored in
- * column-major format, with one line per entry.  Two entries are present in
- * each line for complex matrices, one for real and integer matrices.  In
- * rectangular and unsymmetric matrices, all entries are present.  For real
- * symmetric or complex Hermitian matrices, only entries in the lower triangular
- * part appear.  For skew-symmetric matrices, only entries in the strictly
- * lower triangular part appear.
- *
- * Since CHOLMOD does not have a data structure for presenting dense symmetric/
- * Hermitian matrices, these functions always return a dense matrix in its
- * general form, with both upper and lower parts present.
- */
-
-#ifndef NCHECK
-
-#include "cholmod_internal.h"
-#include "cholmod_check.h"
-#include <string.h>
-#include <ctype.h>
-
-/* The MatrixMarket format specificies a maximum line length of 1024 */
-#define MAXLINE 1030
-
-/* ========================================================================== */
-/* === get_line ============================================================= */
-/* ========================================================================== */
-
-/* Read one line of the file, return TRUE if successful, FALSE if EOF. */
-
-static int get_line (FILE *f, char *buf)
-{
-    buf [0] = '\0' ;
-    buf [1] = '\0' ;
-    buf [MAXLINE] = '\0' ;
-    return (fgets (buf, MAXLINE, f) != NULL) ;
-}
-
-/* ========================================================================== */
-/* === fix_inf ============================================================== */
-/* ========================================================================== */
-
-/* Replace huge values with +/- Inf's, since scanf and printf don't deal
- * with Inf's properly.
- */
-
-static double fix_inf (double x)
-{
-    if ((x >= HUGE_DOUBLE) || (x <= -HUGE_DOUBLE))
-    {
-	/* treat this as +/- Inf (assume 2*x leads to overflow) */
-	x = 2*x ;
-    }
-    return (x) ;
-}
-
-/* ========================================================================== */
-/* === is_blank_line ======================================================== */
-/* ========================================================================== */
-
-/* TRUE if s is a blank line or comment, FALSE otherwise */
-
-static int is_blank_line
-(
-    char *s
-)
-{
-    int c, k ;
-    if (s [0] == '%')
-    {
-	/* a comment line */
-	return (TRUE) ;
-    }
-    for (k = 0 ; k <= MAXLINE ; k++)
-    {
-	c = s [k] ;
-	if (c == '\0')
-	{
-	    /* end of line */
-	    break ;
-	}
-	if (!isspace (c))
-	{
-	    /* non-space character */
-	    return (FALSE) ;
-	}
-    }
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === read_header ========================================================== */
-/* ========================================================================== */
-
-/* Read the header.  This consists of zero or more comment lines (blank, or
- * starting with a "%" in the first column), followed by a single data line
- * containing up to four numerical values.
- *
- * The first line may optionally be a Matrix Market header line, of the form
- *
- *	%%MatrixMarket matrix <fmt> <type> <storage>
- *
- * The first data line of a sparse matrix in triplet form consists of 3 or 4
- * numerical values:
- *
- *	nrow ncol nnz stype
- *
- * where stype is optional (it does not appear in the Matrix Market file
- * format).  The first line of a dense matrix in column-major form consists of
- * two numerical values:
- *
- *	nrow ncol
- *
- * The stype of the matrix is determine either from the Matrix Market header,
- * or (optionally) from the first data line.  stypes of 0 to -3 directly
- * correlate with the Matrix Market format; stype = 1 is an extension to that
- * format.
- *
- *	999: unknown (will be inferred from the data)
- *	1: real symmetric or complex Hermitian with upper part stored
- *		(not in the Matrix Market format)
- *	0: unsymmetric (same as Matrix Market "general")
- *	-1: real symmetric or complex Hermitian, with lower part stored
- *		(Matrix Market "real symmetric" or "complex hermitian")
- *	-2: real or complex skew symmetric (lower part stored, can only be
- *		specified by Matrix Market header)
- *	-3: complex symmetric (lower part stored)
- *		specified by Matrix Market header)
- *
- * The Matrix Market header is optional.  If stype appears in the first data
- * line, it is determine by that data line.  Otherwise, if the Matrix Market
- * header appears, stype is determined from that header.  If stype does not
- * appear, it is set to "unknown" (999).
- */
-
-#define STYPE_UNKNOWN 999
-#define STYPE_SYMMETRIC_UPPER 1
-#define STYPE_UNSYMMETRIC 0
-#define STYPE_SYMMETRIC_LOWER -1
-#define STYPE_SKEW_SYMMETRIC -2
-#define STYPE_COMPLEX_SYMMETRIC_LOWER -3
-
-static int read_header	/* returns TRUE if successful, FALSE on error */
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from */
-    /* ---- output --- */
-    char *buf,		/* a character array of size MAXLINE+1 */
-    int *mtype,		/* CHOLMOD_TRIPLET or CHOLMOD_DENSE */
-    size_t *nrow,	/* number of rows in the matrix */
-    size_t *ncol,	/* number of columns in the matrix */
-    size_t *nnz,	/* number of entries in a triplet matrix (0 for dense)*/
-    int *stype		/* stype (see above) */
-)
-{
-    char *p ;
-    int first = TRUE, got_mm_header = FALSE, c, c2, is_complex, nitems ;
-    double l1, l2, l3, l4 ;
-
-    *mtype = CHOLMOD_TRIPLET ;
-    *nrow = 0 ;
-    *ncol = 0 ;
-    *nnz = 0 ;
-    *stype = STYPE_UNKNOWN ;
-
-    for ( ; ; )
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* get the next line */
-	/* ------------------------------------------------------------------ */
-
-	if (!get_line (f, buf))
-	{
-	    /* premature end of file */
-	    return (FALSE) ;
-	}
-
-	if (first && (strncmp (buf, "%%MatrixMarket", 14) == 0))
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* read a Matrix Market header */
-	    /* -------------------------------------------------------------- */
-
-	    got_mm_header = TRUE ;
-	    p = buf ;
-
-	    /* -------------------------------------------------------------- */
-	    /* get "matrix" token */
-	    /* -------------------------------------------------------------- */
-
-	    while (*p && !isspace (*p)) p++ ;
-	    while (*p &&  isspace (*p)) p++ ;
-	    c = tolower (*p) ;
-	    if (c != 'm')
-	    {
-		/* bad format */
-		return (FALSE) ;
-	    }
-
-	    /* -------------------------------------------------------------- */
-	    /* get the fmt token ("coord" or "array") */
-	    /* -------------------------------------------------------------- */
-
-	    while (*p && !isspace (*p)) p++ ;
-	    while (*p &&  isspace (*p)) p++ ;
-	    c = tolower (*p) ;
-	    if (c == 'c')
-	    {
-		*mtype = CHOLMOD_TRIPLET  ;
-	    }
-	    else if (c == 'a')
-	    {
-		*mtype = CHOLMOD_DENSE  ;
-	    }
-	    else
-	    {
-		/* bad format, neither "coordinate" nor "array" */
-		return (FALSE) ;
-	    }
-
-	    /* -------------------------------------------------------------- */
-	    /* get type token (real, pattern, complex, integer) */
-	    /* -------------------------------------------------------------- */
-
-	    while (*p && !isspace (*p)) p++ ;
-	    while (*p &&  isspace (*p)) p++ ;
-	    c = tolower (*p) ;
-	    if (!(c == 'r' || c == 'p' || c == 'c' || c == 'i'))
-	    {
-		/* bad format */
-		return (FALSE) ;
-	    }
-	    is_complex = (c == 'c') ;
-
-	    /* -------------------------------------------------------------- */
-	    /* get storage token (general, hermitian, symmetric, skew) */
-	    /* -------------------------------------------------------------- */
-
-	    while (*p && !isspace (*p)) p++ ;
-	    while (*p &&  isspace (*p)) p++ ;
-	    c = tolower (*p) ;
-	    c2 = tolower (*(p+1)) ;
-	    if (c == 'g')
-	    {
-		/* "general" storage (unsymmetric matrix), both parts present */
-		*stype = STYPE_UNSYMMETRIC ;
-	    }
-	    else if (c == 's' && c2 == 'y')
-	    {
-		/* "symmetric" */
-		if (is_complex)
-		{
-		    /* complex symmetric, lower triangular part present */
-		    *stype = STYPE_COMPLEX_SYMMETRIC_LOWER ;
-		}
-		else
-		{
-		    /* real symmetric, lower triangular part present */
-		    *stype = STYPE_SYMMETRIC_LOWER ;
-		}
-	    }
-	    else if (c == 'h')
-	    {
-		/* "hermitian" matrix, lower triangular part present */
-		*stype = STYPE_SYMMETRIC_LOWER ;
-	    }
-	    else if (c == 's' && c2 == 'k')
-	    {
-		/* "skew-symmetric" (real or complex), lower part present */
-		*stype = STYPE_SKEW_SYMMETRIC ;
-	    }
-	    else
-	    {
-		/* bad format */
-		return (FALSE) ;
-	    }
-
-	}
-	else if (is_blank_line (buf))
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* blank line or comment line */
-	    /* -------------------------------------------------------------- */
-
-	    continue ;
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* read the first data line and return */
-	    /* -------------------------------------------------------------- */
-
-	    /* format: nrow ncol nnz stype */
-	    l1 = EMPTY ;
-	    l2 = EMPTY ;
-	    l3 = 0 ;
-	    l4 = 0 ;
-	    nitems = sscanf (buf, "%lg %lg %lg %lg\n", &l1, &l2, &l3, &l4) ;
-	    if (nitems < 2 || nitems > 4 || l1 > Int_max || l2 > Int_max)
-	    {
-		/* invalid matrix */
-		return (FALSE) ;
-	    }
-	    *nrow = l1 ;
-	    *ncol = l2 ;
-	    if (nitems == 2)
-	    {
-		/* a dense matrix */
-		if (!got_mm_header)
-		{
-		    *mtype = CHOLMOD_DENSE ;
-		    *stype = STYPE_UNSYMMETRIC ;
-		}
-	    }
-	    if (nitems == 3 || nitems == 4)
-	    {
-		/* a sparse triplet matrix */
-		*nnz = l3 ;
-		if (!got_mm_header)
-		{
-		    *mtype = CHOLMOD_TRIPLET ;
-		}
-	    }
-	    if (nitems == 4)
-	    {
-		/* an stype specified here can only be 1, 0, or -1 */
-		if (l4 < 0)
-		{
-		    *stype = STYPE_SYMMETRIC_LOWER ;
-		}
-		else if (l4 > 0)
-		{
-		    *stype = STYPE_SYMMETRIC_UPPER ;
-		}
-		else
-		{
-		    *stype = STYPE_UNSYMMETRIC ;
-		}
-	    }
-	    if (*nrow != *ncol)
-	    {
-		/* a rectangular matrix must be unsymmetric */
-		*stype = STYPE_UNSYMMETRIC ;
-	    }
-	    return (TRUE) ;
-	}
-
-	first = FALSE ;
-    }
-}
-
-
-/* ========================================================================== */
-/* === read_triplet ========================================================= */
-/* ========================================================================== */
-
-/* Header has already been read in, including first line (nrow ncol nnz stype).
- * Read the triplets. */
-
-static cholmod_triplet *read_triplet
-(
-    /* ---- input ---- */
-    FILE *f,		    /* file to read from, must already be open */
-    size_t nrow,	    /* number of rows */
-    size_t ncol,	    /* number of columns */
-    size_t nnz,		    /* number of triplets in file to read */
-    int stype,		    /* stype from header, or "unknown" */
-    int prefer_unsym,	    /* if TRUE, always return T->stype of zero */
-    /* ---- workspace */
-    char *buf,		    /* of size MAXLINE+1 */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double x, z ;
-    double *Tx ;
-    Int *Ti, *Tj, *Rdeg, *Cdeg ;
-    cholmod_triplet *T ;
-    double l1, l2 ;
-    Int nitems, xtype, unknown, k, nshould, is_lower, is_upper, one_based, i, j,
-	imax, jmax, skew_symmetric, p, complex_symmetric ;
-    size_t s, nnz2, extra ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* quick return for empty matrix */
-    /* ---------------------------------------------------------------------- */
-
-    if (nrow == 0 || ncol == 0 || nnz == 0)
-    {
-	/* return an empty matrix */
-	return (CHOLMOD(allocate_triplet) (nrow, ncol, 0, 0, CHOLMOD_REAL,
-		    Common)) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* special stype cases: unknown, skew symmetric, and complex symmetric  */
-    /* ---------------------------------------------------------------------- */
-
-    unknown = (stype == STYPE_UNKNOWN) ;
-    skew_symmetric = (stype == STYPE_SKEW_SYMMETRIC) ;
-    complex_symmetric = (stype == STYPE_COMPLEX_SYMMETRIC_LOWER) ;
-
-    extra = 0 ;
-    if (stype < STYPE_SYMMETRIC_LOWER
-	|| (prefer_unsym && stype != STYPE_UNSYMMETRIC))
-    {
-	/* 999: unknown might be converted to unsymmetric */
-	/*  1:  symmetric upper converted to unsym. if prefer_unsym is TRUE */
-	/* -1:  symmetric lower converted to unsym. if prefer_unsym is TRUE */
-	/* -2:  real or complex skew symmetric converted to unsymmetric */
-	/* -3:  complex symmetric converted to unsymmetric */
-	stype = STYPE_UNSYMMETRIC ;
-	extra = nnz ;
-    }
-    nnz2 = CHOLMOD(add_size_t) (nnz, extra, &ok) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* s = nrow + ncol */
-    s = CHOLMOD(add_size_t) (nrow, ncol, &ok) ;
-    if (!ok || nrow > Int_max || ncol > Int_max || nnz > Int_max)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (NULL) ;
-    }
-
-    CHOLMOD(allocate_work) (0, s, 0, Common) ;
-    Rdeg = Common->Iwork ;	/* size nrow */
-    Cdeg = Rdeg + nrow ;	/* size ncol */
-
-    /* ---------------------------------------------------------------------- */
-    /* read the triplets */
-    /* ---------------------------------------------------------------------- */
-
-    is_lower = TRUE ;
-    is_upper = TRUE ;
-    one_based = TRUE ;
-    imax = 0 ;
-    jmax = 0 ;
-
-    Tx = NULL ;
-    Ti = NULL ;
-    Tj = NULL ;
-    xtype = 999 ;
-    nshould = 0 ;
-
-    for (k = 0 ; k < (Int) nnz ; k++)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* get the next triplet, skipping blank lines and comment lines */
-	/* ------------------------------------------------------------------ */
-
-	l1 = EMPTY ;
-	l2 = EMPTY ;
-	x = 0 ;
-	z = 0 ;
-
-	for ( ; ; )
-	{
-	    if (!get_line (f, buf))
-	    {
-		/* premature end of file - not enough triplets read in */
-		ERROR (CHOLMOD_INVALID, "premature EOF") ;
-		return (NULL) ;
-	    }
-	    if (is_blank_line (buf))
-	    {
-		/* blank line or comment */
-		continue ;
-	    }
-	    nitems = sscanf (buf, "%lg %lg %lg %lg\n", &l1, &l2, &x, &z) ;
-	    x = fix_inf (x) ;
-	    z = fix_inf (z) ;
-	    break ;
-	}
-
-	nitems = (nitems == EOF) ? 0 : nitems ;
-	i = l1 ;
-	j = l2 ;
-
-	/* ------------------------------------------------------------------ */
-	/* for first triplet: determine type and allocate triplet matrix */
-	/* ------------------------------------------------------------------ */
-
-	if (k == 0)
-	{
-	    if (nitems < 2 || nitems > 4)
-	    {
-		/* invalid matrix */
-		ERROR (CHOLMOD_INVALID, "invalid format") ;
-		return (NULL) ;
-	    }
-	    else if (nitems == 2)
-	    {
-		/* this will be converted into a real matrix later */
-		xtype = CHOLMOD_PATTERN ;
-	    }
-	    else if (nitems == 3)
-	    {
-		xtype = CHOLMOD_REAL ;
-	    }
-	    else if (nitems == 4)
-	    {
-		xtype = CHOLMOD_COMPLEX ;
-	    }
-
-	    /* the rest of the lines should have the same number of entries */
-	    nshould = nitems ;
-
-	    /* allocate triplet matrix */
-	    T = CHOLMOD(allocate_triplet) (nrow, ncol, nnz2, stype,
-		    (xtype == CHOLMOD_PATTERN ? CHOLMOD_REAL : xtype), Common) ;
-	    if (Common->status < CHOLMOD_OK)
-	    {
-		/* out of memory */
-		return (NULL) ;
-	    }
-	    Ti = T->i ;
-	    Tj = T->j ;
-	    Tx = T->x ;
-	    T->nnz = nnz ;
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* save the entry in the triplet matrix */
-	/* ------------------------------------------------------------------ */
-
-	if (nitems != nshould || i < 0 || j < 0)
-	{
-	    /* wrong format, premature end-of-file, or negative indices */
-	    CHOLMOD(free_triplet) (&T, Common) ;
-	    ERROR (CHOLMOD_INVALID, "invalid matrix file") ;
-	    return (NULL) ;
-	}
-
-	Ti [k] = i ;
-	Tj [k] = j ;
-
-	if (i < j)
-	{
-	    /* this entry is in the upper triangular part */
-	    is_lower = FALSE ;
-	}
-	if (i > j)
-	{
-	    /* this entry is in the lower triangular part */
-	    is_upper = FALSE ;
-	}
-
-	if (xtype == CHOLMOD_REAL)
-	{
-	    Tx [k] = x ;
-	}
-	else if (xtype == CHOLMOD_COMPLEX)
-	{
-	    Tx [2*k  ] = x ;	/* real part */
-	    Tx [2*k+1] = z ;	/* imaginary part */
-	}
-
-	if (i == 0 || j == 0)
-	{
-	    one_based = FALSE ;
-	}
-
-	imax = MAX (i, imax) ;
-	jmax = MAX (j, jmax) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* convert to zero-based */
-    /* ---------------------------------------------------------------------- */
-
-    if (one_based)
-    {
-	/* input matrix is one-based; convert matrix to zero-based */
-	for (k = 0 ; k < (Int) nnz ; k++)
-	{
-	    Ti [k]-- ;
-	    Tj [k]-- ;
-	}
-    }
-
-    if (one_based ?
-	(imax >  (Int) nrow || jmax >  (Int) ncol) :
-	(imax >= (Int) nrow || jmax >= (Int) ncol))
-    {
-	/* indices out of range */
-	CHOLMOD(free_triplet) (&T, Common) ;
-	ERROR (CHOLMOD_INVALID, "indices out of range") ;
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* determine the stype, if not yet known */
-    /* ---------------------------------------------------------------------- */
-
-    if (unknown)
-    {
-	if (is_lower && is_upper)
-	{
-	    /* diagonal matrix, symmetric with upper part present */
-	    stype = STYPE_SYMMETRIC_UPPER ;
-	}
-	else if (is_lower && !is_upper)
-	{
-	    /* symmetric, lower triangular part present */
-	    stype = STYPE_SYMMETRIC_LOWER ;
-	}
-	else if (!is_lower && is_upper)
-	{
-	    /* symmetric, upper triangular part present */
-	    stype = STYPE_SYMMETRIC_UPPER ;
-	}
-	else
-	{
-	    /* unsymmetric */
-	    stype = STYPE_UNSYMMETRIC ;
-	    extra = 0 ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* add the remainder of symmetric, skew-symmetric or Hermitian matrices */
-    /* ---------------------------------------------------------------------- */
-
-    /* note that this step is not done for real symmetric or complex Hermitian
-     * matrices, unless prefer_unsym is TRUE */
-    if (extra > 0)
-    {
-	p = nnz ;
-	for (k = 0 ; k < (Int) nnz ; k++)
-	{
-	    i = Ti [k] ;
-	    j = Tj [k] ;
-	    if (i != j)
-	    {
-		Ti [p] = j ;
-		Tj [p] = i ;
-		if (xtype == CHOLMOD_REAL)
-		{
-		    if (skew_symmetric)
-		    {
-			Tx [p] = -Tx [k] ;
-		    }
-		    else
-		    {
-			Tx [p] =  Tx [k] ;
-		    }
-		}
-		else if (xtype == CHOLMOD_COMPLEX)
-		{
-		    if (skew_symmetric)
-		    {
-			Tx [2*p  ] = -Tx [2*k ] ;
-			Tx [2*p+1] = -Tx [2*k+1] ;
-		    }
-		    else if (complex_symmetric)
-		    {
-			Tx [2*p  ] =  Tx [2*k ] ;
-			Tx [2*p+1] =  Tx [2*k+1] ;
-		    }
-		    else /* Hermitian */
-		    {
-			Tx [2*p  ] =  Tx [2*k ] ;
-			Tx [2*p+1] = -Tx [2*k+1] ;
-		    }
-		}
-		p++ ;
-	    }
-	}
-	T->nnz = p ;
-	nnz = p ;
-    }
-
-    T->stype = stype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* create values for a pattern-only matrix */
-    /* ---------------------------------------------------------------------- */
-
-    if (xtype == CHOLMOD_PATTERN)
-    {
-	if (stype == STYPE_UNSYMMETRIC || Common->prefer_binary)
-	{
-	    /* unsymmetric case, or binary case */
-	    for (k = 0 ; k < (Int) nnz ; k++)
-	    {
-		Tx [k] = 1 ;
-	    }
-	}
-	else
-	{
-	    /* compute the row and columm degrees (excluding the diagonal) */
-	    for (i = 0 ; i < (Int) nrow ; i++)
-	    {
-		Rdeg [i] = 0 ;
-	    }
-	    for (j = 0 ; j < (Int) ncol ; j++)
-	    {
-		Cdeg [j] = 0 ;
-	    }
-	    for (k = 0 ; k < (Int) nnz ; k++)
-	    {
-		i = Ti [k] ;
-		j = Tj [k] ;
-		if ((stype < 0 && i > j) || (stype > 0 && i < j))
-		{
-		    /* both a(i,j) and a(j,i) appear in the matrix */
-		    Rdeg [i]++ ;
-		    Cdeg [j]++ ;
-		    Rdeg [j]++ ;
-		    Cdeg [i]++ ;
-		}
-	    }
-	    /* assign the numerical values */
-	    for (k = 0 ; k < (Int) nnz ; k++)
-	    {
-		i = Ti [k] ;
-		j = Tj [k] ;
-		Tx [k] = (i == j) ? (1 + MAX (Rdeg [i], Cdeg [j])) : (-1) ;
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the new triplet matrix */
-    /* ---------------------------------------------------------------------- */
-
-    return (T) ;
-}
-
-
-/* ========================================================================== */
-/* === read_dense =========================================================== */
-/* ========================================================================== */
-
-/* Header has already been read in, including first line (nrow ncol).
- * Read a dense matrix. */
-
-static cholmod_dense *read_dense
-(
-    /* ---- input ---- */
-    FILE *f,		    /* file to read from, must already be open */
-    size_t nrow,	    /* number of rows */
-    size_t ncol,	    /* number of columns */
-    int stype,		    /* stype from header */
-    /* ---- workspace */
-    char *buf,		    /* of size MAXLINE+1 */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double x, z ;
-    double *Xx = NULL ;
-    cholmod_dense *X ;
-    Int nitems, xtype = -1, nshould = 0, i, j, k, kup, first ;
-
-    /* ---------------------------------------------------------------------- */
-    /* quick return for empty matrix */
-    /* ---------------------------------------------------------------------- */
-
-    if (nrow == 0 || ncol == 0)
-    {
-	/* return an empty dense matrix */
-	return (CHOLMOD(zeros) (nrow, ncol, CHOLMOD_REAL, Common)) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* read the entries */
-    /* ---------------------------------------------------------------------- */
-
-    first = TRUE ;
-
-    for (j = 0 ; j < (Int) ncol ; j++)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* get the row index of the first entry in the file for column j */
-	/* ------------------------------------------------------------------ */
-
-	if (stype == STYPE_UNSYMMETRIC)
-	{
-	    i = 0 ;
-	}
-	else if (stype == STYPE_SKEW_SYMMETRIC)
-	{
-	    i = j+1 ;
-	}
-	else /* real symmetric or complex Hermitian lower */
-	{
-	    i = j ;
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* get column j */
-	/* ------------------------------------------------------------------ */
-
-	for ( ; i < (Int) nrow ; i++)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* get the next entry, skipping blank lines and comment lines */
-	    /* -------------------------------------------------------------- */
-
-	    x = 0 ;
-	    z = 0 ;
-	    for ( ; ; )
-	    {
-
-		if (!get_line (f, buf))
-		{
-		    /* premature end of file - not enough entries read in */
-		    ERROR (CHOLMOD_INVALID, "premature EOF") ;
-		    return (NULL) ;
-		}
-
-		if (is_blank_line (buf))
-		{
-		    /* blank line or comment */
-		    continue ;
-		}
-		nitems = sscanf (buf, "%lg %lg\n", &x, &z) ;
-		x = fix_inf (x) ;
-		z = fix_inf (z) ;
-		break ;
-	    }
-
-	    nitems = (nitems == EOF) ? 0 : nitems ;
-
-	    /* -------------------------------------------------------------- */
-	    /* for first entry: determine type and allocate dense matrix */
-	    /* -------------------------------------------------------------- */
-
-	    if (first)
-	    {
-		first = FALSE ;
-
-		if (nitems < 1 || nitems > 2)
-		{
-		    /* invalid matrix */
-		    ERROR (CHOLMOD_INVALID, "invalid format") ;
-		    return (NULL) ;
-		}
-		else if (nitems == 1)
-		{
-		    /* a real matrix */
-		    xtype = CHOLMOD_REAL ;
-		}
-		else if (nitems == 2)
-		{
-		    /* a complex matrix */
-		    xtype = CHOLMOD_COMPLEX ;
-		}
-
-		/* the rest of the lines should have same number of entries */
-		nshould = nitems ;
-
-		/* allocate the result */
-		X = CHOLMOD(zeros) (nrow, ncol, xtype, Common) ;
-		if (Common->status < CHOLMOD_OK)
-		{
-		    /* out of memory */
-		    return (NULL) ;
-		}
-		Xx = X->x ;
-	    }
-
-	    /* -------------------------------------------------------------- */
-	    /* save the entry in the dense matrix */
-	    /* -------------------------------------------------------------- */
-
-	    if (nitems != nshould)
-	    {
-		/* wrong format or premature end-of-file */
-		CHOLMOD(free_dense) (&X, Common) ;
-		ERROR (CHOLMOD_INVALID, "invalid matrix file") ;
-		return (NULL) ;
-	    }
-
-	    k = i + j*nrow ;
-	    kup = j + i*nrow ;
-
-	    if (xtype == CHOLMOD_REAL)
-	    {
-		/* real matrix */
-		Xx [k] = x ;
-		if (k != kup)
-		{
-		    if (stype == STYPE_SYMMETRIC_LOWER)
-		    {
-			/* real symmetric matrix */
-			Xx [kup] = x ;
-		    }
-		    else if (stype == STYPE_SKEW_SYMMETRIC)
-		    {
-			/* real skew symmetric matrix */
-			Xx [kup] = -x ;
-		    }
-		}
-	    }
-	    else if (xtype == CHOLMOD_COMPLEX)
-	    {
-		Xx [2*k  ] = x ;	    /* real part */
-		Xx [2*k+1] = z ;	    /* imaginary part */
-		if (k != kup)
-		{
-		    if (stype == STYPE_SYMMETRIC_LOWER)
-		    {
-			/* complex Hermitian */
-			Xx [2*kup  ] = x ;	    /* real part */
-			Xx [2*kup+1] = -z ;	    /* imaginary part */
-		    }
-		    else if (stype == STYPE_SKEW_SYMMETRIC)
-		    {
-			/* complex skew symmetric */
-			Xx [2*kup  ] = -x ;	    /* real part */
-			Xx [2*kup+1] = -z ;	    /* imaginary part */
-		    }
-		    if (stype == STYPE_COMPLEX_SYMMETRIC_LOWER)
-		    {
-			/* complex symmetric */
-			Xx [2*kup  ] = x ;	    /* real part */
-			Xx [2*kup+1] = z ;	    /* imaginary part */
-		    }
-		}
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the new dense matrix */
-    /* ---------------------------------------------------------------------- */
-
-    return (X) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_read_triplet ================================================= */
-/* ========================================================================== */
-
-/* Read in a triplet matrix from a file. */
-
-cholmod_triplet *CHOLMOD(read_triplet)
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from, must already be open */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    char buf [MAXLINE+1] ;
-    size_t nrow, ncol, nnz ;
-    int stype, mtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (f, NULL) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* read the header and first data line */
-    /* ---------------------------------------------------------------------- */
-
-    if (!read_header (f, buf, &mtype, &nrow, &ncol, &nnz, &stype) ||
-	mtype != CHOLMOD_TRIPLET)
-    {
-	/* invalid matrix - this function can only read in a triplet matrix */
-	ERROR (CHOLMOD_INVALID, "invalid format") ;
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* read the triplet matrix */
-    /* ---------------------------------------------------------------------- */
-
-    return (read_triplet (f, nrow, ncol, nnz, stype, FALSE, buf, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_read_sparse ================================================== */
-/* ========================================================================== */
-
-/* Read a sparse matrix from a file.  See cholmod_read_triplet for a discussion
- * of the file format.
- *
- * If Common->prefer_upper is TRUE (the default case), a symmetric matrix is
- * returned stored in upper-triangular form (A->stype == 1).
- */
-
-cholmod_sparse *CHOLMOD(read_sparse)
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from, must already be open */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *A, *A2 ;
-    cholmod_triplet *T ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (f, NULL) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* convert to a sparse matrix in compressed-column form */
-    /* ---------------------------------------------------------------------- */
-
-    T = CHOLMOD(read_triplet) (f, Common) ;
-    A = CHOLMOD(triplet_to_sparse) (T, 0, Common) ;
-    CHOLMOD(free_triplet) (&T, Common) ;
-
-    if (Common->prefer_upper && A != NULL && A->stype == -1)
-    {
-	/* A=A' */
-	A2 = CHOLMOD(transpose) (A, 2, Common) ;
-	CHOLMOD(free_sparse) (&A, Common) ;
-	A = A2 ;
-    }
-    return (A) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_read_dense =================================================== */
-/* ========================================================================== */
-
-/* Read a dense matrix from a file. */
-
-cholmod_dense *CHOLMOD(read_dense)
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from, must already be open */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    char buf [MAXLINE+1] ;
-    size_t nrow, ncol, nnz ;
-    int stype, mtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (f, NULL) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* read the header and first data line */
-    /* ---------------------------------------------------------------------- */
-
-    if (!read_header (f, buf, &mtype, &nrow, &ncol, &nnz, &stype) ||
-	mtype != CHOLMOD_DENSE)
-    {
-	/* invalid matrix - this function can only read in a dense matrix */
-	ERROR (CHOLMOD_INVALID, "invalid format") ;
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* read the dense matrix */
-    /* ---------------------------------------------------------------------- */
-
-    return (read_dense (f, nrow, ncol, stype, buf, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_read_matrix ================================================== */
-/* ========================================================================== */
-
-/* Read a triplet matrix, sparse matrix or a dense matrix from a file.  Returns
- * a void pointer to either a cholmod_triplet, cholmod_sparse, or cholmod_dense
- * object.  The type of object is passed back to the caller as the mtype
- * argument. */
-
-void *CHOLMOD(read_matrix)
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from, must already be open */
-    int prefer,		/* If 0, a sparse matrix is always return as a
-			 *	cholmod_triplet form.  It can have any stype
-			 *	(symmetric-lower, unsymmetric, or
-			 *	symmetric-upper).
-			 * If 1, a sparse matrix is returned as an unsymmetric
-			 *	cholmod_sparse form (A->stype == 0), with both
-			 *	upper and lower triangular parts present.
-			 *	This is what the MATLAB mread mexFunction does,
-			 *	since MATLAB does not have an stype.
-			 * If 2, a sparse matrix is returned with an stype of 0
-			 *	or 1 (unsymmetric, or symmetric with upper part
-			 *	stored).
-			 * This argument has no effect for dense matrices.
-			 */
-    /* ---- output---- */
-    int *mtype,		/* CHOLMOD_TRIPLET, CHOLMOD_SPARSE or CHOLMOD_DENSE */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    void *G = NULL ;
-    cholmod_sparse *A, *A2 ;
-    cholmod_triplet *T ;
-    char buf [MAXLINE+1] ;
-    size_t nrow, ncol, nnz ;
-    int stype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (f, NULL) ;
-    RETURN_IF_NULL (mtype, NULL) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* read the header to determine the mtype */
-    /* ---------------------------------------------------------------------- */
-
-    if (!read_header (f, buf, mtype, &nrow, &ncol, &nnz, &stype))
-    {
-	/* invalid matrix */
-	ERROR (CHOLMOD_INVALID, "invalid format") ;
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* read a matrix */
-    /* ---------------------------------------------------------------------- */
-
-    if (*mtype == CHOLMOD_TRIPLET)
-    {
-	/* read in the triplet matrix, converting to unsymmetric format if
-	 * prefer == 1 */
-	T = read_triplet (f, nrow, ncol, nnz, stype, prefer == 1, buf, Common) ;
-	if (prefer == 0)
-	{
-	    /* return matrix in its original triplet form */
-	    G = T ;
-	}
-	else
-	{
-	    /* return matrix in a compressed-column form */
-	    A = CHOLMOD(triplet_to_sparse) (T, 0, Common) ;
-	    CHOLMOD(free_triplet) (&T, Common) ;
-	    if (A != NULL && prefer == 2 && A->stype == -1)
-	    {
-		/* convert A from symmetric-lower to symmetric-upper */
-		A2 = CHOLMOD(transpose) (A, 2, Common) ;
-		CHOLMOD(free_sparse) (&A, Common) ;
-		A = A2 ;
-	    }
-	    *mtype = CHOLMOD_SPARSE ;
-	    G = A ;
-	}
-    }
-    else if (*mtype == CHOLMOD_DENSE)
-    {
-	/* return a dense matrix */
-	G = read_dense (f, nrow, ncol, stype, buf, Common) ;
-    }
-    return (G) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Check/cholmod_write.c b/src/C/SuiteSparse/CHOLMOD/Check/cholmod_write.c
deleted file mode 100644
index eb578f9..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Check/cholmod_write.c
+++ /dev/null
@@ -1,744 +0,0 @@
-/* ========================================================================== */
-/* === Check/cholmod_write ================================================== */
-/* ========================================================================== */
-
-/* Write a matrix to a file in Matrix Market form.
- *
- * A can be sparse or full.
- *
- * If present and non-empty, A and Z must have the same dimension.  Z contains
- * the explicit zero entries in the matrix (which MATLAB drops).  The entries
- * of Z appear as explicit zeros in the output file.  Z is optional.  If it is
- * an empty matrix it is ignored.  Z must be sparse or empty, if present.
- * It is ignored if A is full.
- *
- * filename is the name of the output file.  comments is file whose
- * contents are include after the Matrix Market header and before the first
- * data line.  Ignored if an empty string or not present.
- *
- * Except for the workspace used by cholmod_symmetry (ncol integers) for
- * the sparse case, these routines use no workspace at all.
- */
-
-#ifndef NCHECK
-
-#include "cholmod_internal.h"
-#include "cholmod_check.h"
-#include "cholmod_matrixops.h"
-#include <string.h>
-#include <ctype.h>
-
-#define MMLEN 1024
-#define MAXLINE MMLEN+6
-
-/* ========================================================================== */
-/* === include_comments ===================================================== */
-/* ========================================================================== */
-
-/* Read in the comments file, if it exists, and copy it to the Matrix Market
- * file.  A "%" is prepended to each line.  Returns TRUE if successful, FALSE
- * otherwise.
- */
-
-static int include_comments (FILE *f, const char *comments)
-{
-    FILE *cf = NULL ;
-    char buffer [MAXLINE] ;
-    int ok = TRUE ;
-    if (comments != NULL && comments [0] != '\0')
-    {
-	cf = fopen (comments, "r") ;
-	if (cf == NULL)
-	{
-	    return (FALSE) ;
-	}
-	while (ok && fgets (buffer, MAXLINE, cf) != NULL)
-	{
-	    /* ensure the line is not too long */
-	    buffer [MMLEN-1] = '\0' ;
-	    buffer [MMLEN-2] = '\n' ;
-	    ok = ok && (fprintf (f, "%%%s", buffer) > 0) ;
-	}
-	fclose (cf) ;
-    }
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === get_value ============================================================ */
-/* ========================================================================== */
-
-/* Get the pth value in the matrix. */
-
-static void get_value
-(
-    double *Ax,	    /* real values, or real/imag. for CHOLMOD_COMPLEX type */
-    double *Az,	    /* imaginary values for CHOLMOD_ZOMPLEX type */
-    Int p,	    /* get the pth entry */
-    Int xtype,	    /* A->xtype: pattern, real, complex, or zomplex */
-    double *x,	    /* the real part */
-    double *z	    /* the imaginary part */
-)
-{
-    switch (xtype)
-    {
-	case CHOLMOD_PATTERN:
-	    *x = 1 ;
-	    *z = 0 ;
-	    break ;
-
-	case CHOLMOD_REAL:
-	    *x = Ax [p] ;
-	    *z = 0 ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    *x = Ax [2*p] ;
-	    *z = Ax [2*p+1] ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    *x = Ax [p] ;
-	    *z = Az [p] ;
-	    break ;
-    }
-}
-
-
-/* ========================================================================== */
-/* === print_value ========================================================== */
-/* ========================================================================== */
-
-/* Print a numeric value to the file, using the shortest format that ensures
- * the value is written precisely.  Returns TRUE if successful, FALSE otherwise.
- */ 
-
-static int print_value
-(
-    FILE *f,	    /* file to print to */
-    double x,	    /* value to print */
-    Int is_integer  /* TRUE if printing as an integer */
-)
-{
-    double y ;
-    char s [MAXLINE], *p ;
-    Int i, dest = 0, src = 0 ;
-    int width, ok ;
-
-    if (is_integer)
-    {
-	i = (Int) x ;
-	ok = (fprintf (f, ID, i) > 0) ;
-	return (ok) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* handle Inf and NaN */
-    /* ---------------------------------------------------------------------- */
-
-    /* change -inf to -HUGE_DOUBLE, and change +inf and nan to +HUGE_DOUBLE */
-    if (CHOLMOD_IS_NAN (x) || x >= HUGE_DOUBLE)
-    {
-	x = HUGE_DOUBLE ;
-    }
-    else if (x <= -HUGE_DOUBLE)
-    {
-	x = -HUGE_DOUBLE ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* find the smallest acceptable precision */
-    /* ---------------------------------------------------------------------- */
-
-    for (width = 6 ; width < 20 ; width++)
-    {
-	sprintf (s, "%.*g", width, x) ;
-	sscanf (s, "%lg", &y) ;
-	if (x == y) break ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* shorten the string */
-    /* ---------------------------------------------------------------------- */
-
-    /* change "e+0" to "e", change "e+" to "e", and change "e-0" to "e-" */
-    for (i = 0 ; i < MAXLINE && s [i] != '\0' ; i++)
-    {
-	if (s [i] == 'e')
-	{
-	    if (s [i+1] == '+')
-	    {
-		dest = i+1 ;
-		if (s [i+2] == '0')
-		{
-		    /* delete characters s[i+1] and s[i+2] */
-		    src = i+3 ;
-		}
-		else
-		{
-		    /* delete characters s[i+1] */
-		    src = i+2 ;
-		}
-	    }
-	    else if (s [i+1] == '-')
-	    {
-		dest = i+2 ;
-		if (s [i+2] == '0')
-		{
-		    /* delete character s[i+2] */
-		    src = i+3 ;
-		}
-		else
-		{
-		    /* no change */
-		    break ;
-		}
-	    }
-	    while (s [src] != '\0')
-	    {
-		s [dest++] = s [src++] ;
-	    }
-	    s [dest] = '\0' ;
-	    break ;
-	}
-    }
-
-    /* delete the leading "0" if present and not necessary */
-    p = s ;
-    s [MAXLINE-1] = '\0' ;
-    i = strlen (s) ;
-    if (i > 2 && s [0] == '0' && s [1] == '.')
-    {
-	/* change "0.x" to ".x" */
-	p = s + 1 ;
-    }
-    else if (i > 3 && s [0] == '-' && s [1] == '0' && s [2] == '.')
-    {
-	/* change "-0.x" to "-.x" */
-	s [1] = '-' ;
-	p = s + 1 ;
-    }
-
-#if 0
-    /* double-check */
-    i = sscanf (p, "%lg", &z) ;
-    if (i != 1 || y != z)
-    {
-	/* oops! something went wrong in the "e+0" edit, above. */
-	/* this "cannot" happen */
-	sprintf (s, "%.*g", width, x) ;
-	p = s ;
-    }
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* print the value to the file */
-    /* ---------------------------------------------------------------------- */
-
-    ok = (fprintf (f, "%s", p) > 0) ;
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === print_triplet ======================================================== */
-/* ========================================================================== */
-
-/* Print a triplet, converting it to one-based.  Returns TRUE if successful,
- * FALSE otherwise.
- */
-
-static int print_triplet
-(
-    FILE *f,		/* file to print to */
-    Int is_binary,	/* TRUE if file is "pattern" */
-    Int is_complex,	/* TRUE if file is "complex" */
-    Int is_integer,	/* TRUE if file is "integer" */
-    Int i,		/* row index (zero-based) */
-    Int j,		/* column index (zero-based) */
-    double x,		/* real part */
-    double z		/* imaginary part */
-)
-{
-    int ok ; 
-    ok = (fprintf (f, ID " " ID, 1+i, 1+j) > 0) ;
-    if (!is_binary)
-    {
-	fprintf (f, " ") ;
-	ok = ok && print_value (f, x, is_integer) ;
-	if (is_complex)
-	{
-	    fprintf (f, " ") ;
-	    ok = ok && print_value (f, z, is_integer) ;
-	}
-    }
-    ok = ok && (fprintf (f, "\n") > 0) ;
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === ntriplets ============================================================ */
-/* ========================================================================== */
-
-/* Compute the number of triplets that will be printed to the file
- * from the matrix A. */
-
-static Int ntriplets
-(
-    cholmod_sparse *A,	    /* matrix that will be printed */
-    Int is_sym		    /* TRUE if the file is symmetric (lower part only)*/
-)
-{
-    Int *Ap, *Ai, *Anz, packed, i, j, p, pend, ncol, stype, nz = 0 ;
-    if (A == NULL)
-    {
-	/* the Z matrix is NULL */
-	return (0) ;
-    }
-    stype = A->stype ;
-    Ap = A->p ;
-    Ai = A->i ;
-    Anz = A->nz ;
-    packed = A->packed ;
-    ncol = A->ncol ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	p = Ap [j] ;
-	pend = (packed) ? Ap [j+1] : p + Anz [j] ;
-	for ( ; p < pend ; p++)
-	{
-	    i = Ai [p] ;
-	    if ((stype < 0 && i >= j) || (stype == 0 && (i >= j || !is_sym)))
-	    {
-		/* CHOLMOD matrix is symmetric-lower (and so is the file);
-		 * or CHOLMOD matrix is unsymmetric and either A(i,j) is in
-		 * the lower part or the file is unsymmetric. */
-		nz++ ;
-	    }
-	    else if (stype > 0 && i <= j)
-	    {
-		/* CHOLMOD matrix is symmetric-upper, but the file is
-		 * symmetric-lower.  Need to transpose the entry. */
-		nz++ ;
-	    }
-	}
-    }
-    return (nz) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_write_sparse ================================================= */
-/* ========================================================================== */
-
-/* Write a sparse matrix to a file in Matrix Market format.   Optionally include
- * comments, and print explicit zero entries given by the pattern of the Z
- * matrix.  If not NULL, the Z matrix must have the same dimensions and stype
- * as A.
- *
- * Returns the symmetry in which the matrix was printed (1 to 7, see the
- * CHOLMOD_MM_* codes in CHOLMOD/Include/cholmod_core.h), or -1 on failure.
- *
- * If A and Z are sorted on input, and either unsymmetric (stype = 0) or
- * symmetric-lower (stype < 0), and if A and Z do not overlap, then the triplets
- * are sorted, first by column and then by row index within each column, with
- * no duplicate entries.  If all the above holds except stype > 0, then the
- * triplets are sorted by row first and then column.
- */
-
-int CHOLMOD(write_sparse)
-(
-    /* ---- input ---- */
-    FILE *f,		    /* file to write to, must already be open */
-    cholmod_sparse *A,	    /* matrix to print */
-    cholmod_sparse *Z,	    /* optional matrix with pattern of explicit zeros */
-    const char *comments,    /* optional filename of comments to include */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double x = 0, z = 0 ;
-    double *Ax, *Az ;
-    Int *Ap, *Ai, *Anz, *Zp, *Zi, *Znz ;
-    Int nrow, ncol, is_complex, symmetry, i, j, q, iz, p, nz, is_binary, stype,
-	is_integer, asym, is_sym, xtype, apacked, zpacked, pend, qend, zsym ;
-    int ok ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (EMPTY) ;
-    RETURN_IF_NULL (f, EMPTY) ;
-    RETURN_IF_NULL (A, EMPTY) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, EMPTY) ;
-    if (Z != NULL && (Z->nrow == 0 || Z->ncol == 0))
-    {
-	/* Z is non-NULL but empty, so treat it as a NULL matrix */
-	Z = NULL ;
-    }
-    if (Z != NULL)
-    {
-	RETURN_IF_XTYPE_INVALID (Z, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, EMPTY) ;
-	if (Z->nrow != A->nrow || Z->ncol != A->ncol || Z->stype != A->stype)
-	{
-	    ERROR (CHOLMOD_INVALID, "dimension or type of A and Z mismatch") ;
-	    return (EMPTY) ;
-	}
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get the A matrix */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Az = A->z ;
-    Anz = A->nz ;
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-    xtype = A->xtype ;
-    apacked = A->packed ;
-
-    if (xtype == CHOLMOD_PATTERN)
-    {
-	/* a CHOLMOD pattern matrix is printed as "pattern" in the file */
-	is_binary = TRUE ;
-	is_integer = FALSE ;
-	is_complex = FALSE ;
-    }
-    else if (xtype == CHOLMOD_REAL)
-    {
-	/* determine if a real matrix is in fact binary or integer */
-	is_binary = TRUE ;
-	is_integer = TRUE ;
-	is_complex = FALSE ;
-	for (j = 0 ; (is_binary || is_integer) && j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (apacked) ? Ap [j+1] : p + Anz [j] ;
-	    for ( ; (is_binary || is_integer) && p < pend ; p++)
-	    {
-		x = Ax [p] ;
-		if (x != 1)
-		{
-		    is_binary = FALSE ;
-		}
-		/* convert to Int and then back to double */
-		i = (Int) x ;
-		z = (double) i ;
-		if (z != x)
-		{
-		    is_integer = FALSE ;
-		}
-	    }
-	}
-    }
-    else
-    {
-	/* a CHOLMOD complex matrix is printed as "complex" in the file */
-	is_binary = FALSE ;
-	is_integer = FALSE ;
-	is_complex = TRUE ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get the Z matrix (only consider the pattern) */
-    /* ---------------------------------------------------------------------- */
-
-    Zp = NULL ;
-    Zi = NULL ;
-    Znz = NULL ;
-    zpacked = TRUE ;
-    if (Z != NULL)
-    {
-	Zp = Z->p ;
-	Zi = Z->i ;
-	Znz = Z->nz ;
-	zpacked = Z->packed ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* determine the symmetry of A and Z */
-    /* ---------------------------------------------------------------------- */
-
-    stype = A->stype ;
-    if (A->nrow != A->ncol)
-    {
-	asym = CHOLMOD_MM_RECTANGULAR ;
-    }
-    else if (stype != 0)
-    {
-	/* CHOLMOD's A and Z matrices have a symmetric (and matching) stype.
-	 * Note that the diagonal is not checked. */
-	asym = is_complex ? CHOLMOD_MM_HERMITIAN : CHOLMOD_MM_SYMMETRIC ;
-    }
-    else if (!A->sorted)
-    {
-	/* A is in unsymmetric storage, but unsorted */
-	asym = CHOLMOD_MM_UNSYMMETRIC ;
-    }
-    else
-    {
-	/* CHOLMOD's stype is zero (stored in unsymmetric form) */
-	asym = EMPTY ;
-	zsym = EMPTY ;
-
-#ifndef NMATRIXOPS
-	/* determine if the matrices are in fact symmetric or Hermitian */
-	asym = CHOLMOD(symmetry) (A, 1, NULL, NULL, NULL, NULL, Common) ;
-	zsym = (Z == NULL) ? 999 :
-	       CHOLMOD(symmetry) (Z, 1, NULL, NULL, NULL, NULL, Common) ;
-#endif
-
-	if (asym == EMPTY || zsym <= CHOLMOD_MM_UNSYMMETRIC)
-	{
-	    /* not computed, out of memory, or Z is unsymmetric */
-	    asym = CHOLMOD_MM_UNSYMMETRIC ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* write the Matrix Market header */
-    /* ---------------------------------------------------------------------- */
-
-    ok = fprintf (f, "%%%%MatrixMarket matrix coordinate") > 0 ;
-
-    if (is_complex)
-    {
-	ok = ok && (fprintf (f, " complex") > 0) ;
-    }
-    else if (is_binary)
-    {
-	ok = ok && (fprintf (f, " pattern") > 0) ;
-    }
-    else if (is_integer)
-    {
-	ok = ok && (fprintf (f, " integer") > 0) ;
-    }
-    else
-    {
-	ok = ok && (fprintf (f, " real") > 0) ;
-    }
-
-    is_sym = FALSE ;
-
-    switch (asym)
-    {
-	case CHOLMOD_MM_RECTANGULAR:
-	case CHOLMOD_MM_UNSYMMETRIC:
-	    /* A is rectangular or unsymmetric */
-	    ok = ok && (fprintf (f, " general\n") > 0) ;
-	    is_sym = FALSE ;
-	    symmetry = CHOLMOD_MM_UNSYMMETRIC ;
-	    break ;
-
-	case CHOLMOD_MM_SYMMETRIC:
-	case CHOLMOD_MM_SYMMETRIC_POSDIAG:
-	    /* A is symmetric */
-	    ok = ok && (fprintf (f, " symmetric\n") > 0) ;
-	    is_sym = TRUE ;
-	    symmetry = CHOLMOD_MM_SYMMETRIC ;
-	    break ;
-
-	case CHOLMOD_MM_HERMITIAN:
-	case CHOLMOD_MM_HERMITIAN_POSDIAG:
-	    /* A is Hermitian */
-	    ok = ok && (fprintf (f, " Hermitian\n") > 0) ;
-	    is_sym = TRUE ;
-	    symmetry = CHOLMOD_MM_HERMITIAN ;
-	    break ;
-
-	case CHOLMOD_MM_SKEW_SYMMETRIC:
-	    /* A is skew symmetric */
-	    ok = ok && (fprintf (f, " skew-symmetric\n") > 0) ;
-	    is_sym = TRUE ;
-	    symmetry = CHOLMOD_MM_SKEW_SYMMETRIC ;
-	    break ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* include the comments if present */
-    /* ---------------------------------------------------------------------- */
-
-    ok = ok && include_comments (f, comments) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* write a sparse matrix (A and Z) */
-    /* ---------------------------------------------------------------------- */
-
-    nz = ntriplets (A, is_sym) + ntriplets (Z, is_sym) ;
-
-    /* write the first data line, with nrow, ncol, and # of triplets */
-    ok = ok && (fprintf (f, ID " " ID " " ID "\n", nrow, ncol, nz) > 0) ;
-
-    for (j = 0 ; ok && j < ncol ; j++)
-    {
-	/* merge column of A and Z */
-	p = Ap [j] ;
-	pend = (apacked) ? Ap [j+1] : p + Anz [j] ;
-	q = (Z == NULL) ? 0 : Zp [j] ;
-	qend = (Z == NULL) ? 0 : ((zpacked) ? Zp [j+1] : q + Znz [j]) ;
-	while (ok)
-	{
-	    /* get the next row index from A and Z */
-	    i  = (p < pend) ? Ai [p] : (nrow+1) ;
-	    iz = (q < qend) ? Zi [q] : (nrow+2) ;
-	    if (i <= iz)
-	    {
-		/* get A(i,j), or quit if both A and Z are exhausted */
-		if (i == nrow+1) break ;
-		get_value (Ax, Az, p, xtype, &x, &z) ;
-		p++ ;
-	    }
-	    else
-	    {
-		/* get Z(i,j) */
-		i = iz ;
-		x = 0 ;
-		z = 0 ;
-		q++ ;
-	    }
-	    if ((stype < 0 && i >= j) || (stype == 0 && (i >= j || !is_sym)))
-	    {
-		/* CHOLMOD matrix is symmetric-lower (and so is the file);
-		 * or CHOLMOD matrix is unsymmetric and either A(i,j) is in
-		 * the lower part or the file is unsymmetric. */
-		ok = ok && print_triplet (f, is_binary, is_complex, is_integer,
-		    i,j, x,z) ;
-	    }
-	    else if (stype > 0 && i <= j)
-	    {
-		/* CHOLMOD matrix is symmetric-upper, but the file is
-		 * symmetric-lower.  Need to transpose the entry.   If the
-		 * matrix is real, the complex part is ignored.  If the matrix
-		 * is complex, it Hermitian.
-		 */
-		ASSERT (IMPLIES (is_complex, asym == CHOLMOD_MM_HERMITIAN)) ;
-		if (z != 0)
-		{
-		    z = -z ;
-		}
-		ok = ok && print_triplet (f, is_binary, is_complex, is_integer,
-		    j,i, x,z) ;
-	    }
-	}
-    }
-
-    if (!ok)
-    {
-	ERROR (CHOLMOD_INVALID, "error reading/writing file") ;
-	return (EMPTY) ;
-    }
-
-    return (asym) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_write_dense ================================================== */
-/* ========================================================================== */
-
-/* Write a dense matrix to a file in Matrix Market format.   Optionally include
- * comments.  Returns > 0 if successful, -1 otherwise (1 if rectangular, 2 if
- * square).  Future versions may return 1 to 7 on success (a CHOLMOD_MM_* code,
- * just as cholmod_write_sparse does).
- *
- * A dense matrix is written in "general" format; symmetric formats in the
- * Matrix Market standard are not exploited.
- */
-
-int CHOLMOD(write_dense)
-(
-    /* ---- input ---- */
-    FILE *f,		    /* file to write to, must already be open */
-    cholmod_dense *X,	    /* matrix to print */
-    const char *comments,    /* optional filename of comments to include */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double x = 0, z = 0 ;
-    double *Xx, *Xz ;
-    Int nrow, ncol, is_complex, i, j, xtype, p ;
-    int ok ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (EMPTY) ;
-    RETURN_IF_NULL (f, EMPTY) ;
-    RETURN_IF_NULL (X, EMPTY) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, EMPTY) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get the X matrix */
-    /* ---------------------------------------------------------------------- */
-
-    Xx = X->x ;
-    Xz = X->z ;
-    nrow = X->nrow ;
-    ncol = X->ncol ;
-    xtype = X->xtype ;
-    is_complex = (xtype == CHOLMOD_COMPLEX) || (xtype == CHOLMOD_ZOMPLEX) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* write the Matrix Market header */
-    /* ---------------------------------------------------------------------- */
-
-    ok = (fprintf (f, "%%%%MatrixMarket matrix array") > 0) ;
-    if (is_complex)
-    {
-	ok = ok && (fprintf (f, " complex general\n") > 0) ;
-    }
-    else
-    {
-	ok = ok && (fprintf (f, " real general\n") > 0) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* include the comments if present */
-    /* ---------------------------------------------------------------------- */
-
-    ok = ok && include_comments (f, comments) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* write a dense matrix */
-    /* ---------------------------------------------------------------------- */
-
-    /* write the first data line, with nrow and ncol */
-    ok = ok && (fprintf (f, ID " " ID "\n", nrow, ncol) > 0) ;
-
-    Xx = X->x ;
-    Xz = X->z ;
-    for (j = 0 ; ok && j < ncol ; j++)
-    {
-	for (i = 0 ; ok && i < nrow ; i++)
-	{
-	    p = i + j*nrow ;
-	    get_value (Xx, Xz, p, xtype, &x, &z) ;
-	    ok = ok && print_value (f, x, FALSE) ;
-	    if (is_complex)
-	    {
-		ok = ok && (fprintf (f, " ") > 0) ;
-		ok = ok && print_value (f, z, FALSE) ;
-	    }
-	    ok = ok && (fprintf (f, "\n") > 0) ;
-	}
-    }
-
-    if (!ok)
-    {
-	ERROR (CHOLMOD_INVALID, "error reading/writing file") ;
-	return (EMPTY) ;
-    }
-
-    return ((nrow == ncol) ? CHOLMOD_MM_UNSYMMETRIC : CHOLMOD_MM_RECTANGULAR) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Check/lesser.txt b/src/C/SuiteSparse/CHOLMOD/Check/lesser.txt
deleted file mode 100644
index 8add30a..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Check/lesser.txt
+++ /dev/null
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-

-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-

-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-

-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-

-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-

-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-

-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-

-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-

-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/License.txt b/src/C/SuiteSparse/CHOLMOD/Cholesky/License.txt
deleted file mode 100644
index 800ac5e..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/License.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-CHOLMOD/Cholesky module, Copyright (C) 2005-2006, Timothy A. Davis
-CHOLMOD is also available under other licenses; contact authors for details.
-http://www.suitesparse.com
-
-Note that this license is for the CHOLMOD/Cholesky module only.
-All CHOLMOD modules are licensed separately.
-
-
---------------------------------------------------------------------------------
-
-
-This Module 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 Module is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this Module; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_amd.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_amd.c
deleted file mode 100644
index f15d07b..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_amd.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_amd ================================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD interface to the AMD ordering routine.  Orders A if the matrix is
- * symmetric.  On output, Perm [k] = i if row/column i of A is the kth
- * row/column of P*A*P'.  This corresponds to A(p,p) in MATLAB notation.
- *
- * If A is unsymmetric, cholmod_amd orders A*A'.  On output, Perm [k] = i if
- * row/column i of A*A' is the kth row/column of P*A*A'*P'.  This corresponds to
- * A(p,:)*A(p,:)' in MATLAB notation.  If f is present, A(p,f)*A(p,f)' is
- * ordered.
- *
- * Computes the flop count for a subsequent LL' factorization, the number
- * of nonzeros in L, and the number of nonzeros in the matrix ordered (A,
- * A*A' or A(:,f)*A(:,f)').
- *
- * workspace: Iwork (6*nrow). Head (nrow).
- *
- * Allocates a temporary copy of A+A' or A*A' (with
- * both upper and lower triangular parts) as input to AMD.
- *
- * Supports any xtype (pattern, real, complex, or zomplex)
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "amd.h"
-#include "cholmod_cholesky.h"
-
-#if (!defined (AMD_VERSION) || (AMD_VERSION < AMD_VERSION_CODE (2,0)))
-#error "AMD v2.0 or later is required"
-#endif
-
-/* ========================================================================== */
-/* === cholmod_amd ========================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(amd)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- output --- */
-    Int *Perm,		/* size A->nrow, output permutation */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double Info [AMD_INFO], Control2 [AMD_CONTROL], *Control ;
-    Int *Cp, *Len, *Nv, *Head, *Elen, *Degree, *Wi, *Iwork, *Next ;
-    cholmod_sparse *C ;
-    Int j, n, cnz ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    n = A->nrow ;
-
-    RETURN_IF_NULL (Perm, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    if (n == 0)
-    {
-	/* nothing to do */
-	Common->fl = 0 ;
-	Common->lnz = 0 ;
-	Common->anz = 0 ;
-	return (TRUE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* Note: this is less than the space used in cholmod_analyze, so if
-     * cholmod_amd is being called by that routine, no space will be
-     * allocated.
-     */
-
-    /* s = MAX (6*n, A->ncol) */
-    s = CHOLMOD(mult_size_t) (n, 6, &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-    s = MAX (s, A->ncol) ;
-
-    CHOLMOD(allocate_work) (n, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-
-    Iwork  = Common->Iwork ;
-    Degree = Iwork ;			/* size n */
-    Wi     = Iwork + n ;		/* size n */
-    Len    = Iwork + 2*((size_t) n) ;	/* size n */
-    Nv     = Iwork + 3*((size_t) n) ;   /* size n */
-    Next   = Iwork + 4*((size_t) n) ;   /* size n */
-    Elen   = Iwork + 5*((size_t) n) ;   /* size n */
-
-    Head = Common->Head ;   /* size n+1, but only n is used */
-
-    /* ---------------------------------------------------------------------- */
-    /* construct the input matrix for AMD */
-    /* ---------------------------------------------------------------------- */
-
-    if (A->stype == 0)
-    {
-	/* C = A*A' or A(:,f)*A(:,f)', add extra space of nnz(C)/2+n to C */
-	C = CHOLMOD(aat) (A, fset, fsize, -2, Common) ;
-    }
-    else
-    {
-	/* C = A+A', but use only the upper triangular part of A if A->stype = 1
-	 * and only the lower part of A if A->stype = -1.  Add extra space of
-	 * nnz(C)/2+n to C. */
-	C = CHOLMOD(copy) (A, 0, -2, Common) ;
-    }
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory, fset invalid, or other error */
-	return (FALSE) ;
-    }
-
-    Cp = C->p ;
-    for (j = 0 ; j < n ; j++)
-    {
-	Len [j] = Cp [j+1] - Cp [j] ;
-    }
-
-    /* C does not include the diagonal, and both upper and lower parts.
-     * Common->anz includes the diagonal, and just the lower part of C */
-    cnz = Cp [n] ;
-    Common->anz = cnz / 2 + n ;
-
-    /* ---------------------------------------------------------------------- */
-    /* order C using AMD */
-    /* ---------------------------------------------------------------------- */
-
-    /* get parameters */
-    if (Common->current < 0 || Common->current >= CHOLMOD_MAXMETHODS)
-    {
-	/* use AMD defaults */
-	Control = NULL ;
-    }
-    else
-    {
-	Control = Control2 ;
-	Control [AMD_DENSE] = Common->method [Common->current].prune_dense ;
-	Control [AMD_AGGRESSIVE] = Common->method [Common->current].aggressive ;
-    }
-
-#ifdef LONG
-    amd_l2 (n, C->p,  C->i, Len, C->nzmax, cnz, Nv, Next, Perm, Head, Elen,
-	    Degree, Wi, Control, Info) ;
-#else
-    amd_2 (n, C->p,  C->i, Len, C->nzmax, cnz, Nv, Next, Perm, Head, Elen,
-	    Degree, Wi, Control, Info) ;
-#endif
-
-    /* LL' flop count.  Need to subtract n for LL' flop count.  Note that this
-     * is a slight upper bound which is often exact (see AMD/Source/amd_2.c for
-     * details).  cholmod_analyze computes an exact flop count and fill-in. */
-    Common->fl = Info [AMD_NDIV] + 2 * Info [AMD_NMULTSUBS_LDL] + n ;
-
-    /* Info [AMD_LNZ] excludes the diagonal */
-    Common->lnz = n + Info [AMD_LNZ] ;
-
-    /* ---------------------------------------------------------------------- */
-    /* free the AMD workspace and clear the persistent workspace in Common */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (IMPLIES (Common->status == CHOLMOD_OK,
-		CHOLMOD(dump_perm) (Perm, n, n, "AMD2 perm", Common))) ;
-    CHOLMOD(free_sparse) (&C, Common) ;
-    for (j = 0 ; j <= n ; j++)
-    {
-	Head [j] = EMPTY ;
-    }
-    return (TRUE) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_analyze.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_analyze.c
deleted file mode 100644
index 62f8606..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_analyze.c
+++ /dev/null
@@ -1,942 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_analyze ============================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2013, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Order and analyze a matrix (either simplicial or supernodal), in prepartion
- * for numerical factorization via cholmod_factorize or via the "expert"
- * routines cholmod_rowfac and cholmod_super_numeric.
- *
- * symmetric case:    A or A(p,p)
- * unsymmetric case:  AA', A(p,:)*A(p,:)', A(:,f)*A(:,f)', or A(p,f)*A(p,f)'
- *
- * For the symmetric case, only the upper or lower triangular part of A is
- * accessed (depending on the type of A).  LL'=A (or permuted A) is analzed.
- * For the unsymmetric case (LL'=AA' or permuted A).
- *
- * There can be no duplicate entries in p or f.  p is of length m if A is
- * m-by-n.  f can be length 0 to n.
- *
- * In both cases, the columns of A need not be sorted.  A can be in packed
- * or unpacked form.
- *
- * Ordering options include:
- *
- *	natural:    A is not permuted to reduce fill-in
- *	given:	    a permutation can be provided to this routine (UserPerm)
- *	AMD:	    approximate minumum degree (AMD for the symmetric case,
- *		    COLAMD for the AA' case).
- *	METIS:	    nested dissection with METIS_NodeND
- *	NESDIS:	    nested dissection using METIS_NodeComputeSeparator,
- *		    typically followed by a constrained minimum degree
- *		    (CAMD for the symmetric case, CCOLAMD for the AA' case).
- *
- * Multiple ordering options can be tried (up to 9 of them), and the best one
- * is selected (the one that gives the smallest number of nonzeros in the
- * simplicial factor L).  If one method fails, cholmod_analyze keeps going, and
- * picks the best among the methods that succeeded.  This routine fails (and
- * returns NULL) if either initial memory allocation fails, all ordering methods
- * fail, or the supernodal analysis (if requested) fails.  By default, the 9
- * methods available are:
- *
- *	1) given permutation (skipped if UserPerm is NULL)
- *	2) AMD (symmetric case) or COLAMD (unsymmetric case)
- *	3) METIS with default parameters
- *	4) NESDIS with default parameters (stopping the partitioning when
- *	    the graph is of size nd_small = 200 or less, remove nodes with
- *	    more than max (16, prune_dense * sqrt (n)) nodes where
- *	    prune_dense = 10, and follow partitioning with CCOLAMD, a
- *	    constrained minimum degree ordering).
- *	5) natural
- *	6) NESDIS, nd_small = 20000, prune_dense = 10
- *	7) NESDIS, nd_small =     4, prune_dense = 10, no min degree
- *	8) NESDIS, nd_small =   200, prune_dense = 0
- *	9) COLAMD for A*A' or AMD for A
- *
- * By default, the first two are tried, and METIS is tried if AMD reports a high
- * flop count and fill-in.  Let fl denote the flop count for the AMD, ordering,
- * nnz(L) the # of nonzeros in L, and nnz(tril(A)) (or A*A').  If
- * fl/nnz(L) >= 500 and nnz(L)/nnz(tril(A)) >= 5, then METIS is attempted.  The
- * best ordering is used (UserPerm if given, AMD, and METIS if attempted).  If
- * you do not have METIS, only the first two will be tried (user permutation,
- * if provided, and AMD/COLAMD).  This default behavior is obtained when
- * Common->nmethods is zero.  In this case, methods 0, 1, and 2 in
- * Common->method [..] are reset to User-provided, AMD, and METIS (or NESDIS
- * if Common->default_nesdis is set to the non-default value of TRUE),
- * respectively.
- *
- * You can modify these 9 methods and the number of methods tried by changing
- * parameters in the Common argument.  If you know the best ordering for your
- * matrix, set Common->nmethods to 1 and set Common->method[0].ordering to the
- * requested ordering method.  Parameters for each method can also be modified
- * (refer to cholmod.h for details).
- *
- * Note that it is possible for METIS to terminate your program if it runs out
- * of memory.  This is not the case for any CHOLMOD or minimum degree ordering
- * routine (AMD, COLAMD, CAMD, CCOLAMD, or CSYMAMD).  Since NESDIS relies on
- * METIS, it too can terminate your program.
- *
- * The factor L is returned as simplicial symbolic (L->is_super FALSE) if
- * Common->supernodal <= CHOLMOD_SIMPLICIAL (0) or as supernodal symbolic if
- * Common->supernodal >= CHOLMOD_SUPERNODAL (2).  If Common->supernodal is
- * equal to CHOLMOD_AUTO (1), then L is simplicial if the flop count per
- * nonzero in L is less than Common->supernodal_switch (default: 40), and
- * is returned as a supernodal factor otherwise.
- *
- * In both cases, L->xtype is CHOLMOD_PATTERN.
- * A subsequent call to cholmod_factorize will perform a
- * simplicial or supernodal factorization, depending on the type of L.
- *
- * For the simplicial case, L contains the fill-reducing permutation (L->Perm)
- * and the counts of nonzeros in each column of L (L->ColCount).  For the
- * supernodal case, L also contains the nonzero pattern of each supernode.
- *
- * workspace: Flag (nrow), Head (nrow+1)
- *	if symmetric:   Iwork (6*nrow)
- *	if unsymmetric: Iwork (6*nrow+ncol).
- *	calls various ordering routines, which typically allocate O(nnz(A))
- *	temporary workspace ((2 to 3)*nnz(A) * sizeof (Int) is typical, but it
- *	can be much higher if A*A' must be explicitly formed for METIS).  Also
- *	allocates up to 2 temporary (permuted/transpose) copies of the nonzero
- *	pattern of A, and up to 3*n*sizeof(Int) additional workspace.
- *
- * Supports any xtype (pattern, real, complex, or zomplex)
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-#ifndef NSUPERNODAL
-#include "cholmod_supernodal.h"
-#endif
-
-#ifndef NPARTITION
-#include "cholmod_partition.h"
-#endif
-
-
-/* ========================================================================== */
-/* === cholmod_analyze ====================================================== */
-/* ========================================================================== */
-
-/* Orders and analyzes A, AA', PAP', or PAA'P' and returns a symbolic factor
- * that can later be passed to cholmod_factorize. */
-
-cholmod_factor *CHOLMOD(analyze)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order and analyze */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    return (CHOLMOD(analyze_p2) (TRUE, A, NULL, NULL, 0, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_analyze_p ==================================================== */
-/* ========================================================================== */
-
-/* Orders and analyzes A, AA', PAP', PAA'P', FF', or PFF'P and returns a
- * symbolic factor that can later be passed to cholmod_factorize, where
- * F = A(:,fset) if fset is not NULL and A->stype is zero.
- * UserPerm is tried if non-NULL.  */
-
-cholmod_factor *CHOLMOD(analyze_p)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order and analyze */
-    Int *UserPerm,	/* user-provided permutation, size A->nrow */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    return (CHOLMOD(analyze_p2) (TRUE, A, UserPerm, fset, fsize, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === permute_matrices ===================================================== */
-/* ========================================================================== */
-
-/* Permute and transpose a matrix.  Allocates the A1 and A2 matrices, if needed,
- * or returns them as NULL if not needed.
- */
-
-static int permute_matrices
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to permute */
-    Int ordering,	/* ordering method used */
-    Int *Perm,		/* fill-reducing permutation */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    Int do_rowcolcounts,/* if TRUE, compute both S and F.  If FALSE, only
-			 * S is needed for the symmetric case, and only F for
-			 * the unsymmetric case */
-    /* ---- output --- */
-    cholmod_sparse **A1_handle,	    /* see comments below for A1, A2, S, F */
-    cholmod_sparse **A2_handle,
-    cholmod_sparse **S_handle,
-    cholmod_sparse **F_handle,
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *A1, *A2, *S, *F ;
-
-    *A1_handle = NULL ;
-    *A2_handle = NULL ;
-    *S_handle = NULL ;
-    *F_handle = NULL ;
-    A1 = NULL ;
-    A2 = NULL ;
-
-    if (ordering == CHOLMOD_NATURAL)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* natural ordering of A */
-	/* ------------------------------------------------------------------ */
-
-	if (A->stype < 0)
-	{
-	    /* symmetric lower case: A already in lower form, so S=A' */
-	    /* workspace: Iwork (nrow) */
-	    A2 = CHOLMOD(ptranspose) (A, 0, NULL, NULL, 0, Common) ;
-	    F = A ;
-	    S = A2 ;
-	}
-	else if (A->stype > 0)
-	{
-	    /* symmetric upper case: F = pattern of triu (A)', S = A */
-	    /* workspace: Iwork (nrow) */
-	    if (do_rowcolcounts)
-	    {
-		/* F not needed for symmetric case if do_rowcolcounts FALSE */
-		A1 = CHOLMOD(ptranspose) (A, 0, NULL, fset, fsize, Common) ;
-	    }
-	    F = A1 ;
-	    S = A ;
-	}
-	else
-	{
-	    /* unsymmetric case: F = pattern of A (:,f)',  S = A */
-	    /* workspace: Iwork (nrow if no fset, MAX(nrow,ncol) if fset) */
-	    A1 = CHOLMOD(ptranspose) (A, 0, NULL, fset, fsize, Common) ;
-	    F = A1 ;
-	    S = A ;
-	}
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A is permuted */
-	/* ------------------------------------------------------------------ */
-
-	if (A->stype < 0)
-	{
-	    /* symmetric lower case: S = tril (A (p,p))' and F = S' */
-	    /* workspace: Iwork (2*nrow) */
-	    A2 = CHOLMOD(ptranspose) (A, 0, Perm, NULL, 0, Common) ;
-	    S = A2 ;
-	    /* workspace: Iwork (nrow) */
-	    if (do_rowcolcounts)
-	    {
-		/* F not needed for symmetric case if do_rowcolcounts FALSE */
-		A1 = CHOLMOD(ptranspose) (A2, 0, NULL, NULL, 0, Common) ;
-	    }
-	    F = A1 ;
-	}
-	else if (A->stype > 0)
-	{
-	    /* symmetric upper case: F = triu (A (p,p))' and S = F' */
-	    /* workspace: Iwork (2*nrow) */
-	    A1 = CHOLMOD(ptranspose) (A, 0, Perm, NULL, 0, Common) ;
-	    F = A1 ;
-	    /* workspace: Iwork (nrow) */
-	    A2 = CHOLMOD(ptranspose) (A1, 0, NULL, NULL, 0, Common) ;
-	    S = A2 ;
-	}
-	else
-	{
-	    /* unsymmetric case:     F = A (p,f)'         and S = F' */
-	    /* workspace: Iwork (nrow if no fset, MAX(nrow,ncol) if fset) */
-	    A1 = CHOLMOD(ptranspose) (A, 0, Perm, fset, fsize, Common) ;
-	    F = A1 ;
-	    if (do_rowcolcounts)
-	    {
-		/* S not needed for unsymmetric case if do_rowcolcounts FALSE */
-		/* workspace: Iwork (nrow) */
-		A2 = CHOLMOD(ptranspose) (A1, 0, NULL, NULL, 0, Common) ;
-	    }
-	    S = A2 ;
-	}
-    }
-
-    /* If any cholmod_*transpose fails, one or more matrices will be NULL */
-    *A1_handle = A1 ;
-    *A2_handle = A2 ;
-    *S_handle = S ;
-    *F_handle = F ;
-    return (Common->status == CHOLMOD_OK) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_analyze_ordering ============================================= */
-/* ========================================================================== */
-
-/* Given a matrix A and its fill-reducing permutation, compute the elimination
- * tree, its (non-weighted) postordering, and the number of nonzeros in each
- * column of L.  Also computes the flop count, the total nonzeros in L, and
- * the nonzeros in A (Common->fl, Common->lnz, and Common->anz).
- *
- * The column counts of L, flop count, and other statistics from
- * cholmod_rowcolcounts are not computed if ColCount is NULL.
- *
- * workspace: Iwork (2*nrow if symmetric, 2*nrow+ncol if unsymmetric),
- *	Flag (nrow), Head (nrow+1)
- */
-
-int CHOLMOD(analyze_ordering)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    int ordering,	/* ordering method used */
-    Int *Perm,		/* size n, fill-reducing permutation to analyze */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- output --- */
-    Int *Parent,	/* size n, elimination tree */
-    Int *Post,		/* size n, postordering of elimination tree */
-    Int *ColCount,	/* size n, nnz in each column of L */
-    /* ---- workspace  */
-    Int *First,		/* size n workspace for cholmod_postorder */
-    Int *Level,		/* size n workspace for cholmod_postorder */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *A1, *A2, *S, *F ;
-    Int n, ok, do_rowcolcounts ;
-
-    /* check inputs */
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-
-    n = A->nrow ;
-
-    do_rowcolcounts = (ColCount != NULL) ;
-
-    /* permute A according to Perm and fset */
-    ok = permute_matrices (A, ordering, Perm, fset, fsize, do_rowcolcounts,
-	    &A1, &A2, &S, &F, Common) ;
-
-    /* find etree of S (symmetric upper/lower case) or F (unsym case) */
-    /* workspace: symmmetric: Iwork (nrow), unsym: Iwork (nrow+ncol) */
-    ok = ok && CHOLMOD(etree) (A->stype ? S:F, Parent, Common) ;
-
-    /* postorder the etree (required by cholmod_rowcolcounts) */
-    /* workspace: Iwork (2*nrow) */
-    ok = ok && (CHOLMOD(postorder) (Parent, n, NULL, Post, Common) == n) ;
-
-    /* cholmod_postorder doesn't set Common->status if it returns < n */
-    Common->status = (!ok && Common->status == CHOLMOD_OK) ?
-	CHOLMOD_INVALID : Common->status ;
-
-    /* analyze LL'=S or SS' or S(:,f)*S(:,f)' */
-    /* workspace:
-     *	if symmetric:   Flag (nrow), Iwork (2*nrow)
-     *	if unsymmetric: Flag (nrow), Iwork (2*nrow+ncol), Head (nrow+1)
-     */
-    if (do_rowcolcounts)
-    {
-	ok = ok && CHOLMOD(rowcolcounts) (A->stype ? F:S, fset, fsize, Parent,
-	    Post, NULL, ColCount, First, Level, Common) ;
-    }
-
-    /* free temporary matrices and return result */
-    CHOLMOD(free_sparse) (&A1, Common) ;
-    CHOLMOD(free_sparse) (&A2, Common) ;
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === Free workspace and return L ========================================== */
-/* ========================================================================== */
-
-#define FREE_WORKSPACE_AND_RETURN \
-{ \
-    Common->no_workspace_reallocate = FALSE ; \
-    CHOLMOD(free) (n, sizeof (Int), Lparent,  Common) ; \
-    CHOLMOD(free) (n, sizeof (Int), Perm,     Common) ; \
-    CHOLMOD(free) (n, sizeof (Int), ColCount, Common) ; \
-    if (Common->status < CHOLMOD_OK) \
-    { \
-	CHOLMOD(free_factor) (&L, Common) ; \
-    } \
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ; \
-    return (L) ; \
-}
-
-
-/* ========================================================================== */
-/* === cholmod_analyze_p2 =================================================== */
-/* ========================================================================== */
-
-/* Ordering and analysis for sparse Cholesky or sparse QR.  */
-
-cholmod_factor *CHOLMOD(analyze_p2)
-(
-    /* ---- input ---- */
-    int for_whom,       /* FOR_SPQR     (0): for SPQR but not GPU-accelerated
-                           FOR_CHOLESKY (1): for Cholesky (GPU or not)
-                           FOR_SPQRGPU  (2): for SPQR with GPU acceleration */
-    cholmod_sparse *A,	/* matrix to order and analyze */
-    Int *UserPerm,	/* user-provided permutation, size A->nrow */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double lnz_best ;
-    Int *First, *Level, *Work4n, *Cmember, *CParent, *ColCount, *Lperm, *Parent,
-	*Post, *Perm, *Lparent, *Lcolcount ;
-    cholmod_factor *L ;
-    Int k, n, ordering, method, nmethods, status, default_strategy, ncol, uncol,
-	skip_analysis, skip_best ;
-    Int amd_backup ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, NULL) ;
-    Common->status = CHOLMOD_OK ;
-    status = CHOLMOD_OK ;
-    Common->selected = EMPTY ;
-    Common->called_nd = FALSE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    n = A->nrow ;
-    ncol = A->ncol ;
-    uncol = (A->stype == 0) ? (A->ncol) : 0 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* set the default strategy */
-    /* ---------------------------------------------------------------------- */
-
-    lnz_best = (double) EMPTY ;
-    skip_best = FALSE ;
-    nmethods = MIN (Common->nmethods, CHOLMOD_MAXMETHODS) ;
-    nmethods = MAX (0, nmethods) ;
-
-#ifndef NDEBUG
-    PRINT1 (("cholmod_analyze_p2 :: nmethods "ID"\n", nmethods)) ;
-    for (method = 0 ; method < nmethods ; method++)
-    {
-        PRINT1 (("  "ID": ordering "ID"\n",     
-            method, Common->method [method].ordering)) ;
-    }
-#endif
-
-    default_strategy = (nmethods == 0) ;
-    if (default_strategy)
-    {
-	/* default strategy: try UserPerm, if given.  Try AMD for A, or AMD
-	 * to order A*A'.  Try METIS for the symmetric case only if AMD reports
-         * a high degree of fill-in and flop count.  METIS is not tried if the
-         * Partition Module isn't installed.   If Common->default_nesdis is
-         * TRUE, then NESDIS is used as the 3rd ordering instead. */
-	Common->method [0].ordering = CHOLMOD_GIVEN ;/* skip if UserPerm NULL */
-	Common->method [1].ordering = CHOLMOD_AMD ;
-	Common->method [2].ordering = 
-	    (Common->default_nesdis ? CHOLMOD_NESDIS : CHOLMOD_METIS) ;
-        amd_backup = FALSE ;
-#ifndef NPARTITION
-	nmethods = 3 ;
-#else
-	nmethods = 2 ;
-#endif
-    }
-    else
-    {
-        /* If only METIS and NESDIS are selected, or if 2 or more methods are
-         * being tried, then enable AMD backup */
-        amd_backup = (nmethods > 1) || (nmethods == 1 &&
-            (Common->method [0].ordering == CHOLMOD_METIS ||
-             Common->method [0].ordering == CHOLMOD_NESDIS)) ;
-    }
-
-#ifdef NSUPERNODAL
-    /* CHOLMOD Supernodal module not installed, just do simplicial analysis */
-    Common->supernodal = CHOLMOD_SIMPLICIAL ;
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* Note: enough space needs to be allocated here so that routines called by
-     * cholmod_analyze do not reallocate the space.
-     */
-
-    /* s = 6*n + uncol */
-    s = CHOLMOD(mult_size_t) (n, 6, &ok) ;
-    s = CHOLMOD(add_size_t) (s, uncol, &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (NULL) ;
-    }
-
-    CHOLMOD(allocate_work) (n, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ensure that subsequent routines, called by cholmod_analyze, do not
-     * reallocate any workspace.  This is set back to FALSE in the
-     * FREE_WORKSPACE_AND_RETURN macro, which is the only way this function
-     * returns to its caller. */
-    Common->no_workspace_reallocate = TRUE ;
-
-    /* Use the last 4*n Int's in Iwork for Parent, First, Level, and Post, since
-     * other CHOLMOD routines will use the first 2n+uncol space.  The ordering
-     * routines (cholmod_amd, cholmod_colamd, cholmod_ccolamd, cholmod_metis)
-     * are an exception.  They can use all 6n + ncol space, since the contents
-     * of Parent, First, Level, and Post are not needed across calls to those
-     * routines. */
-    Work4n = Common->Iwork ;
-    Work4n += 2*((size_t) n) + uncol ;
-    Parent = Work4n ;
-    First  = Work4n + n ;
-    Level  = Work4n + 2*((size_t) n) ;
-    Post   = Work4n + 3*((size_t) n) ;
-
-    /* note that this assignment means that cholmod_nested_dissection,
-     * cholmod_ccolamd, and cholmod_camd can use only the first 4n+uncol
-     * space in Common->Iwork */
-    Cmember = Post ;
-    CParent = Level ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate more workspace, and an empty simplicial symbolic factor */
-    /* ---------------------------------------------------------------------- */
-
-    L = CHOLMOD(allocate_factor) (n, Common) ;
-    Lparent  = CHOLMOD(malloc) (n, sizeof (Int), Common) ;
-    Perm     = CHOLMOD(malloc) (n, sizeof (Int), Common) ;
-    ColCount = CHOLMOD(malloc) (n, sizeof (Int), Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	FREE_WORKSPACE_AND_RETURN ;
-    }
-    Lperm = L->Perm ;
-    Lcolcount = L->ColCount ;
-    Common->anz = EMPTY ;
-
-    /* ---------------------------------------------------------------------- */
-    /* try all the requested ordering options and backup to AMD if needed */
-    /* ---------------------------------------------------------------------- */
-
-    /* turn off error handling [ */
-    Common->try_catch = TRUE ;
-
-    for (method = 0 ; method <= nmethods ; method++)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* determine the method to try */
-	/* ------------------------------------------------------------------ */
-
-	Common->fl = EMPTY ;
-	Common->lnz = EMPTY ;
-	skip_analysis = FALSE ;
-
-	if (method == nmethods)
-	{
-	    /* All methods failed: backup to AMD */
-	    if (Common->selected == EMPTY && amd_backup)
-	    {
-		PRINT1 (("All methods requested failed: backup to AMD\n")) ;
-		ordering = CHOLMOD_AMD ;
-	    }
-	    else
-	    {
-		break ;
-	    }
-	}
-	else
-	{
-	    ordering = Common->method [method].ordering ;
-	}
-	Common->current = method ;
-	PRINT1 (("method "ID": Try method: "ID"\n", method, ordering)) ;
-
-	/* ------------------------------------------------------------------ */
-	/* find the fill-reducing permutation */
-	/* ------------------------------------------------------------------ */
-
-	if (ordering == CHOLMOD_NATURAL)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* natural ordering */
-	    /* -------------------------------------------------------------- */
-
-	    for (k = 0 ; k < n ; k++)
-	    {
-		Perm [k] = k ;
-	    }
-
-	}
-	else if (ordering == CHOLMOD_GIVEN)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* use given ordering of A, if provided */
-	    /* -------------------------------------------------------------- */
-
-	    if (UserPerm == NULL)
-	    {
-		/* this is not an error condition */
-		PRINT1 (("skip, no user perm given\n")) ;
-		continue ;
-	    }
-	    for (k = 0 ; k < n ; k++)
-	    {
-		/* UserPerm is checked in cholmod_ptranspose */
-		Perm [k] = UserPerm [k] ;
-	    }
-
-	}
-	else if (ordering == CHOLMOD_AMD)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* AMD ordering of A, A*A', or A(:,f)*A(:,f)' */
-	    /* -------------------------------------------------------------- */
-
-            amd_backup = FALSE ;    /* no need to try AMD twice ... */
-	    CHOLMOD(amd) (A, fset, fsize, Perm, Common) ;
-	    skip_analysis = TRUE ;
-
-	}
-	else if (ordering == CHOLMOD_COLAMD)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* AMD for symmetric case, COLAMD for A*A' or A(:,f)*A(:,f)' */
-	    /* -------------------------------------------------------------- */
-
-	    if (A->stype)
-	    {
-		CHOLMOD(amd) (A, fset, fsize, Perm, Common) ;
-		skip_analysis = TRUE ;
-	    }
-	    else
-	    {
-		/* Alternative:
-		CHOLMOD(ccolamd) (A, fset, fsize, NULL, Perm, Common) ;
-		*/
-		/* do not postorder, it is done later, below */
-		/* workspace: Iwork (4*nrow+uncol), Flag (nrow), Head (nrow+1)*/
-		CHOLMOD(colamd) (A, fset, fsize, FALSE, Perm, Common) ;
-	    }
-
-	}
-	else if (ordering == CHOLMOD_METIS)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* use METIS_NodeND directly (via a CHOLMOD wrapper) */
-	    /* -------------------------------------------------------------- */
-
-#ifndef NPARTITION
-	    /* postorder parameter is false, because it will be later, below */
-	    /* workspace: Iwork (4*nrow+uncol), Flag (nrow), Head (nrow+1) */
-	    Common->called_nd = TRUE ;
-	    CHOLMOD(metis) (A, fset, fsize, FALSE, Perm, Common) ;
-#else
-	    Common->status = CHOLMOD_NOT_INSTALLED ;
-#endif
-
-	}
-	else if (ordering == CHOLMOD_NESDIS)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* use CHOLMOD's nested dissection */
-	    /* -------------------------------------------------------------- */
-
-	    /* this method is based on METIS' node bissection routine
-	     * (METIS_NodeComputeSeparator).  In contrast to METIS_NodeND,
-	     * it calls CAMD or CCOLAMD on the whole graph, instead of MMD
-	     * on just the leaves. */
-#ifndef NPARTITION
-	    /* workspace: Flag (nrow), Head (nrow+1), Iwork (2*nrow) */
-	    Common->called_nd = TRUE ;
-	    CHOLMOD(nested_dissection) (A, fset, fsize, Perm, CParent, Cmember,
-		    Common) ;
-#else
-	    Common->status = CHOLMOD_NOT_INSTALLED ;
-#endif
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* invalid ordering method */
-	    /* -------------------------------------------------------------- */
-
-	    Common->status = CHOLMOD_INVALID ;
-	    PRINT1 (("No such ordering: "ID"\n", ordering)) ;
-	}
-
-	ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory, or method failed */
-	    status = MIN (status, Common->status) ;
-	    Common->status = CHOLMOD_OK ;
-	    continue ;
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* analyze the ordering */
-	/* ------------------------------------------------------------------ */
-
-	if (!skip_analysis)
-	{
-	    if (!CHOLMOD(analyze_ordering) (A, ordering, Perm, fset, fsize,
-		    Parent, Post, ColCount, First, Level, Common))
-	    {
-		/* ordering method failed; clear status and try next method */
-		status = MIN (status, Common->status) ;
-		Common->status = CHOLMOD_OK ;
-		continue ;
-	    }
-	}
-
-	ASSERT (Common->fl >= 0 && Common->lnz >= 0) ;
-	Common->method [method].fl  = Common->fl ;
-	Common->method [method].lnz = Common->lnz ;
-	PRINT1 (("lnz %g fl %g\n", Common->lnz, Common->fl)) ;
-
-	/* ------------------------------------------------------------------ */
-	/* pick the best method */
-	/* ------------------------------------------------------------------ */
-
-	/* fl.pt. compare, but lnz can never be NaN */
-	if (Common->selected == EMPTY || Common->lnz < lnz_best)
-	{
-	    Common->selected = method ;
-	    PRINT1 (("this is best so far, method "ID"\n", method)) ;
-	    L->ordering = ordering ;
-	    lnz_best = Common->lnz ;
-	    for (k = 0 ; k < n ; k++)
-	    {
-		Lperm [k] = Perm [k] ;
-	    }
-	    /* save the results of cholmod_analyze_ordering, if it was called */
-	    skip_best = skip_analysis ;
-	    if (!skip_analysis)
-	    {
-		/* save the column count; becomes permanent part of L */
-		for (k = 0 ; k < n ; k++)
-		{
-		    Lcolcount [k] = ColCount [k] ;
-		}
-		/* Parent is needed for weighted postordering and for supernodal
-		 * analysis.  Does not become a permanent part of L */
-		for (k = 0 ; k < n ; k++)
-		{
-		    Lparent [k] = Parent [k] ;
-		}
-	    }
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* determine if METIS is to be skipped */
-	/* ------------------------------------------------------------------ */
-
-	if (default_strategy && ordering == CHOLMOD_AMD)
-	{
-	    if ((Common->fl < 500 * Common->lnz) ||
-		(Common->lnz < 5 * Common->anz))
-	    {
-		/* AMD found an ordering with less than 500 flops per nonzero in
-		 * L, or one with a fill-in ratio (nnz(L)/nnz(A)) of less than
-		 * 5.  This is pretty good, and it's unlikely that METIS will do
-		 * better (this heuristic is based on tests on all symmetric
-		 * positive definite matrices in the UF sparse matrix
-		 * collection, and it works well across a wide range of
-		 * problems).  METIS can take much more time than AMD. */
-		break ;
-	    }
-	}
-    }
-
-    /* turn error printing back on ] */
-    Common->try_catch = FALSE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* return if no ordering method succeeded */
-    /* ---------------------------------------------------------------------- */
-
-    if (Common->selected == EMPTY)
-    {
-	/* All methods failed.  
-	 * If two or more methods failed, they may have failed for different
-	 * reasons.  Both would clear Common->status and skip to the next
-	 * method.  Common->status needs to be restored here to the worst error
-	 * obtained in any of the methods.  CHOLMOD_INVALID is worse
-	 * than CHOLMOD_OUT_OF_MEMORY, since the former implies something may
-	 * be wrong with the user's input.  CHOLMOD_OUT_OF_MEMORY is simply an
-	 * indication of lack of resources. */
-        if (status >= CHOLMOD_OK)
-        {
-            /* this can occur if nmethods = 1, ordering = CHOLMOD_GIVEN,
-               but UserPerm is NULL */
-            status = CHOLMOD_INVALID ;
-        }
-	ERROR (status, "all methods failed") ;
-	FREE_WORKSPACE_AND_RETURN ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* do the analysis for AMD, if skipped */
-    /* ---------------------------------------------------------------------- */
-
-    Common->fl  = Common->method [Common->selected].fl  ;
-    Common->lnz = Common->method [Common->selected].lnz ;
-    ASSERT (Common->lnz >= 0) ;
-
-    if (skip_best)
-    {
-	if (!CHOLMOD(analyze_ordering) (A, L->ordering, Lperm, fset, fsize,
-		Lparent, Post, Lcolcount, First, Level, Common))
-	{
-	    /* out of memory, or method failed */
-	    FREE_WORKSPACE_AND_RETURN ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* postorder the etree, weighted by the column counts */
-    /* ---------------------------------------------------------------------- */
-
-    if (Common->postorder)
-    {
-	/* combine the fill-reducing ordering with the weighted postorder */
-	/* workspace: Iwork (2*nrow) */
-	if (CHOLMOD(postorder) (Lparent, n, Lcolcount, Post, Common) == n)
-	{
-	    /* use First and Level as workspace [ */
-	    Int *Wi = First, *InvPost = Level ;
-	    Int newchild, oldchild, newparent, oldparent ;
-
-	    for (k = 0 ; k < n ; k++)
-	    {
-		Wi [k] = Lperm [Post [k]] ;
-	    }
-	    for (k = 0 ; k < n ; k++)
-	    {
-		Lperm [k] = Wi [k] ;
-	    }
-
-	    for (k = 0 ; k < n ; k++)
-	    {
-		Wi [k] = Lcolcount [Post [k]] ;
-	    }
-	    for (k = 0 ; k < n ; k++)
-	    {
-		Lcolcount [k] = Wi [k] ;
-	    }
-	    for (k = 0 ; k < n ; k++)
-	    {
-		InvPost [Post [k]] = k ;
-	    }
-
-	    /* updated Lparent needed only for supernodal case */
-	    for (newchild = 0 ; newchild < n ; newchild++)
-	    {
-		oldchild = Post [newchild] ;
-		oldparent = Lparent [oldchild] ;
-		newparent = (oldparent == EMPTY) ? EMPTY : InvPost [oldparent] ;
-		Wi [newchild] = newparent ;
-	    }
-	    for (k = 0 ; k < n ; k++)
-	    {
-		Lparent [k] = Wi [k] ;
-	    }
-	    /* done using Iwork as workspace ] */
-
-	    /* L is now postordered, no longer in natural ordering */
-	    if (L->ordering == CHOLMOD_NATURAL)
-	    {
-		L->ordering = CHOLMOD_POSTORDERED ;
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* supernodal analysis, if requested or if selected automatically */
-    /* ---------------------------------------------------------------------- */
-
-#ifndef NSUPERNODAL
-    if (Common->supernodal > CHOLMOD_AUTO
-    || (Common->supernodal == CHOLMOD_AUTO &&
-	Common->lnz > 0 &&
-	(Common->fl / Common->lnz) >= Common->supernodal_switch))
-    {
-	cholmod_sparse *S, *F, *A2, *A1 ;
-
-	permute_matrices (A, L->ordering, Lperm, fset, fsize, TRUE,
-		&A1, &A2, &S, &F, Common) ;
-
-	/* workspace: Flag (nrow), Head (nrow), Iwork (5*nrow) */
-	CHOLMOD(super_symbolic2) (for_whom, S, F, Lparent, L, Common) ;
-	PRINT1 (("status %d\n", Common->status)) ;
-
-	CHOLMOD(free_sparse) (&A1, Common) ;
-	CHOLMOD(free_sparse) (&A2, Common) ;
-    }
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* free temporary matrices and workspace, and return result L */
-    /* ---------------------------------------------------------------------- */
-
-    FREE_WORKSPACE_AND_RETURN ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_colamd.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_colamd.c
deleted file mode 100644
index 34046bc..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_colamd.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_colamd ============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD interface to the COLAMD ordering routine (version 2.4 or later).
- * Finds a permutation p such that the Cholesky factorization of PAA'P' is
- * sparser than AA' using colamd.  If the postorder input parameter is TRUE,
- * the column etree is found and postordered, and the colamd ordering is then
- * combined with its postordering.  A must be unsymmetric.
- *
- * There can be no duplicate entries in f.
- * f can be length 0 to n if A is m-by-n.
- *
- * workspace: Iwork (4*nrow+ncol), Head (nrow+1), Flag (nrow)
- *	Allocates a copy of its input matrix, which
- *	is then used as CCOLAMD's workspace.
- *
- * Supports any xtype (pattern, real, complex, or zomplex)
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "colamd.h"
-#include "cholmod_cholesky.h"
-
-#if (!defined (COLAMD_VERSION) || (COLAMD_VERSION < COLAMD_VERSION_CODE (2,5)))
-#error "COLAMD v2.5 or later is required"
-#endif
-
-/* ========================================================================== */
-/* === cholmod_colamd ======================================================= */
-/* ========================================================================== */
-
-int CHOLMOD(colamd)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int postorder,	/* if TRUE, follow with a coletree postorder */
-    /* ---- output --- */
-    Int *Perm,		/* size A->nrow, output permutation */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double knobs [COLAMD_KNOBS] ;
-    cholmod_sparse *C ;
-    Int *NewPerm, *Parent, *Post, *Work2n ;
-    Int k, nrow, ncol ;
-    size_t s, alen ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (Perm, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (A->stype != 0)
-    {
-	ERROR (CHOLMOD_INVALID, "matrix must be unsymmetric") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* Note: this is less than the space used in cholmod_analyze, so if
-     * cholmod_colamd is being called by that routine, no space will be
-     * allocated.
-     */
-
-    /* s = 4*nrow + ncol */
-    s = CHOLMOD(mult_size_t) (nrow, 4, &ok) ;
-    s = CHOLMOD(add_size_t) (s, ncol, &ok) ;
-
-#ifdef LONG
-    alen = colamd_l_recommended (A->nzmax, ncol, nrow) ;
-    colamd_l_set_defaults (knobs) ;
-#else
-    alen = colamd_recommended (A->nzmax, ncol, nrow) ;
-    colamd_set_defaults (knobs) ;
-#endif
-
-    if (!ok || alen == 0)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "matrix invalid or too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (0, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate COLAMD workspace */
-    /* ---------------------------------------------------------------------- */
-
-    C = CHOLMOD(allocate_sparse) (ncol, nrow, alen, TRUE, TRUE, 0,
-	    CHOLMOD_PATTERN, Common) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* copy (and transpose) the input matrix A into the colamd workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* C = A (:,f)', which also packs A if needed. */
-    /* workspace: Iwork (nrow if no fset; MAX (nrow,ncol) if fset) */
-    ok = CHOLMOD(transpose_unsym) (A, 0, NULL, fset, fsize, C, Common) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* order the matrix (destroys the contents of C->i and C->p) */
-    /* ---------------------------------------------------------------------- */
-
-    /* get parameters */
-    if (Common->current < 0 || Common->current >= CHOLMOD_MAXMETHODS)
-    {
-	/* this is the CHOLMOD default, not the COLAMD default */
-	knobs [COLAMD_DENSE_ROW] = -1 ;
-    }
-    else
-    {
-	/* get the knobs from the Common parameters */
-	knobs [COLAMD_DENSE_COL] = Common->method[Common->current].prune_dense ;
-	knobs [COLAMD_DENSE_ROW] = Common->method[Common->current].prune_dense2;
-	knobs [COLAMD_AGGRESSIVE] = Common->method[Common->current].aggressive ;
-    }
-
-    if (ok)
-    {
-	Int *Cp ;
-	Int stats [COLAMD_STATS] ;
-	Cp = C->p ;
-
-#ifdef LONG
-	colamd_l (ncol, nrow, alen, C->i, Cp, knobs, stats) ;
-#else
-	colamd (ncol, nrow, alen, C->i, Cp, knobs, stats) ;
-#endif
-
-	ok = stats [COLAMD_STATUS] ;
-	ok = (ok == COLAMD_OK || ok == COLAMD_OK_BUT_JUMBLED) ;
-	/* permutation returned in C->p, if the ordering succeeded */
-	for (k = 0 ; k < nrow ; k++)
-	{
-	    Perm [k] = Cp [k] ;
-	}
-    }
-
-    CHOLMOD(free_sparse) (&C, Common) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* column etree postordering */
-    /* ---------------------------------------------------------------------- */
-
-    if (postorder)
-    {
-	/* use the last 2*n space in Iwork for Parent and Post */
-	Work2n = Common->Iwork ;
-	Work2n += 2*((size_t) nrow) + ncol ;
-	Parent = Work2n ;		/* size nrow (i/i/l) */
-	Post   = Work2n + nrow ;	/* size nrow (i/i/l) */
-
-	/* workspace: Iwork (2*nrow+ncol), Flag (nrow), Head (nrow+1) */
-	ok = ok && CHOLMOD(analyze_ordering) (A, CHOLMOD_COLAMD, Perm, fset,
-		fsize, Parent, Post, NULL, NULL, NULL, Common) ;
-
-	/* combine the colamd permutation with its postordering */
-	if (ok)
-	{
-	    NewPerm = Common->Iwork ;		/* size nrow (i/i/l) */
-	    for (k = 0 ; k < nrow ; k++)
-	    {
-		NewPerm [k] = Perm [Post [k]] ;
-	    }
-	    for (k = 0 ; k < nrow ; k++)
-	    {
-		Perm [k] = NewPerm [k] ;
-	    }
-	}
-    }
-
-    return (ok) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_etree.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_etree.c
deleted file mode 100644
index 0dcb85f..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_etree.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_etree =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Compute the elimination tree of A or A'*A
- *
- * In the symmetric case, the upper triangular part of A is used.  Entries not
- * in this part of the matrix are ignored.  Computing the etree of a symmetric
- * matrix from just its lower triangular entries is not supported.
- *
- * In the unsymmetric case, all of A is used, and the etree of A'*A is computed.
- *
- * References:
- *
- * J. Liu, "A compact row storage scheme for Cholesky factors", ACM Trans.
- * Math. Software, vol 12, 1986, pp. 127-148.
- *
- * J. Liu, "The role of elimination trees in sparse factorization", SIAM J.
- * Matrix Analysis & Applic., vol 11, 1990, pp. 134-172.
- *
- * J. Gilbert, X. Li, E. Ng, B. Peyton, "Computing row and column counts for
- * sparse QR and LU factorization", BIT, vol 41, 2001, pp. 693-710.
- *
- * workspace: symmetric: Iwork (nrow), unsymmetric: Iwork (nrow+ncol)
- *
- * Supports any xtype (pattern, real, complex, or zomplex)
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-/* ========================================================================== */
-/* === update_etree ========================================================= */
-/* ========================================================================== */
-
-static void update_etree
-(
-    /* inputs, not modified */
-    Int k,		/* process the edge (k,i) in the input graph */
-    Int i,
-    /* inputs, modified on output */
-    Int Parent [ ],	/* Parent [t] = p if p is the parent of t */
-    Int Ancestor [ ]	/* Ancestor [t] is the ancestor of node t in the
-			   partially-constructed etree */
-)
-{
-    Int a ;
-    for ( ; ; )		/* traverse the path from k to the root of the tree */
-    {
-	a = Ancestor [k] ;
-	if (a == i)
-	{
-	    /* final ancestor reached; no change to tree */
-	    return ;
-	}
-	/* perform path compression */
-	Ancestor [k] = i ;
-	if (a == EMPTY)
-	{
-	    /* final ancestor undefined; this is a new edge in the tree */
-	    Parent [k] = i ;
-	    return ;
-	}
-	/* traverse up to the ancestor of k */
-	k = a ;
-    }
-}
-
-/* ========================================================================== */
-/* === cholmod_etree ======================================================== */
-/* ========================================================================== */
-
-/* Find the elimination tree of A or A'*A */
-
-int CHOLMOD(etree)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,
-    /* ---- output --- */
-    Int *Parent,	/* size ncol.  Parent [j] = p if p is the parent of j */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Ap, *Ai, *Anz, *Ancestor, *Prev, *Iwork ;
-    Int i, j, jprev, p, pend, nrow, ncol, packed, stype ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (Parent, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    stype = A->stype ;
-
-    /* s = A->nrow + (stype ? 0 : A->ncol) */
-    s = CHOLMOD(add_size_t) (A->nrow, (stype ? 0 : A->ncol), &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (0, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;	/* out of memory */
-    }
-
-    ASSERT (CHOLMOD(dump_sparse) (A, "etree", Common) >= 0) ;
-    Iwork = Common->Iwork ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    ncol = A->ncol ;	/* the number of columns of A */
-    nrow = A->nrow ;	/* the number of rows of A */
-    Ap = A->p ;		/* size ncol+1, column pointers for A */
-    Ai = A->i ;		/* the row indices of A */
-    Anz = A->nz ;	/* number of nonzeros in each column of A */
-    packed = A->packed ;
-    Ancestor = Iwork ;	/* size ncol (i/i/l) */
-
-    for (j = 0 ; j < ncol ; j++)
-    {
-	Parent [j] = EMPTY ;
-	Ancestor [j] = EMPTY ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the etree */
-    /* ---------------------------------------------------------------------- */
-
-    if (stype > 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* symmetric (upper) case: compute etree (A) */
-	/* ------------------------------------------------------------------ */
-
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    /* for each row i in column j of triu(A), excluding the diagonal */
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		if (i < j)
-		{
-		    update_etree (i, j, Parent, Ancestor) ;
-		}
-	    }
-	}
-
-    }
-    else if (stype == 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* unsymmetric case: compute etree (A'*A) */
-	/* ------------------------------------------------------------------ */
-
-	Prev = Iwork + ncol ;	/* size nrow (i/i/l) */
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    Prev [i] = EMPTY ;
-	}
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    /* for each row i in column j of A */
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		/* a graph is constructed dynamically with one path per row
-		 * of A.  If the ith row of A contains column indices
-		 * (j1,j2,j3,j4) then the new graph has edges (j1,j2), (j2,j3),
-		 * and (j3,j4).  When at node i of this path-graph, all edges
-		 * (jprev,j) are considered, where jprev<j */
-		i = Ai [p] ;
-		jprev = Prev [i] ;
-		if (jprev != EMPTY)
-		{
-		    update_etree (jprev, j, Parent, Ancestor) ;
-		}
-		Prev [i] = j ;
-	    }
-	}
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* symmetric case with lower triangular part not supported */
-	/* ------------------------------------------------------------------ */
-
-	ERROR (CHOLMOD_INVALID, "symmetric lower not supported") ;
-	return (FALSE) ;
-    }
-
-    ASSERT (CHOLMOD(dump_parent) (Parent, ncol, "Parent", Common)) ;
-    return (TRUE) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_factorize.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_factorize.c
deleted file mode 100644
index 884fdc7..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_factorize.c
+++ /dev/null
@@ -1,428 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_factorize =========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Computes the numerical factorization of a symmetric matrix.  The primary
- * inputs to this routine are a sparse matrix A and the symbolic factor L from
- * cholmod_analyze or a prior numerical factor L.  If A is symmetric, this
- * routine factorizes A(p,p)+beta*I (beta can be zero), where p is the
- * fill-reducing permutation (L->Perm).  If A is unsymmetric, either
- * A(p,:)*A(p,:)'+beta*I or A(p,f)*A(p,f)'+beta*I is factorized.  The set f and
- * the nonzero pattern of the matrix A must be the same as the matrix passed to
- * cholmod_analyze for the supernodal case.  For the simplicial case, it can
- * be different, but it should be the same for best performance.  beta is real.
- *
- * A simplicial factorization or supernodal factorization is chosen, based on
- * the type of the factor L.  If L->is_super is TRUE, a supernodal LL'
- * factorization is computed.  Otherwise, a simplicial numeric factorization
- * is computed, either LL' or LDL', depending on Common->final_ll.
- *
- * Once the factorization is complete, it can be left as is or optionally
- * converted into any simplicial numeric type, depending on the
- * Common->final_* parameters.  If converted from a supernodal to simplicial
- * type, and the Common->final_resymbol parameter is true, then numerically
- * zero entries in L due to relaxed supernodal amalgamation are removed from
- * the simplicial factor (they are always left in the supernodal form of L).
- * Entries that are numerically zero but present in the simplicial symbolic
- * pattern of L are left in place (that is, the graph of L remains chordal).
- * This is required for the update/downdate/rowadd/rowdel routines to work
- * properly.
- *
- * workspace: Flag (nrow), Head (nrow+1),
- *	if symmetric:   Iwork (2*nrow+2*nsuper)
- *	if unsymmetric: Iwork (2*nrow+MAX(2*nsuper,ncol))
- *	    where nsuper is 0 if simplicial, or the # of relaxed supernodes in
- *	    L otherwise (nsuper <= nrow).
- *	if simplicial: W (nrow).
- *	Allocates up to two temporary copies of its input matrix (including
- *	both pattern and numerical values).
- *
- * If the matrix is not positive definite the routine returns TRUE, but
- * sets Common->status to CHOLMOD_NOT_POSDEF and L->minor is set to the
- * column at which the failure occurred.  Columns L->minor to L->n-1 are
- * set to zero.
- *
- * Supports any xtype (pattern, real, complex, or zomplex), except that the
- * input matrix A cannot be pattern-only.  If L is simplicial, its numeric
- * xtype matches A on output.  If L is supernodal, its xtype is real if A is
- * real, or complex if A is complex or zomplex.
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-#ifndef NSUPERNODAL
-#include "cholmod_supernodal.h"
-#endif
-
-
-/* ========================================================================== */
-/* === cholmod_factorize ==================================================== */
-/* ========================================================================== */
-
-/* Factorizes PAP' (or PAA'P' if A->stype is 0), using a factor obtained
- * from cholmod_analyze.  The analysis can be re-used simply by calling this
- * routine a second time with another matrix.  A must have the same nonzero
- * pattern as that passed to cholmod_analyze. */
-
-int CHOLMOD(factorize)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* resulting factorization */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double zero [2] ;
-    zero [0] = 0 ;
-    zero [1] = 0 ;
-    return (CHOLMOD(factorize_p) (A, zero, NULL, 0, L, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_factorize_p ================================================== */
-/* ========================================================================== */
-
-/* Same as cholmod_factorize, but with more options. */
-
-int CHOLMOD(factorize_p)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    double beta [2],	/* factorize beta*I+A or beta*I+A'*A */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* resulting factorization */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *S, *F, *A1, *A2 ;
-    Int nrow, ncol, stype, convert, n, nsuper, grow2, status ;
-    size_t s, t, uncol ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-    n = L->n ;
-    stype = A->stype ;
-    if (L->n != A->nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "A and L dimensions do not match") ;
-	return (FALSE) ;
-    }
-    if (stype != 0 && nrow != ncol)
-    {
-	ERROR (CHOLMOD_INVALID, "matrix invalid") ;
-	return (FALSE) ;
-    }
-    DEBUG (CHOLMOD(dump_sparse) (A, "A for cholmod_factorize", Common)) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    nsuper = (L->is_super ? L->nsuper : 0) ;
-    uncol = ((stype != 0) ? 0 : ncol) ;
-
-    /* s = 2*nrow + MAX (uncol, 2*nsuper) */
-    s = CHOLMOD(mult_size_t) (nsuper, 2, &ok) ;
-    s = MAX (uncol, s) ;
-    t = CHOLMOD(mult_size_t) (nrow, 2, &ok) ;
-    s = CHOLMOD(add_size_t) (s, t, &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (nrow, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-
-    S  = NULL ;
-    F  = NULL ;
-    A1 = NULL ;
-    A2 = NULL ;
-
-    /* convert to another form when done, if requested */
-    convert = !(Common->final_asis) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* perform supernodal LL' or simplicial LDL' factorization */
-    /* ---------------------------------------------------------------------- */
-
-    if (L->is_super)
-    {
-
-#ifndef NSUPERNODAL
-
-	/* ------------------------------------------------------------------ */
-	/* supernodal factorization */
-	/* ------------------------------------------------------------------ */
-
-	if (L->ordering == CHOLMOD_NATURAL)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* natural ordering */
-	    /* -------------------------------------------------------------- */
-
-	    if (stype > 0)
-	    {
-		/* S = tril (A'), F not needed */
-		/* workspace: Iwork (nrow) */
-		A1 = CHOLMOD(ptranspose) (A, 2, NULL, NULL, 0, Common) ;
-		S = A1 ;
-	    }
-	    else if (stype < 0)
-	    {
-		/* This is the fastest option for the natural ordering */
-		/* S = A; F not needed */
-		S = A ;
-	    }
-	    else
-	    {
-		/* F = A(:,f)' */
-		/* workspace: Iwork (nrow) */
-		/* workspace: Iwork (nrow if no fset; MAX (nrow,ncol) if fset)*/
-		A1 = CHOLMOD(ptranspose) (A, 2, NULL, fset, fsize, Common) ;
-		F = A1 ;
-		/* S = A */
-		S = A ;
-	    }
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* permute the input matrix before factorization */
-	    /* -------------------------------------------------------------- */
-
-	    if (stype > 0)
-	    {
-		/* This is the fastest option for factoring a permuted matrix */
-		/* S = tril (PAP'); F not needed */
-		/* workspace: Iwork (2*nrow) */
-		A1 = CHOLMOD(ptranspose) (A, 2, L->Perm, NULL, 0, Common) ;
-		S = A1 ;
-	    }
-	    else if (stype < 0)
-	    {
-		/* A2 = triu (PAP') */
-		/* workspace: Iwork (2*nrow) */
-		A2 = CHOLMOD(ptranspose) (A, 2, L->Perm, NULL, 0, Common) ;
-		/* S = tril (A2'); F not needed */
-		/* workspace: Iwork (nrow) */
-		A1 = CHOLMOD(ptranspose) (A2, 2, NULL, NULL, 0, Common) ;
-		S = A1 ;
-		CHOLMOD(free_sparse) (&A2, Common) ;
-		ASSERT (A2 == NULL) ;
-	    }
-	    else
-	    {
-		/* F = A(p,f)' */
-		/* workspace: Iwork (nrow if no fset; MAX (nrow,ncol) if fset)*/
-		A1 = CHOLMOD(ptranspose) (A, 2, L->Perm, fset, fsize, Common) ;
-		F = A1 ;
-		/* S = F' */
-		/* workspace: Iwork (nrow) */
-		A2 = CHOLMOD(ptranspose) (F, 2, NULL, NULL, 0, Common) ;
-		S = A2 ;
-	    }
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* supernodal factorization */
-	/* ------------------------------------------------------------------ */
-
-	/* workspace: Flag (nrow), Head (nrow+1), Iwork (2*nrow+2*nsuper) */
-	if (Common->status == CHOLMOD_OK)
-	{
-	    CHOLMOD(super_numeric) (S, F, beta, L, Common) ;
-	}
-	status = Common->status ;
-	ASSERT (IMPLIES (status >= CHOLMOD_OK, L->xtype != CHOLMOD_PATTERN)) ;
-
-	/* ------------------------------------------------------------------ */
-	/* convert to final form, if requested */
-	/* ------------------------------------------------------------------ */
-
-	if (Common->status >= CHOLMOD_OK && convert)
-	{
-	    /* workspace: none */
-	    ok = CHOLMOD(change_factor) (L->xtype, Common->final_ll,
-		    Common->final_super, Common->final_pack,
-		    Common->final_monotonic, L, Common) ;
-	    if (ok && Common->final_resymbol && !(L->is_super))
-	    {
-		/* workspace: Flag (nrow), Head (nrow+1),
-		 *	if symmetric:   Iwork (2*nrow)
-		 *	if unsymmetric: Iwork (2*nrow+ncol) */
-		CHOLMOD(resymbol_noperm) (S, fset, fsize, Common->final_pack,
-		    L, Common) ;
-	    }
-	}
-
-#else
-
-	/* ------------------------------------------------------------------ */
-	/* CHOLMOD Supernodal module not installed */
-	/* ------------------------------------------------------------------ */
-
-	status = CHOLMOD_NOT_INSTALLED ;
-	ERROR (CHOLMOD_NOT_INSTALLED,"Supernodal module not installed") ;
-
-#endif
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* simplicial LDL' factorization */
-	/* ------------------------------------------------------------------ */
-
-	/* Permute the input matrix A if necessary.  cholmod_rowfac requires
-	 * triu(A) in column form for the symmetric case, and A in column form
-	 * for the unsymmetric case (the matrix S).  The unsymmetric case
-	 * requires A in row form, or equivalently A' in column form (the
-	 * matrix F).
-	 */
-
-	if (L->ordering == CHOLMOD_NATURAL)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* natural ordering */
-	    /* -------------------------------------------------------------- */
-
-	    if (stype > 0)
-	    {
-		/* F is not needed, S = A */
-		S = A ;
-	    }
-	    else if (stype < 0)
-	    {
-		/* F is not needed, S = A' */
-		/* workspace: Iwork (nrow) */
-		A2 = CHOLMOD(ptranspose) (A, 2, NULL, NULL, 0, Common) ;
-		S = A2 ;
-	    }
-	    else
-	    {
-		/* F = A (:,f)' */
-		/* workspace: Iwork (nrow if no fset; MAX (nrow,ncol) if fset)*/
-		A1 = CHOLMOD(ptranspose) (A, 2, NULL, fset, fsize, Common) ;
-		F = A1 ;
-		S = A ;
-	    }
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* permute the input matrix before factorization */
-	    /* -------------------------------------------------------------- */
-
-	    if (stype > 0)
-	    {
-		/* F = tril (A (p,p)') */
-		/* workspace: Iwork (2*nrow) */
-		A1 = CHOLMOD(ptranspose) (A, 2, L->Perm, NULL, 0, Common) ;
-		/* A2 = triu (F') */
-		/* workspace: Iwork (nrow) */
-		A2 = CHOLMOD(ptranspose) (A1, 2, NULL, NULL, 0, Common) ;
-		/* the symmetric case does not need F, free it and set to NULL*/
-		CHOLMOD(free_sparse) (&A1, Common) ;
-	    }
-	    else if (stype < 0)
-	    {
-		/* A2 = triu (A (p,p)'), F not needed.  This is the fastest
-		 * way to factorize a matrix using the simplicial routine
-		 * (cholmod_rowfac). */
-		/* workspace: Iwork (2*nrow) */
-		A2 = CHOLMOD(ptranspose) (A, 2, L->Perm, NULL, 0, Common) ;
-	    }
-	    else
-	    {
-		/* F = A (p,f)' */
-		/* workspace: Iwork (nrow if no fset; MAX (nrow,ncol) if fset)*/
-		A1 = CHOLMOD(ptranspose) (A, 2, L->Perm, fset, fsize, Common) ;
-		F = A1 ;
-		/* A2 = F' */
-		/* workspace: Iwork (nrow) */
-		A2 = CHOLMOD(ptranspose) (F, 2, NULL, NULL, 0, Common) ;
-	    }
-	    S = A2 ;
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* simplicial LDL' or LL' factorization */
-	/* ------------------------------------------------------------------ */
-
-	/* factorize beta*I+S (symmetric) or beta*I+F*F' (unsymmetric) */
-	/* workspace: Flag (nrow), W (nrow), Iwork (2*nrow) */
-	if (Common->status == CHOLMOD_OK)
-	{
-	    grow2 = Common->grow2 ;
-	    L->is_ll = BOOLEAN (Common->final_ll) ;
-	    if (L->xtype == CHOLMOD_PATTERN && Common->final_pack)
-	    {
-		/* allocate a factor with exactly the space required */
-		Common->grow2 = 0 ;
-	    }
-	    CHOLMOD(rowfac) (S, F, beta, 0, nrow, L, Common) ;
-	    Common->grow2 = grow2 ;
-	}
-	status = Common->status ;
-
-	/* ------------------------------------------------------------------ */
-	/* convert to final form, if requested */
-	/* ------------------------------------------------------------------ */
-
-	if (Common->status >= CHOLMOD_OK && convert)
-	{
-	    /* workspace: none */
-	    CHOLMOD(change_factor) (L->xtype, L->is_ll, FALSE,
-		    Common->final_pack, Common->final_monotonic, L, Common) ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* free A1 and A2 if they exist */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(free_sparse) (&A1, Common) ;
-    CHOLMOD(free_sparse) (&A2, Common) ;
-    Common->status = MAX (Common->status, status) ;
-    return (Common->status >= CHOLMOD_OK) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_postorder.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_postorder.c
deleted file mode 100644
index f66b1df..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_postorder.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_postorder =========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Compute the postorder of a tree. */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-
-/* ========================================================================== */
-/* === dfs ================================================================== */
-/* ========================================================================== */
-
-/* The code below includes both a recursive and non-recursive depth-first-search
- * of a tree.  The recursive code is simpler, but can lead to stack overflow.
- * It is left here for reference, to understand what the non-recursive code
- * is computing.  To try the recursive version, uncomment the following
- * #define, or compile the code with -DRECURSIVE.  Be aware that stack
- * overflow may occur.
-#define RECURSIVE
- */
-
-#ifdef RECURSIVE
-
-/* recursive version: a working code for reference only, not actual use */
-
-static Int dfs			/* return the new value of k */
-(
-    Int p,		/* start a DFS at node p */
-    Int k,		/* start the node numbering at k */
-    Int Post [ ],	/* Post ordering, modified on output */
-    Int Head [ ],	/* Head [p] = youngest child of p; EMPTY on output */
-    Int Next [ ],	/* Next [j] = sibling of j; unmodified */
-    Int Pstack [ ]	/* unused */
-)
-{
-    Int j ;
-    /* start a DFS at each child of node p */
-    for (j = Head [p] ; j != EMPTY ; j = Next [j])
-    {
-	/* start a DFS at child node j */
-	k = dfs (j, k, Post, Head, Next, Pstack) ;
-    }
-    Post [k++] = p ;	/* order node p as the kth node */
-    Head [p] = EMPTY ;	/* link list p no longer needed */
-    return (k) ;	/* the next node will be numbered k */
-}
-
-#else
-
-/* non-recursive version for actual use */
-
-static Int dfs		/* return the new value of k */
-(
-    Int p,		/* start the DFS at a root node p */
-    Int k,		/* start the node numbering at k */
-    Int Post [ ],	/* Post ordering, modified on output */
-    Int Head [ ],	/* Head [p] = youngest child of p; EMPTY on output */
-    Int Next [ ],	/* Next [j] = sibling of j; unmodified */
-    Int Pstack [ ]	/* workspace of size n, undefined on input or output */
-)
-{
-    Int j, phead ;
-
-    /* put the root node on the stack */
-    Pstack [0] = p ;
-    phead = 0 ;
-
-    /* while the stack is not empty, do: */
-    while (phead >= 0)
-    {
-	/* grab the node p from top of the stack and get its youngest child j */
-	p = Pstack [phead] ;
-	j = Head [p] ;
-	if (j == EMPTY)
-	{
-	    /* all children of p ordered.  remove p from stack and order it */
-	    phead-- ;
-	    Post [k++] = p ;	/* order node p as the kth node */
-	}
-	else
-	{
-	    /* leave p on the stack.  Start a DFS at child node j by putting
-	     * j on the stack and removing j from the list of children of p. */
-	    Head [p] = Next [j] ;
-	    Pstack [++phead] = j ;
-	}
-    }
-    return (k) ;	/* the next node will be numbered k */
-}
-
-#endif
-
-/* ========================================================================== */
-/* === cholmod_postorder ==================================================== */
-/* ========================================================================== */
-
-/* Postorder a tree.  The tree is either an elimination tree (the output from
- * from cholmod_etree) or a component tree (from cholmod_nested_dissection).
- *
- * An elimination tree is a complete tree of n nodes with Parent [j] > j or
- * Parent [j] = EMPTY if j is a root.  On output Post [0..n-1] is a complete
- * permutation vector.
- *
- * A component tree is a subset of 0..n-1.  Parent [j] = -2 if node j is not
- * in the component tree.  Parent [j] = EMPTY if j is a root of the component
- * tree, and Parent [j] is in the range 0 to n-1 if j is in the component
- * tree but not a root.  On output, Post [k] is defined only for nodes in
- * the component tree.  Post [k] = j if node j is the kth node in the
- * postordered component tree, where k is in the range 0 to the number of
- * components minus 1.
- *
- * Node j is ignored and not included in the postorder if Parent [j] < EMPTY.
- *
- * As a result, check_parent (Parent, n,...) may fail on input, since
- * cholmod_check_parent assumes Parent is an elimination tree.  Similarly,
- * cholmod_check_perm (Post, ...) may fail on output, since Post is a partial
- * permutation if Parent is a component tree.
- *
- * An optional node weight can be given.  When starting a postorder at node j,
- * the children of j are ordered in increasing order of their weight.
- * If no weights are given (Weight is NULL) then children are ordered in
- * increasing order of their node number.  The weight of a node must be in the
- * range 0 to n-1.  Weights outside that range are silently converted to that
- * range (weights < 0 are treated as zero, and weights >= n are treated as n-1).
- *
- *
- * workspace: Head (n), Iwork (2*n)
- */
-
-SuiteSparse_long CHOLMOD(postorder)	/* return # of nodes postordered */
-(
-    /* ---- input ---- */
-    Int *Parent,	/* size n. Parent [j] = p if p is the parent of j */
-    size_t n,
-    Int *Weight,	/* size n, optional. Weight [j] is weight of node j */
-    /* ---- output --- */
-    Int *Post,		/* size n. Post [k] = j is kth in postordered tree */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Head, *Next, *Pstack, *Iwork ;
-    Int j, p, k, w, nextj ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (EMPTY) ;
-    RETURN_IF_NULL (Parent, EMPTY) ;
-    RETURN_IF_NULL (Post, EMPTY) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* s = 2*n */
-    s = CHOLMOD(mult_size_t) (n, 2, &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (EMPTY) ;
-    }
-
-    CHOLMOD(allocate_work) (n, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (EMPTY) ;
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Head  = Common->Head ;	/* size n+1, initially all EMPTY */
-    Iwork = Common->Iwork ;
-    Next  = Iwork ;		/* size n (i/i/l) */
-    Pstack = Iwork + n ;	/* size n (i/i/l) */
-
-    /* ---------------------------------------------------------------------- */
-    /* construct a link list of children for each node */
-    /* ---------------------------------------------------------------------- */
-
-    if (Weight == NULL)
-    {
-
-	/* in reverse order so children are in ascending order in each list */
-	for (j = n-1 ; j >= 0 ; j--)
-	{
-	    p = Parent [j] ;
-	    if (p >= 0 && p < ((Int) n))
-	    {
-		/* add j to the list of children for node p */
-		Next [j] = Head [p] ;
-		Head [p] = j ;
-	    }
-	}
-
-	/* Head [p] = j if j is the youngest (least-numbered) child of p */
-	/* Next [j1] = j2 if j2 is the next-oldest sibling of j1 */
-
-    }
-    else
-    {
-
-	/* First, construct a set of link lists according to Weight.
-	 *
-	 * Whead [w] = j if node j is the first node in bucket w.
-	 * Next [j1] = j2 if node j2 follows j1 in a link list.
-	 */
-
-	Int *Whead = Pstack ;	    /* use Pstack as workspace for Whead [ */
-
-	for (w = 0 ; w < ((Int) n) ; w++)
-	{
-	    Whead [w] = EMPTY ;
-	}
-	/* do in forward order, so nodes that ties are ordered by node index */
-	for (j = 0 ; j < ((Int) n) ; j++)
-	{
-	    p = Parent [j] ;
-	    if (p >= 0 && p < ((Int) n))
-	    {
-		w = Weight [j] ;
-		w = MAX (0, w) ;
-		w = MIN (w, ((Int) n) - 1) ;
-		/* place node j at the head of link list for weight w */
-		Next [j] = Whead [w] ;
-		Whead [w] = j ;
-	    }
-	}
-
-	/* traverse weight buckets, placing each node in its parent's list */
-	for (w = n-1 ; w >= 0 ; w--)
-	{
-	    for (j = Whead [w] ; j != EMPTY ; j = nextj)
-	    {
-		nextj = Next [j] ;
-		/* put node j in the link list of its parent */
-		p = Parent [j] ;
-		ASSERT (p >= 0 && p < ((Int) n)) ;
-		Next [j] = Head [p] ;
-		Head [p] = j ;
-	    }
-	}
-
-	/* Whead no longer needed ] */
-	/* Head [p] = j if j is the lightest child of p */
-	/* Next [j1] = j2 if j2 is the next-heaviest sibling of j1 */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* start a DFS at each root node of the etree */
-    /* ---------------------------------------------------------------------- */
-
-    k = 0 ;
-    for (j = 0 ; j < ((Int) n) ; j++)
-    {
-	if (Parent [j] == EMPTY)
-	{
-	    /* j is the root of a tree; start a DFS here */
-	    k = dfs (j, k, Post, Head, Next, Pstack) ;
-	}
-    }
-
-    /* this would normally be EMPTY already, unless Parent is invalid */
-    for (j = 0 ; j < ((Int) n) ; j++)
-    {
-	Head [j] = EMPTY ;
-    }
-
-    PRINT1 (("postordered "ID" nodes\n", k)) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-    return (k) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rcond.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rcond.c
deleted file mode 100644
index f261e31..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rcond.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_rcond =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Return a rough estimate of the reciprocal of the condition number:
- * the minimum entry on the diagonal of L (or absolute entry of D for an LDL'
- * factorization) divided by the maximum entry (squared for LL').  L can be
- * real, complex, or zomplex.  Returns -1 on error, 0 if the matrix is singular
- * or has a zero entry on the diagonal of L, 1 if the matrix is 0-by-0, or
- * min(diag(L))/max(diag(L)) otherwise.  Never returns NaN; if L has a NaN on
- * the diagonal it returns zero instead.
- *
- * For an LL' factorization,  (min(diag(L))/max(diag(L)))^2 is returned.
- * For an LDL' factorization, (min(diag(D))/max(diag(D))) is returned.
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-/* ========================================================================== */
-/* === LMINMAX ============================================================== */
-/* ========================================================================== */
-
-/* Update lmin and lmax for one entry L(j,j) */
-
-#define FIRST_LMINMAX(Ljj,lmin,lmax) \
-{ \
-    double ljj = Ljj ; \
-    if (IS_NAN (ljj)) \
-    { \
-	return (0) ; \
-    } \
-    lmin = ljj ; \
-    lmax = ljj ; \
-}
-
-#define LMINMAX(Ljj,lmin,lmax) \
-{ \
-    double ljj = Ljj ; \
-    if (IS_NAN (ljj)) \
-    { \
-	return (0) ; \
-    } \
-    if (ljj < lmin) \
-    { \
-	lmin = ljj ; \
-    } \
-    else if (ljj > lmax) \
-    { \
-	lmax = ljj ; \
-    } \
-}
-
-/* ========================================================================== */
-/* === cholmod_rcond ======================================================== */
-/* ========================================================================== */
-
-double CHOLMOD(rcond)	    /* return min(diag(L)) / max(diag(L)) */
-(
-    /* ---- input ---- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double lmin, lmax, rcond ;
-    double *Lx ;
-    Int *Lpi, *Lpx, *Super, *Lp ;
-    Int n, e, nsuper, s, k1, k2, psi, psend, psx, nsrow, nscol, jj, j ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (EMPTY) ;
-    RETURN_IF_NULL (L, EMPTY) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, EMPTY) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    n = L->n ;
-    if (n == 0)
-    {
-	return (1) ;
-    }
-    if (L->minor < L->n)
-    {
-	return (0) ;
-    }
-
-    e = (L->xtype == CHOLMOD_COMPLEX) ? 2 : 1 ;
-
-    if (L->is_super)
-    {
-	/* L is supernodal */
-	nsuper = L->nsuper ;	/* number of supernodes in L */
-	Lpi = L->pi ;		/* column pointers for integer pattern */
-	Lpx = L->px ;		/* column pointers for numeric values */
-	Super = L->super ;	/* supernode sizes */
-	Lx = L->x ;		/* numeric values */
-	FIRST_LMINMAX (Lx [0], lmin, lmax) ;	/* first diagonal entry of L */
-	for (s = 0 ; s < nsuper ; s++)
-	{
-	    k1 = Super [s] ;		/* first column in supernode s */
-	    k2 = Super [s+1] ;		/* last column in supernode is k2-1 */
-	    psi = Lpi [s] ;		/* first row index is L->s [psi] */
-	    psend = Lpi [s+1] ;		/* last row index is L->s [psend-1] */
-	    psx = Lpx [s] ;		/* first numeric entry is Lx [psx] */
-	    nsrow = psend - psi ;	/* supernode is nsrow-by-nscol */
-	    nscol = k2 - k1 ;
-	    for (jj = 0 ; jj < nscol ; jj++)
-	    {
-		LMINMAX (Lx [e * (psx + jj + jj*nsrow)], lmin, lmax) ;
-	    }
-	}
-    }
-    else
-    {
-	/* L is simplicial */
-	Lp = L->p ;
-	Lx = L->x ;
-	if (L->is_ll)
-	{
-	    /* LL' factorization */
-	    FIRST_LMINMAX (Lx [Lp [0]], lmin, lmax) ;
-	    for (j = 1 ; j < n ; j++)
-	    {
-		LMINMAX (Lx [e * Lp [j]], lmin, lmax) ;
-	    }
-	}
-	else
-	{
-	    /* LDL' factorization, the diagonal might be negative */
-	    FIRST_LMINMAX (fabs (Lx [Lp [0]]), lmin, lmax) ;
-	    for (j = 1 ; j < n ; j++)
-	    {
-		LMINMAX (fabs (Lx [e * Lp [j]]), lmin, lmax) ;
-	    }
-	}
-    }
-    rcond = lmin / lmax ;
-    if (L->is_ll)
-    {
-	rcond = rcond*rcond ;
-    }
-    return (rcond) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_resymbol.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_resymbol.c
deleted file mode 100644
index 5b39cd9..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_resymbol.c
+++ /dev/null
@@ -1,608 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_resymbol ============================================ */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Recompute the symbolic pattern of L.  Entries not in the symbolic pattern
- * are dropped.  L->Perm can be used (or not) to permute the input matrix A.
- *
- * These routines are used after a supernodal factorization is converted into
- * a simplicial one, to remove zero entries that were added due to relaxed
- * supernode amalgamation.  They can also be used after a series of downdates
- * to remove entries that would no longer be present if the matrix were
- * factorized from scratch.  A downdate (cholmod_updown) does not remove any
- * entries from L.
- *
- * workspace: Flag (nrow), Head (nrow+1),
- *	if symmetric:   Iwork (2*nrow)
- *	if unsymmetric: Iwork (2*nrow+ncol).
- *	Allocates up to 2 copies of its input matrix A (pattern only).
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-/* ========================================================================== */
-/* === cholmod_resymbol ===================================================== */
-/* ========================================================================== */
-
-/* Remove entries from L that are not in the factorization of P*A*P', P*A*A'*P',
- * or P*F*F'*P' (depending on A->stype and whether fset is NULL or not).
- *
- * cholmod_resymbol is the same as cholmod_resymbol_noperm, except that it
- * first permutes A according to L->Perm.  A can be upper/lower/unsymmetric,
- * in contrast to cholmod_resymbol_noperm (which can be lower or unsym). */
-
-int CHOLMOD(resymbol)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int pack,		/* if TRUE, pack the columns of L */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factorization, entries pruned on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *H, *F, *G ;
-    Int stype, nrow, ncol ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    if (L->is_super)
-    {
-	/* cannot operate on a supernodal factorization */
-	ERROR (CHOLMOD_INVALID, "cannot operate on supernodal L") ;
-	return (FALSE) ;
-    }
-    if (L->n != A->nrow)
-    {
-	/* dimensions must agree */
-	ERROR (CHOLMOD_INVALID, "A and L dimensions do not match") ;
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    stype = A->stype ;
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-
-    /* s = 2*nrow + (stype ? 0 : ncol) */
-    s = CHOLMOD(mult_size_t) (nrow, 2, &ok) ;
-    s = CHOLMOD(add_size_t) (s, (stype ? 0 : ncol), &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (nrow, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* permute the input matrix if necessary */
-    /* ---------------------------------------------------------------------- */
-
-    H = NULL ;
-    G = NULL ;
-
-    if (stype > 0)
-    {
-	if (L->ordering == CHOLMOD_NATURAL)
-	{
-	    /* F = triu(A)' */
-	    /* workspace: Iwork (nrow) */
-	    G = CHOLMOD(ptranspose) (A, 0, NULL, NULL, 0, Common) ;
-	}
-	else
-	{
-	    /* F = triu(A(p,p))' */
-	    /* workspace: Iwork (2*nrow) */
-	    G = CHOLMOD(ptranspose) (A, 0, L->Perm, NULL, 0, Common) ;
-	}
-	F = G ;
-    }
-    else if (stype < 0)
-    {
-	if (L->ordering == CHOLMOD_NATURAL)
-	{
-	    F = A ;
-	}
-	else
-	{
-	    /* G = triu(A(p,p))' */
-	    /* workspace: Iwork (2*nrow) */
-	    G = CHOLMOD(ptranspose) (A, 0, L->Perm, NULL, 0, Common) ;
-	    /* H = G' */
-	    /* workspace: Iwork (nrow) */
-	    H = CHOLMOD(ptranspose) (G, 0, NULL, NULL, 0, Common) ;
-	    F = H ;
-	}
-    }
-    else
-    {
-	if (L->ordering == CHOLMOD_NATURAL)
-	{
-	    F = A ;
-	}
-	else
-	{
-	    /* G = A(p,f)' */
-	    /* workspace: Iwork (nrow if no fset; MAX (nrow,ncol) if fset)*/
-	    G = CHOLMOD(ptranspose) (A, 0, L->Perm, fset, fsize, Common) ;
-	    /* H = G' */
-	    /* workspace: Iwork (ncol) */
-	    H = CHOLMOD(ptranspose) (G, 0, NULL, NULL, 0, Common) ;
-	    F = H ;
-	}
-    }
-
-    /* No need to check for failure here.  cholmod_resymbol_noperm will return
-     * FALSE if F is NULL. */
-
-    /* ---------------------------------------------------------------------- */
-    /* resymbol */
-    /* ---------------------------------------------------------------------- */
-
-    ok = CHOLMOD(resymbol_noperm) (F, fset, fsize, pack, L, Common) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* free the temporary matrices, if they exist */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(free_sparse) (&H, Common) ;
-    CHOLMOD(free_sparse) (&G, Common) ;
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_resymbol_noperm ============================================== */
-/* ========================================================================== */
-
-/* Redo symbolic LDL' or LL' factorization of I + F*F' or I+A, where F=A(:,f).
- *
- * L already exists, but is a superset of the true dynamic pattern (simple
- * column downdates and row deletions haven't pruned anything).  Just redo the
- * symbolic factorization and drop entries that are no longer there.  The
- * diagonal is not modified.  The number of nonzeros in column j of L
- * (L->nz[j]) can decrease.  The column pointers (L->p[j]) remain unchanged if
- * pack is FALSE or if L is not monotonic.  Otherwise, the columns of L are
- * packed in place.
- *
- * For the symmetric case, the columns of the lower triangular part of A
- * are accessed by column.  NOTE that this the transpose of the general case.
- *
- * For the unsymmetric case, F=A(:,f) is accessed by column.
- *
- * A need not be sorted, and can be packed or unpacked.  If L->Perm is not
- * identity, then A must already be permuted according to the permutation used
- * to factorize L.  The advantage of using this routine is that it does not
- * need to create permuted copies of A first.
- *
- * This routine can be called if L is only partially factored via cholmod_rowfac
- * since all it does is prune.  If an entry is in F*F' or A, but not in L, it
- * isn't added to L.
- *
- * L must be simplicial LDL' or LL'; it cannot be supernodal or symbolic.
- *
- * The set f is held in fset and fsize.
- *	fset = NULL means ":" in MATLAB. fset is ignored.
- *	fset != NULL means f = fset [0..fset-1].
- *	fset != NULL and fsize = 0 means f is the empty set.
- *	There can be no duplicates in fset.
- *	Common->status is set to CHOLMOD_INVALID if fset is invalid.
- *
- * workspace: Flag (nrow), Head (nrow+1),
- *	if symmetric:   Iwork (2*nrow)
- *	if unsymmetric: Iwork (2*nrow+ncol).
- *	Unlike cholmod_resymbol, this routine does not allocate any temporary
- *	copies of its input matrix.
- */
-
-int CHOLMOD(resymbol_noperm)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int pack,		/* if TRUE, pack the columns of L */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factorization, entries pruned on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Lx, *Lz ;
-    Int i, j, k, row, parent, p, pend, pdest, ncol, apacked, sorted, nrow, nf,
-	use_fset, mark, jj, stype, xtype ;
-    Int *Ap, *Ai, *Anz, *Li, *Lp, *Lnz, *Flag, *Head, *Link, *Anext, *Iwork ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    ncol = A->ncol ;
-    nrow = A->nrow ;
-    stype = A->stype ;
-    ASSERT (IMPLIES (stype != 0, nrow == ncol)) ;
-    if (stype > 0)
-    {
-	/* symmetric, with upper triangular part, not supported */
-	ERROR (CHOLMOD_INVALID, "symmetric upper not supported ") ;
-	return (FALSE) ;
-    }
-    if (L->is_super)
-    {
-	/* cannot operate on a supernodal or symbolic factorization */
-	ERROR (CHOLMOD_INVALID, "cannot operate on supernodal L") ;
-	return (FALSE) ;
-    }
-    if (L->n != A->nrow)
-    {
-	/* dimensions must agree */
-	ERROR (CHOLMOD_INVALID, "A and L dimensions do not match") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* s = 2*nrow + (stype ? 0 : ncol) */
-    s = CHOLMOD(mult_size_t) (nrow, 2, &ok) ;
-    if (stype != 0)
-    {
-	s = CHOLMOD(add_size_t) (s, ncol, &ok) ;
-    }
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (nrow, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;	/* out of memory */
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ai = A->i ;
-    Ap = A->p ;
-    Anz = A->nz ;
-    apacked = A->packed ;
-    sorted = A->sorted ;
-
-    Li = L->i ;
-    Lx = L->x ;
-    Lz = L->z ;
-    Lp = L->p ;
-    Lnz = L->nz ;
-    xtype = L->xtype ;
-
-    /* If L is monotonic on input, then it can be packed or
-     * unpacked on output, depending on the pack input parameter. */
-
-    /* cannot pack a non-monotonic matrix */
-    if (!(L->is_monotonic))
-    {
-	pack = FALSE ;
-    }
-
-    ASSERT (L->nzmax >= (size_t) (Lp [L->n])) ;
-
-    pdest = 0 ;
-
-    PRINT1 (("\n\n===================== Resymbol pack %d Apacked %d\n",
-	pack, A->packed)) ;
-    ASSERT (CHOLMOD(dump_sparse) (A, "ReSymbol A:", Common) >= 0) ;
-    DEBUG (CHOLMOD(dump_factor) (L, "ReSymbol initial L (i, x):", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Flag  = Common->Flag ;	/* size nrow */
-    Head  = Common->Head ;	/* size nrow+1 */
-    Iwork = Common->Iwork ;
-    Link  = Iwork ;		/* size nrow (i/i/l) [ */
-    Lnz   = Iwork + nrow ;	/* size nrow (i/i/l), if L not packed */
-    Anext = Iwork + 2*((size_t) nrow) ;	/* size ncol (i/i/l), unsym. only */
-    for (j = 0 ; j < nrow ; j++)
-    {
-	Link [j] = EMPTY ;
-    }
-
-    /* use Lnz in L itself */
-    Lnz = L->nz ;
-    ASSERT (Lnz != NULL) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* for the unsymmetric case, queue each column of A (:,f) */
-    /* ---------------------------------------------------------------------- */
-
-    /* place each column of the basis set on the link list corresponding to */
-    /* the smallest row index in that column */
-
-    if (stype == 0)
-    {
-	use_fset = (fset != NULL) ;
-	if (use_fset)
-	{
-	    nf = fsize ;
-	    /* This is the only O(ncol) loop in cholmod_resymbol.
-	     * It is required only to check the fset. */
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		Anext [j] = -2 ;
-	    }
-	    for (jj = 0 ; jj < nf ; jj++)
-	    {
-		j = fset [jj] ;
-		if (j < 0 || j > ncol || Anext [j] != -2)
-		{
-		    /* out-of-range or duplicate entry in fset */
-		    ERROR (CHOLMOD_INVALID, "fset invalid") ;
-		    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-		    return (FALSE) ;
-		}
-		/* flag column j as having been seen */
-		Anext [j] = EMPTY ;
-	    }
-	    /* the fset is now valid */
-	    ASSERT (CHOLMOD(dump_perm) (fset, nf, ncol, "fset", Common)) ;
-	}
-	else
-	{
-	    nf = ncol ;
-	}
-	for (jj = 0 ; jj < nf ; jj++)
-	{
-	    j = (use_fset) ? (fset [jj]) : jj ;
-	    /* column j is the fset; find the smallest row (if any) */
-	    p = Ap [j] ;
-	    pend = (apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    if (pend > p)
-	    {
-		k = Ai [p] ;
-		if (!sorted)
-		{
-		    for ( ; p < pend ; p++)
-		    {
-			k = MIN (k, Ai [p]) ;
-		    }
-		}
-		/* place column j on link list k */
-		ASSERT (k >= 0 && k < nrow) ;
-		Anext [j] = Head [k] ;
-		Head [k] = j ;
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* recompute symbolic LDL' factorization */
-    /* ---------------------------------------------------------------------- */
-
-    for (k = 0 ; k < nrow ; k++)
-    {
-
-#ifndef NDEBUG
-	PRINT1 (("\n\n================== Initial column k = "ID"\n", k)) ;
-	for (p = Lp [k] ; p < Lp [k] + Lnz [k] ; p++)
-	{
-	    PRINT1 ((" row: "ID"  value: ", Li [p])) ;
-	    PRINT1 (("\n")) ;
-	}
-	PRINT1 (("Recomputing LDL, column k = "ID"\n", k)) ;
-#endif
-
-	/* ------------------------------------------------------------------ */
-	/* compute column k of I+F*F' or I+A */
-	/* ------------------------------------------------------------------ */
-
-	/* flag the diagonal entry */
-	/* mark = CHOLMOD(clear_flag) (Common) ; */
-	CHOLMOD_CLEAR_FLAG (Common) ;
-	mark = Common->mark ;
-
-	Flag [k] = mark ;
-	PRINT1 (("	row: "ID" (diagonal)\n", k)) ;
-
-	if (stype != 0)
-	{
-	    /* merge column k of A into Flag (lower triangular part only) */
-	    p = Ap [k] ;
-	    pend = (apacked) ? (Ap [k+1]) : (p + Anz [k]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		if (i > k)
-		{
-		    Flag [i] = mark ;
-		}
-	    }
-	}
-	else
-	{
-	    /* for each column j whos first row index is in row k */
-	    for (j = Head [k] ; j != EMPTY ; j = Anext [j])
-	    {
-		/* merge column j of A into Flag */
-		PRINT1 (("	---- A column "ID"\n", j)) ;
-		p = Ap [j] ;
-		pend = (apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-		PRINT1 (("  length "ID"  adding\n", pend-p)) ;
-		for ( ; p < pend ; p++)
-		{
-#ifndef NDEBUG
-		    ASSERT (Ai [p] >= k && Ai [p] < nrow) ;
-		    if (Flag [Ai [p]] < mark) PRINT1 ((" row "ID"\n", Ai [p])) ;
-#endif
-		    Flag [Ai [p]] = mark ;
-		}
-	    }
-	    /* clear the kth link list */
-	    Head [k] = EMPTY ;
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* compute pruned pattern of kth column of L = union of children */
-	/* ------------------------------------------------------------------ */
-
-	/* for each column j of L whose parent is k */
-	for (j = Link [k] ; j != EMPTY ; j = Link [j])
-	{
-	    /* merge column j of L into Flag */
-	    PRINT1 (("	---- L column "ID"\n", k)) ;
-	    ASSERT (j < k) ;
-	    ASSERT (Lnz [j] > 0) ;
-	    p = Lp [j] ;
-	    pend = p + Lnz [j] ;
-	    ASSERT (Li [p] == j && Li [p+1] == k) ;
-	    p++ ;	    /* skip past the diagonal entry */
-	    for ( ; p < pend ; p++)
-	    {
-		/* add to pattern */
-		ASSERT (Li [p] >= k && Li [p] < nrow) ;
-		Flag [Li [p]] = mark ;
-	    }
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* prune the kth column of L */
-	/* ------------------------------------------------------------------ */
-
-	PRINT1 (("Final column of L:\n")) ;
-	p = Lp [k] ;
-	pend = p + Lnz [k] ;
-
-	if (pack)
-	{
-	    /* shift column k upwards */
-	    Lp [k] = pdest ;
-	}
-	else
-	{
-	    /* leave column k in place, just reduce Lnz [k] */
-	    pdest = p ;
-	}
-
-	for ( ; p < pend ; p++)
-	{
-	    ASSERT (pdest < pend) ;
-	    ASSERT (pdest <= p) ;
-	    row = Li [p] ;
-	    ASSERT (row >= k && row < nrow) ;
-	    if (Flag [row] == mark)
-	    {
-		/* keep this entry */
-		Li [pdest] = row ;
-		if (xtype == CHOLMOD_REAL)
-		{
-		    Lx [pdest] = Lx [p] ;
-		}
-		else if (xtype == CHOLMOD_COMPLEX)
-		{
-		    Lx [2*pdest  ] = Lx [2*p  ] ;
-		    Lx [2*pdest+1] = Lx [2*p+1] ;
-		}
-		else if (xtype == CHOLMOD_ZOMPLEX)
-		{
-		    Lx [pdest] = Lx [p] ;
-		    Lz [pdest] = Lz [p] ;
-		}
-		pdest++ ;
-	    }
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* prepare this column for its parent */
-	/* ------------------------------------------------------------------ */
-
-	Lnz [k] = pdest - Lp [k] ;
-
-	PRINT1 ((" L("ID") length "ID"\n", k, Lnz [k])) ;
-	ASSERT (Lnz [k] > 0) ;
-
-	/* parent is the first entry in the column after the diagonal */
-	parent = (Lnz [k] > 1) ? (Li [Lp [k] + 1]) : EMPTY ;
-
-	PRINT1 (("parent ("ID") = "ID"\n", k, parent)) ;
-	ASSERT ((parent > k && parent < nrow) || (parent == EMPTY)) ;
-
-	if (parent != EMPTY)
-	{
-	    Link [k] = Link [parent] ;
-	    Link [parent] = k ;
-	}
-    }
-
-    /* done using Iwork for Link, Lnz (if needed), and Anext ] */
-
-    /* ---------------------------------------------------------------------- */
-    /* convert L to packed, if requested */
-    /* ---------------------------------------------------------------------- */
-
-    if (pack)
-    {
-	/* finalize Lp */
-	Lp [nrow] = pdest ;
-	/* Shrink L to be just large enough.  It cannot fail. */
-	/* workspace: none */
-	ASSERT ((size_t) (Lp [nrow]) <= L->nzmax) ;
-	CHOLMOD(reallocate_factor) (Lp [nrow], L, Common) ;
-	ASSERT (Common->status >= CHOLMOD_OK) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* clear workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* CHOLMOD(clear_flag) (Common) ; */
-    CHOLMOD_CLEAR_FLAG (Common) ;
-
-    DEBUG (CHOLMOD(dump_factor) (L, "ReSymbol final L (i, x):", Common)) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-    return (TRUE) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rowcolcounts.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rowcolcounts.c
deleted file mode 100644
index 5b0290d..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rowcolcounts.c
+++ /dev/null
@@ -1,536 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_rowcolcounts ======================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Compute the row and column counts of the Cholesky factor L of the matrix
- * A or A*A'.  The etree and its postordering must already be computed (see
- * cholmod_etree and cholmod_postorder) and given as inputs to this routine.
- *
- * For the symmetric case (LL'=A), A is accessed by column.  Only the lower
- * triangular part of A is used.  Entries not in this part of the matrix are
- * ignored.  This is the same as storing the upper triangular part of A by
- * rows, with entries in the lower triangular part being ignored.  NOTE: this
- * representation is the TRANSPOSE of the input to cholmod_etree.
- *
- * For the unsymmetric case (LL'=AA'), A is accessed by column.  Equivalently,
- * if A is viewed as a matrix in compressed-row form, this routine computes
- * the row and column counts for L where LL'=A'A.  If the input vector f is
- * present, then F*F' is analyzed instead, where F = A(:,f).
- *
- * The set f is held in fset and fsize.
- *	fset = NULL means ":" in MATLAB. fset is ignored.
- *	fset != NULL means f = fset [0..fset-1].
- *	fset != NULL and fsize = 0 means f is the empty set.
- *	Common->status is set to CHOLMOD_INVALID if fset is invalid.
- *
- * In both cases, the columns of A need not be sorted.
- * A can be packed or unpacked.
- *
- * References:
- * J. Gilbert, E. Ng, B. Peyton, "An efficient algorithm to compute row and
- * column counts for sparse Cholesky factorization", SIAM J. Matrix Analysis &
- * Applic., vol 15, 1994, pp. 1075-1091.
- *
- * J. Gilbert, X. Li, E. Ng, B. Peyton, "Computing row and column counts for
- * sparse QR and LU factorization", BIT, vol 41, 2001, pp. 693-710.
- *
- * workspace:
- *	if symmetric:   Flag (nrow), Iwork (2*nrow)
- *	if unsymmetric: Flag (nrow), Iwork (2*nrow+ncol), Head (nrow+1)
- *
- * Supports any xtype (pattern, real, complex, or zomplex).
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-/* ========================================================================== */
-/* === initialize_node ====================================================== */
-/* ========================================================================== */
-
-static int initialize_node  /* initial work for kth node in postordered etree */
-(
-    Int k,		/* at the kth step of the algorithm (and kth node) */
-    Int Post [ ],	/* Post [k] = i, the kth node in postordered etree */
-    Int Parent [ ],	/* Parent [i] is the parent of i in the etree */
-    Int ColCount [ ],	/* ColCount [c] is the current weight of node c */
-    Int PrevNbr [ ]	/* PrevNbr [u] = k if u was last considered at step k */
-)
-{
-    Int p, parent ;
-    /* determine p, the kth node in the postordered etree */
-    p = Post [k] ;
-    /* adjust the weight if p is not a root of the etree */
-    parent = Parent [p] ;
-    if (parent != EMPTY)
-    {
-	ColCount [parent]-- ;
-    }
-    /* flag node p to exclude self edges (p,p) */
-    PrevNbr [p] = k ;
-    return (p) ;
-}
-
-
-/* ========================================================================== */
-/* === process_edge ========================================================= */
-/* ========================================================================== */
-
-/* edge (p,u) is being processed.  p < u is a descendant of its ancestor u in
- * the etree.  node p is the kth node in the postordered etree.  */
-
-static void process_edge
-(
-    Int p,		/* process edge (p,u) of the matrix */
-    Int u,
-    Int k,		/* we are at the kth node in the postordered etree */
-    Int First [ ],	/* First [i] = k if the postordering of first
-			 * descendent of node i is k */
-    Int PrevNbr [ ],	/* u was last considered at step k = PrevNbr [u] */
-    Int ColCount [ ],	/* ColCount [c] is the current weight of node c */
-    Int PrevLeaf [ ],	/* s = PrevLeaf [u] means that s was the last leaf
-			 * seen in the subtree rooted at u.  */
-    Int RowCount [ ],	/* RowCount [i] is # of nonzeros in row i of L,
-			 * including the diagonal.  Not computed if NULL. */
-    Int SetParent [ ],	/* the FIND/UNION data structure, which forms a set
-			 * of trees.  A root i has i = SetParent [i].  Following
-			 * a path from i to the root q of the subtree containing
-			 * i means that q is the SetParent representative of i.
-			 * All nodes in the tree could have their SetParent
-			 * equal to the root q; the tree representation is used
-			 * to save time.  When a path is traced from i to its
-			 * root q, the path is re-traversed to set the SetParent
-			 * of the whole path to be the root q. */
-    Int Level [ ]	 /* Level [i] = length of path from node i to root */
-)
-{
-    Int prevleaf, q, s, sparent ;
-    if (First [p] > PrevNbr [u])
-    {
-	/* p is a leaf of the subtree of u */
-	ColCount [p]++ ;
-	prevleaf = PrevLeaf [u] ;
-	if (prevleaf == EMPTY)
-	{
-	    /* p is the first leaf of subtree of u; RowCount will be incremented
-	     * by the length of the path in the etree from p up to u. */
-	    q = u ;
-	}
-	else
-	{
-	    /* q = FIND (prevleaf): find the root q of the
-	     * SetParent tree containing prevleaf */
-	    for (q = prevleaf ; q != SetParent [q] ; q = SetParent [q])
-	    {
-		;
-	    }
-	    /* the root q has been found; re-traverse the path and
-	     * perform path compression */
-	    s = prevleaf ;
-	    for (s = prevleaf ; s != q ; s = sparent)
-	    {
-		sparent = SetParent [s] ;
-		SetParent [s] = q ;
-	    }
-	    /* adjust the RowCount and ColCount; RowCount will be incremented by
-	     * the length of the path from p to the SetParent root q, and
-	     * decrement the ColCount of q by one. */
-	    ColCount [q]-- ;
-	}
-	if (RowCount != NULL)
-	{
-	    /* if RowCount is being computed, increment it by the length of
-	     * the path from p to q */
-	    RowCount [u] += (Level [p] - Level [q]) ;
-	}
-	/* p is a leaf of the subtree of u, so mark PrevLeaf [u] to be p */
-	PrevLeaf [u] = p ;
-    }
-    /* flag u has having been processed at step k */
-    PrevNbr [u] = k ;
-}
-
-
-/* ========================================================================== */
-/* === finalize_node ======================================================== */
-/* ========================================================================== */
-
-static void finalize_node    /* compute UNION (p, Parent [p]) */
-(
-    Int p,
-    Int Parent [ ],	/* Parent [p] is the parent of p in the etree */
-    Int SetParent [ ]	/* see process_edge, above */
-)
-{
-    /* all nodes in the SetParent tree rooted at p now have as their final
-     * root the node Parent [p].  This computes UNION (p, Parent [p]) */
-    if (Parent [p] != EMPTY)
-    {
-	SetParent [p] = Parent [p] ;
-    }
-}
-
-
-/* ========================================================================== */
-/* === cholmod_rowcolcounts ================================================= */
-/* ========================================================================== */
-
-int CHOLMOD(rowcolcounts)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    Int *Parent,	/* size nrow.  Parent [i] = p if p is the parent of i */
-    Int *Post,		/* size nrow.  Post [k] = i if i is the kth node in
-			 * the postordered etree. */
-    /* ---- output --- */
-    Int *RowCount,	/* size nrow. RowCount [i] = # entries in the ith row of
-			 * L, including the diagonal. */
-    Int *ColCount,	/* size nrow. ColCount [i] = # entries in the ith
-			 * column of L, including the diagonal. */
-    Int *First,		/* size nrow.  First [i] = k is the least postordering
-			 * of any descendant of i. */
-    Int *Level,		/* size nrow.  Level [i] is the length of the path from
-			 * i to the root, with Level [root] = 0. */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double fl, ff ;
-    Int *Ap, *Ai, *Anz, *PrevNbr, *SetParent, *Head, *PrevLeaf, *Anext, *Ipost,
-	*Iwork ;
-    Int i, j, r, k, len, s, p, pend, inew, stype, nf, anz, inode, parent,
-	nrow, ncol, packed, use_fset, jj ;
-    size_t w ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (Parent, FALSE) ;
-    RETURN_IF_NULL (Post, FALSE) ;
-    RETURN_IF_NULL (ColCount, FALSE) ;
-    RETURN_IF_NULL (First, FALSE) ;
-    RETURN_IF_NULL (Level, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    stype = A->stype ;
-    if (stype > 0)
-    {
-	/* symmetric with upper triangular part not supported */
-	ERROR (CHOLMOD_INVALID, "symmetric upper not supported") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = A->nrow ;	/* the number of rows of A */
-    ncol = A->ncol ;	/* the number of columns of A */
-
-    /* w = 2*nrow + (stype ? 0 : ncol) */
-    w = CHOLMOD(mult_size_t) (nrow, 2, &ok) ;
-    w = CHOLMOD(add_size_t) (w, (stype ? 0 : ncol), &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (nrow, w, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-
-    ASSERT (CHOLMOD(dump_perm) (Post, nrow, nrow, "Post", Common)) ;
-    ASSERT (CHOLMOD(dump_parent) (Parent, nrow, "Parent", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;	/* size ncol+1, column pointers for A */
-    Ai = A->i ;	/* the row indices of A, of size nz=Ap[ncol+1] */
-    Anz = A->nz ;
-    packed = A->packed ;
-    ASSERT (IMPLIES (!packed, Anz != NULL)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Iwork = Common->Iwork ;
-    SetParent = Iwork ;		    /* size nrow (i/i/l) */
-    PrevNbr   = Iwork + nrow ;	    /* size nrow (i/i/l) */
-    Anext     = Iwork + 2*((size_t) nrow) ;    /* size ncol (i/i/l) (unsym only) */
-    PrevLeaf  = Common->Flag ;	    /* size nrow */
-    Head      = Common->Head ;	    /* size nrow+1 (unsym only)*/
-
-    /* ---------------------------------------------------------------------- */
-    /* find the first descendant and level of each node in the tree */
-    /* ---------------------------------------------------------------------- */
-
-    /* First [i] = k if the postordering of first descendent of node i is k */
-    /* Level [i] = length of path from node i to the root (Level [root] = 0) */
-
-    for (i = 0 ; i < nrow ; i++)
-    {
-	First [i] = EMPTY ;
-    }
-
-    /* postorder traversal of the etree */
-    for (k = 0 ; k < nrow ; k++)
-    {
-	/* node i of the etree is the kth node in the postordered etree */
-	i = Post [k] ;
-
-	/* i is a leaf if First [i] is still EMPTY */
-	/* ColCount [i] starts at 1 if i is a leaf, zero otherwise */
-	ColCount [i] = (First [i] == EMPTY) ? 1 : 0 ;
-
-	/* traverse the path from node i to the root, stopping if we find a
-	 * node r whose First [r] is already defined. */
-	len = 0 ;
-	for (r = i ; (r != EMPTY) && (First [r] == EMPTY) ; r = Parent [r])
-	{
-	    First [r] = k ;
-	    len++ ;
-	}
-	if (r == EMPTY)
-	{
-	    /* we hit a root node, the level of which is zero */
-	    len-- ;
-	}
-	else
-	{
-	    /* we stopped at node r, where Level [r] is already defined */
-	    len += Level [r] ;
-	}
-	/* re-traverse the path from node i to r; set the level of each node */
-	for (s = i ; s != r ; s = Parent [s])
-	{
-	    Level [s] = len-- ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* AA' case: sort columns of A according to first postordered row index */
-    /* ---------------------------------------------------------------------- */
-
-    fl = 0.0 ;
-    if (stype == 0)
-    {
-	/* [ use PrevNbr [0..nrow-1] as workspace for Ipost */
-	Ipost = PrevNbr ;
-	/* Ipost [i] = k if i is the kth node in the postordered etree. */
-	for (k = 0 ; k < nrow ; k++)
-	{
-	    Ipost [Post [k]] = k ;
-	}
-	use_fset = (fset != NULL) ;
-	if (use_fset)
-	{
-	    nf = fsize ;
-	    /* clear Anext to check fset */
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		Anext [j] = -2 ;
-	    }
-	    /* find the first postordered row in each column of A (post,f)
-	     * and place the column in the corresponding link list */
-	    for (jj = 0 ; jj < nf ; jj++)
-	    {
-		j = fset [jj] ;
-		if (j < 0 || j > ncol || Anext [j] != -2)
-		{
-		    /* out-of-range or duplicate entry in fset */
-		    ERROR (CHOLMOD_INVALID, "fset invalid") ;
-		    return (FALSE) ;
-		}
-		/* flag column j as having been seen */
-		Anext [j] = EMPTY ;
-	    }
-	    /* fset is now valid */
-	    ASSERT (CHOLMOD(dump_perm) (fset, nf, ncol, "fset", Common)) ;
-	}
-	else
-	{
-	    nf = ncol ;
-	}
-	for (jj = 0 ; jj < nf ; jj++)
-	{
-	    j = (use_fset) ? (fset [jj]) : jj ;
-	    /* column j is in the fset; find the smallest row (if any) */
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    ff = (double) MAX (0, pend - p) ;
-	    fl += ff*ff + ff ;
-	    if (pend > p)
-	    {
-		k = Ipost [Ai [p]] ;
-		for ( ; p < pend ; p++)
-		{
-		    inew = Ipost [Ai [p]] ;
-		    k = MIN (k, inew) ;
-		}
-		/* place column j in link list k */
-		ASSERT (k >= 0 && k < nrow) ;
-		Anext [j] = Head [k] ;
-		Head [k] = j ;
-	    }
-	}
-	/* Ipost no longer needed for inverse postordering ]
-	 * Head [k] contains a link list of all columns whose first
-	 * postordered row index is equal to k, for k = 0 to nrow-1. */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the row counts and node weights */
-    /* ---------------------------------------------------------------------- */
-
-    if (RowCount != NULL)
-    {
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    RowCount [i] = 1 ;
-	}
-    }
-    for (i = 0 ; i < nrow ; i++)
-    {
-	PrevLeaf [i] = EMPTY ;
-	PrevNbr [i] = EMPTY ;
-	SetParent [i] = i ;	/* every node is in its own set, by itself */
-    }
-
-    if (stype != 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* symmetric case: LL' = A */
-	/* ------------------------------------------------------------------ */
-
-	/* also determine the number of entries in triu(A) */
-	anz = nrow ;
-	for (k = 0 ; k < nrow ; k++)
-	{
-	    /* j is the kth node in the postordered etree */
-	    j = initialize_node (k, Post, Parent, ColCount, PrevNbr) ;
-
-	    /* for all nonzeros A(i,j) below the diagonal, in column j of A */
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		if (i > j)
-		{
-		    /* j is a descendant of i in etree(A) */
-		    anz++ ;
-		    process_edge (j, i, k, First, PrevNbr, ColCount,
-			    PrevLeaf, RowCount, SetParent, Level) ;
-		}
-	    }
-	    /* update SetParent: UNION (j, Parent [j]) */
-	    finalize_node (j, Parent, SetParent) ;
-	}
-	Common->anz = anz ;
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* unsymmetric case: LL' = AA' */
-	/* ------------------------------------------------------------------ */
-
-	for (k = 0 ; k < nrow ; k++)
-	{
-	    /* inode is the kth node in the postordered etree */
-	    inode = initialize_node (k, Post, Parent, ColCount, PrevNbr) ;
-
-	    /* for all cols j whose first postordered row is k: */
-	    for (j = Head [k] ; j != EMPTY ; j = Anext [j])
-	    {
-		/* k is the first postordered row in column j of A */
-		/* for all rows i in column j: */
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    /* has i already been considered at this step k */
-		    if (PrevNbr [i] < k)
-		    {
-			/* inode is a descendant of i in etree(AA') */
-			/* process edge (inode,i) and set PrevNbr[i] to k */
-			process_edge (inode, i, k, First, PrevNbr, ColCount,
-				PrevLeaf, RowCount, SetParent, Level) ;
-		    }
-		}
-	    }
-	    /* clear link list k */
-	    Head [k] = EMPTY ;
-	    /* update SetParent: UNION (inode, Parent [inode]) */
-	    finalize_node (inode, Parent, SetParent) ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* finish computing the column counts */
-    /* ---------------------------------------------------------------------- */
-
-    for (j = 0 ; j < nrow ; j++)
-    {
-	parent = Parent [j] ;
-	if (parent != EMPTY)
-	{
-	    /* add the ColCount of j to its parent */
-	    ColCount [parent] += ColCount [j] ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* clear workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Common->mark = EMPTY ;
-    /* CHOLMOD(clear_flag) (Common) ; */
-    CHOLMOD_CLEAR_FLAG (Common) ;
-
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* flop count and nnz(L) for subsequent LL' numerical factorization */
-    /* ---------------------------------------------------------------------- */
-
-    /* use double to avoid integer overflow.  lnz cannot be NaN. */
-    Common->aatfl = fl ;
-    Common->lnz = 0. ;
-    fl = 0 ;
-    for (j = 0 ; j < nrow ; j++)
-    {
-	ff = (double) (ColCount [j]) ;
-	Common->lnz += ff ;
-	fl += ff*ff ;
-    }
-
-    Common->fl = fl ;
-    PRINT1 (("rowcol fl %g lnz %g\n", Common->fl, Common->lnz)) ;
-
-    return (TRUE) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rowfac.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rowfac.c
deleted file mode 100644
index 94ba960..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_rowfac.c
+++ /dev/null
@@ -1,765 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_rowfac ============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2013, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Full or incremental numerical LDL' or LL' factorization (simplicial, not
- * supernodal) cholmod_factorize is the "easy" wrapper for this code, but it
- * does not provide access to incremental factorization.
- *
- * cholmod_rowfac computes the full or incremental LDL' or LL' factorization of
- * A+beta*I (where A is symmetric) or A*F+beta*I (where A and F are unsymmetric
- * and only the upper triangular part of A*F+beta*I is used).  It computes
- * L (and D, for LDL') one row at a time.  beta is real.
- *
- * A is nrow-by-ncol or nrow-by-nrow.  In "packed" form it is a conventional
- * column-oriented sparse matrix.  Row indices of column j are in
- * Ai [Ap [j] ... Ap [j+1]-1] and values in the same locations of Ax.
- * will be faster if A has sorted columns.  In "unpacked" form the column
- * of A ends at Ap [j] + Anz [j] - 1 instead of Ap [j+1] - 1.
- *
- * Row indices in each column of A can be sorted or unsorted, but the routine
- * routine works fastest if A is sorted, or if only triu(A) is provided
- * for the symmetric case.
- *
- * The unit-diagonal nrow-by-nrow output matrix L is returned in "unpacked"
- * column form, with row indices of column j in Li [Lp [j] ...
- * Lp [j] + Lnz [j] - 1] and values in the same location in Lx.  The row
- * indices in each column of L are in sorted order.  The unit diagonal of L
- * is not stored.
- *
- * L can be a simplicial symbolic or numeric (L->is_super must be FALSE).
- * A symbolic factor is converted immediately into a numeric factor containing
- * the identity matrix.
- *
- * For a full factorization, kstart = 0 and kend = nrow.  The existing nonzero
- * entries (numerical values in L->x and L->z for the zomplex case, and indices
- * in L->i), if any, are overwritten.
- *
- * To compute an incremental factorization, select kstart and kend as the range
- * of rows of L you wish to compute.  A correct factorization will be computed
- * only if all descendants of all nodes k = kstart to kend-1 in the etree have
- * been factorized by a prior call to this routine, and if rows kstart to kend-1
- * have not been factorized.  This condition is NOT checked on input.
- *
- * ---------------
- * Symmetric case:
- * ---------------
- *
- *	The factorization (in MATLAB notation) is:
- *
- *	S = beta*I + A
- *	S = triu (S) + triu (S,1)'
- *	L*D*L' = S, or L*L' = S
- *
- *	A is a conventional sparse matrix in compressed column form.  Only the
- *	diagonal and upper triangular part of A is accessed; the lower
- *	triangular part is ignored and assumed to be equal to the upper
- *	triangular part.  For an incremental factorization, only columns kstart
- *	to kend-1 of A are accessed.  F is not used.
- *
- * ---------------
- * Unsymmetric case:
- * ---------------
- *
- *	The factorization (in MATLAB notation) is:
- *
- *	S = beta*I + A*F
- *	S = triu (S) + triu (S,1)'
- *	L*D*L' = S, or L*L' = S
- *
- *	The typical case is F=A'.  Alternatively, if F=A(:,f)', then this
- *	routine factorizes S = beta*I + A(:,f)*A(:,f)'.
- *
- *	All of A and F are accessed, but only the upper triangular part of A*F
- *	is used.  F must be of size A->ncol by A->nrow.  F is used for the
- *	unsymmetric case only.  F can be packed or unpacked and it need not be
- *	sorted.
- *
- *	For a complete factorization of beta*I + A*A',
- *	this routine performs a number of flops exactly equal to:
- *
- *	sum (for each column j of A) of (Anz (j)^2 + Anz (j)), to form S
- *	+
- *	sum (for each column j of L) of (Lnz (j)^2 + 3*Lnz (j)), to factorize S
- *
- *	where Anz (j) is the number of nonzeros in column j of A, and Lnz (j)
- *	is the number of nonzero in column j of L below the diagonal.
- *
- *
- * workspace: Flag (nrow), W (nrow if real, 2*nrow if complex/zomplex),
- * Iwork (nrow)
- *
- * Supports any xtype, except a pattern-only input matrix A cannot be
- * factorized.
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-/* ========================================================================== */
-/* === subtree ============================================================== */
-/* ========================================================================== */
-
-/* Compute the nonzero pattern of the sparse triangular solve Lx=b, where L in
- * this case is L(0:k-1,0:k-1), and b is a column of A.  This is done by
- * traversing the kth row-subtree of the elimination tree of L, starting from
- * each nonzero entry in b.  The pattern is returned postordered, and is valid
- * for a subsequent numerical triangular solve of Lx=b.  The elimination tree
- * can be provided in a Parent array, or extracted from the pattern of L itself.
- *
- * The pattern of x = inv(L)*b is returned in Stack [top...].
- * Also scatters b, or a multiple of b, into the work vector W.
- *
- * The SCATTER macro is defines how the numerical values of A or A*A' are to be
- * scattered.
- *
- * PARENT(i) is a macro the defines how the etree is accessed.  It is either:
- *	#define PARENT(i) Parent [i]
- *	#define PARENT(i) (Lnz [i] > 1) ? (Li [Lp [i] + 1]) : EMPTY
- */
-
-#define SUBTREE \
-    for ( ; p < pend ; p++) \
-    { \
-	i = Ai [p] ; \
-	if (i <= k) \
-	{ \
-	    /* scatter the column of A, or A*A' into Wx and Wz */ \
-	    SCATTER ; \
-	    /* start at node i and traverse up the subtree, stop at node k */ \
-	    for (len = 0 ; i < k && i != EMPTY && Flag [i] < mark ; i = parent) \
-	    { \
-		/* L(k,i) is nonzero, and seen for the first time */ \
-		Stack [len++] = i ;	    /* place i on the stack */ \
-		Flag [i] = mark ;	    /* mark i as visited */ \
-		parent = PARENT (i) ;   /* traverse up the etree to the parent */ \
-	    } \
-	    /* move the path down to the bottom of the stack */ \
-	    while (len > 0) \
-	    { \
-		Stack [--top] = Stack [--len] ; \
-	    } \
-	} \
-	else if (sorted) \
-	{ \
-	    break ; \
-	} \
-    }
-
-
-/* ========================================================================== */
-/* === TEMPLATE ============================================================= */
-/* ========================================================================== */
-
-#define REAL
-#include "t_cholmod_rowfac.c"
-#define COMPLEX
-#include "t_cholmod_rowfac.c"
-#define ZOMPLEX
-#include "t_cholmod_rowfac.c"
-
-#define MASK
-#define REAL
-#include "t_cholmod_rowfac.c"
-#define COMPLEX
-#include "t_cholmod_rowfac.c"
-#define ZOMPLEX
-#include "t_cholmod_rowfac.c"
-#undef MASK
-
-
-/* ========================================================================== */
-/* === cholmod_row_subtree ================================================== */
-/* ========================================================================== */
-
-/* Compute the nonzero pattern of the solution to the lower triangular system
- * L(0:k-1,0:k-1) * x = A (0:k-1,k) if A is symmetric, or
- * L(0:k-1,0:k-1) * x = A (0:k-1,:) * A (:,k)' if A is unsymmetric.
- * This gives the nonzero pattern of row k of L (excluding the diagonal).
- * The pattern is returned postordered.
- *
- * The symmetric case requires A to be in symmetric-upper form.
- *
- * The result is returned in R, a pre-allocated sparse matrix of size nrow-by-1,
- * with R->nzmax >= nrow.  R is assumed to be packed (Rnz [0] is not updated);
- * the number of entries in R is given by Rp [0].
- *
- * FUTURE WORK:  a very minor change to this routine could allow it to compute
- * the nonzero pattern of x for any system Lx=b.  The SUBTREE macro would need
- * to change, to eliminate its dependence on k.
- *
- * workspace: Flag (nrow)
- */
-
-int CHOLMOD(row_subtree)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,f)' */
-    size_t krow,	/* row k of L */
-    Int *Parent,	/* elimination tree */
-    /* ---- output --- */
-    cholmod_sparse *R,	/* pattern of L(k,:), 1-by-n with R->nzmax >= n */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Rp, *Stack, *Flag, *Ap, *Ai, *Anz, *Fp, *Fi, *Fnz ;
-    Int p, pend, parent, t, stype, nrow, k, pf, pfend, Fpacked, packed,
-	sorted, top, len, i, mark ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (R, FALSE) ;
-    RETURN_IF_NULL (Parent, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (R, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    stype = A->stype ;
-    if (stype == 0)
-    {
-	RETURN_IF_NULL (F, FALSE) ;
-	RETURN_IF_XTYPE_INVALID (F, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    }
-    if (krow >= A->nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "subtree: k invalid") ;
-	return (FALSE) ;
-    }
-    if (R->ncol != 1 || A->nrow != R->nrow || A->nrow > R->nzmax)
-    {
-	ERROR (CHOLMOD_INVALID, "subtree: R invalid") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = A->nrow ;
-    CHOLMOD(allocate_work) (nrow, 0, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    if (stype > 0)
-    {
-	/* symmetric upper case: F is not needed.  It may be NULL */
-	Fp = NULL ;
-	Fi = NULL ;
-	Fnz = NULL ;
-	Fpacked = TRUE ;
-    }
-    else if (stype == 0)
-    {
-	/* unsymmetric case: F is required. */
-	Fp = F->p ;
-	Fi = F->i ;
-	Fnz = F->nz ;
-	Fpacked = F->packed ;
-    }
-    else
-    {
-	/* symmetric lower triangular form not supported */
-	ERROR (CHOLMOD_INVALID, "symmetric lower not supported") ;
-	return (FALSE) ;
-    }
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Anz = A->nz ;
-    packed = A->packed ;
-    sorted = A->sorted ;
-
-    k = krow ;
-    Stack = R->i ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Flag = Common->Flag ;	/* size nrow, Flag [i] < mark must hold */
-    /* mark = CHOLMOD(clear_flag) (Common) ; */
-    CHOLMOD_CLEAR_FLAG (Common) ;
-    mark = Common->mark ;
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the pattern of L(k,:) */
-    /* ---------------------------------------------------------------------- */
-
-    top = nrow ;		/* Stack is empty */
-    Flag [k] = mark ;		/* do not include diagonal entry in Stack */
-
-#define SCATTER			/* do not scatter numerical values */
-#define PARENT(i) Parent [i]	/* use Parent for etree */
-
-    if (stype != 0)
-    {
-	/* scatter kth col of triu (A), get pattern L(k,:) */
-	p = Ap [k] ;
-	pend = (packed) ? (Ap [k+1]) : (p + Anz [k]) ;
-	SUBTREE ;
-    }
-    else
-    {
-	/* scatter kth col of triu (beta*I+AA'), get pattern L(k,:) */
-	pf = Fp [k] ;
-	pfend = (Fpacked) ? (Fp [k+1]) : (pf + Fnz [k]) ;
-	for ( ; pf < pfend ; pf++)
-	{
-	    /* get nonzero entry F (t,k) */
-	    t = Fi [pf] ;
-	    p = Ap [t] ;
-	    pend = (packed) ? (Ap [t+1]) : (p + Anz [t]) ;
-	    SUBTREE ;
-	}
-    }
-
-#undef SCATTER
-#undef PARENT
-
-    /* shift the stack upwards, to the first part of R */
-    len = nrow - top ;
-    for (i = 0 ; i < len ; i++)
-    {
-	Stack [i] = Stack [top + i] ;
-    }
-
-    Rp = R->p ;
-    Rp [0] = 0 ;
-    Rp [1] = len ;
-    R->sorted = FALSE ;
-
-    CHOLMOD(clear_flag) (Common) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_lsolve_pattern =============================================== */
-/* ========================================================================== */
-
-/* Compute the nonzero pattern of Y=L\B.  L must be simplicial, and B
- * must be a single sparse column vector with B->stype = 0.  The values of
- * B are not used; it just specifies a nonzero pattern.  The pattern of
- * Y is not sorted, but is in topological order instead (suitable for a
- * sparse forward/backsolve).
- */
-
-int CHOLMOD(lsolve_pattern)
-(
-    /* ---- input ---- */
-    cholmod_sparse *B,	/* sparse right-hand-side (a single sparse column) */
-    cholmod_factor *L,	/* the factor L from which parent(i) is derived */
-    /* ---- output --- */
-    cholmod_sparse *Yset,   /* pattern of Y=L\B, n-by-1 with Y->nzmax >= n */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    size_t krow ;
-    RETURN_IF_NULL (B, FALSE) ;
-    krow = B->nrow ;
-    return (CHOLMOD(row_lsubtree) (B, NULL, 0, krow, L, Yset, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_row_lsubtree ================================================= */
-/* ========================================================================== */
-
-/* Identical to cholmod_row_subtree, except that the elimination tree is
- * obtained from L itself, as the first off-diagonal entry in each column.
- * L must be simplicial, not supernodal.
- *
- * If krow = A->nrow, then A must be a single sparse column vector, (A->stype
- * must be zero), and the nonzero pattern of x=L\b is computed, where b=A(:,0)
- * is the single sparse right-hand-side.  The inputs Fi and fnz are ignored.
- * See CHOLMOD(lsolve_pattern) above for a simpler interface for this case.
- */
-
-int CHOLMOD(row_lsubtree)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    Int *Fi, size_t fnz,    /* nonzero pattern of kth row of A', not required
-			     * for the symmetric case.  Need not be sorted. */
-    size_t krow,	/* row k of L */
-    cholmod_factor *L,	/* the factor L from which parent(i) is derived */
-    /* ---- output --- */
-    cholmod_sparse *R,	/* pattern of L(k,:), n-by-1 with R->nzmax >= n */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Rp, *Stack, *Flag, *Ap, *Ai, *Anz, *Lp, *Li, *Lnz ;
-    Int p, pend, parent, t, stype, nrow, k, pf, packed, sorted, top, len, i,
-	mark, ka ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (R, FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (R, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-
-    nrow = A->nrow ;
-    stype = A->stype ;
-    if (stype < 0)
-    {
-	/* symmetric lower triangular form not supported */
-	ERROR (CHOLMOD_INVALID, "symmetric lower not supported") ;
-	return (FALSE) ;
-    }
-
-    if (krow > nrow)
-    {
-        ERROR (CHOLMOD_INVALID, "lsubtree: krow invalid") ;
-        return (FALSE) ;
-    }
-    else if (krow == nrow)
-    {
-        /* find pattern of x=L\b where b=A(:,0) */
-        k = nrow ;      /* compute all of the result; don't stop in SUBTREE */
-        ka = 0 ;        /* use column A(:,0) */
-        if (stype != 0 || A->ncol != 1)
-        {
-            /* A must be unsymmetric (it's a single sparse column vector) */
-            ERROR (CHOLMOD_INVALID, "lsubtree: A invalid") ;
-            return (FALSE) ;
-        }
-    }
-    else
-    {
-        /* find pattern of L(k,:) using A(:,k) and Fi if A unsymmetric */
-        k = krow ;      /* which row of L to compute */
-        ka = k ;        /* which column of A to use */
-        if (stype == 0)
-        {
-            RETURN_IF_NULL (Fi, FALSE) ;
-        }
-    }
-
-    if (R->ncol != 1 || nrow != R->nrow || nrow > R->nzmax ||
-        ((krow == nrow || stype != 0) && ka >= A->ncol))
-    {
-	ERROR (CHOLMOD_INVALID, "lsubtree: R invalid") ;
-	return (FALSE) ;
-    }
-    if (L->is_super)
-    {
-	ERROR (CHOLMOD_INVALID, "lsubtree: L invalid (cannot be supernodal)") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(allocate_work) (nrow, 0, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Anz = A->nz ;
-    packed = A->packed ;
-    sorted = A->sorted ;
-
-    Stack = R->i ;
-
-    Lp = L->p ;
-    Li = L->i ;
-    Lnz = L->nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Flag = Common->Flag ;	/* size nrow, Flag [i] < mark must hold */
-    mark = CHOLMOD(clear_flag) (Common) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the pattern of L(k,:) */
-    /* ---------------------------------------------------------------------- */
-
-    top = nrow ;		/* Stack is empty */
-    if (k < nrow)
-    {
-        Flag [k] = mark ;       /* do not include diagonal entry in Stack */
-    }
-
-#define SCATTER			/* do not scatter numerical values */
-#define PARENT(i) (Lnz [i] > 1) ? (Li [Lp [i] + 1]) : EMPTY
-
-    if (krow == nrow || stype != 0)
-    {
-	/* scatter kth col of triu (A), get pattern L(k,:) */
-	p = Ap [ka] ;
-	pend = (packed) ? (Ap [ka+1]) : (p + Anz [ka]) ;
-	SUBTREE ;
-    }
-    else
-    {
-	/* scatter kth col of triu (beta*I+AA'), get pattern L(k,:) */
-	for (pf = 0 ; pf < (Int) fnz ; pf++)
-	{
-	    /* get nonzero entry F (t,k) */
-	    t = Fi [pf] ;
-	    p = Ap [t] ;
-	    pend = (packed) ? (Ap [t+1]) : (p + Anz [t]) ;
-	    SUBTREE ;
-	}
-    }
-
-#undef SCATTER
-#undef PARENT
-
-    /* shift the stack upwards, to the first part of R */
-    len = nrow - top ;
-    for (i = 0 ; i < len ; i++)
-    {
-	Stack [i] = Stack [top + i] ;
-    }
-
-    Rp = R->p ;
-    Rp [0] = 0 ;
-    Rp [1] = len ;
-    R->sorted = FALSE ;
-
-    CHOLMOD(clear_flag) (Common) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_rowfac ======================================================= */
-/* ========================================================================== */
-
-/* This is the incremental factorization for general purpose usage. */
-
-int CHOLMOD(rowfac)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,f)' */
-    double beta [2],	/* factorize beta*I+A or beta*I+AA' */
-    size_t kstart,	/* first row to factorize */
-    size_t kend,	/* last row to factorize is kend-1 */
-    /* ---- in/out --- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    return (CHOLMOD(rowfac_mask2) (A, F, beta, kstart, kend, NULL, 0, NULL, L,
-	Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_rowfac_mask ================================================== */
-/* ========================================================================== */
-
-/* This is meant for use in LPDASA only. */
-
-int CHOLMOD(rowfac_mask)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,f)' */
-    double beta [2],	/* factorize beta*I+A or beta*I+AA' */
-    size_t kstart,	/* first row to factorize */
-    size_t kend,	/* last row to factorize is kend-1 */
-    Int *mask,		/* size A->nrow. if mask[i] >= 0 row i is set to zero */
-    Int *RLinkUp,	/* size A->nrow. link list of rows to compute */
-    /* ---- in/out --- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int maskmark = 0 ;
-    return (CHOLMOD(rowfac_mask2) (A, F, beta, kstart, kend, mask, maskmark,
-        RLinkUp, L, Common)) ;
-}
-
-/* ========================================================================== */
-/* === cholmod_rowfac_mask2 ================================================= */
-/* ========================================================================== */
-
-/* This is meant for use in LPDASA only. */
-
-int CHOLMOD(rowfac_mask2)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,f)' */
-    double beta [2],	/* factorize beta*I+A or beta*I+AA' */
-    size_t kstart,	/* first row to factorize */
-    size_t kend,	/* last row to factorize is kend-1 */
-    Int *mask,		/* size A->nrow. if mask[i] >= maskmark row i is set
-                           to zero */
-    Int maskmark,       /* for mask [i] test */
-    Int *RLinkUp,	/* size A->nrow. link list of rows to compute */
-    /* ---- in/out --- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int n ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (L->xtype != CHOLMOD_PATTERN && A->xtype != L->xtype)
-    {
-	ERROR (CHOLMOD_INVALID, "xtype of A and L do not match") ;
-	return (FALSE) ;
-    }
-    if (L->is_super)
-    {
-	ERROR (CHOLMOD_INVALID, "can only do simplicial factorization");
-	return (FALSE) ;
-    }
-    if (A->stype == 0)
-    {
-	RETURN_IF_NULL (F, FALSE) ;
-	if (A->xtype != F->xtype)
-	{
-	    ERROR (CHOLMOD_INVALID, "xtype of A and F do not match") ;
-	    return (FALSE) ;
-	}
-    }
-    if (A->stype < 0)
-    {
-	/* symmetric lower triangular form not supported */
-	ERROR (CHOLMOD_INVALID, "symmetric lower not supported") ;
-	return (FALSE) ;
-    }
-    if (kend > L->n)
-    {
-	ERROR (CHOLMOD_INVALID, "kend invalid") ;
-	return (FALSE) ;
-    }
-    if (A->nrow != L->n)
-    {
-	ERROR (CHOLMOD_INVALID, "dimensions of A and L do not match") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-    Common->rowfacfl = 0 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* Xwork is of size n for the real case, 2*n for complex/zomplex */
-    n = L->n  ;
-
-    /* s = ((A->xtype != CHOLMOD_REAL) ? 2:1)*n */
-    s = CHOLMOD(mult_size_t) (n, ((A->xtype != CHOLMOD_REAL) ? 2:1), &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (n, n, s, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, A->nrow, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* factorize the matrix, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    if (RLinkUp == NULL)
-    {
-
-	switch (A->xtype)
-	{
-	    case CHOLMOD_REAL:
-		ok = r_cholmod_rowfac (A, F, beta, kstart, kend, L, Common) ;
-		break ;
-
-	    case CHOLMOD_COMPLEX:
-		ok = c_cholmod_rowfac (A, F, beta, kstart, kend, L, Common) ;
-		break ;
-
-	    case CHOLMOD_ZOMPLEX:
-		ok = z_cholmod_rowfac (A, F, beta, kstart, kend, L, Common) ;
-		break ;
-	}
-
-    }
-    else
-    {
-
-	switch (A->xtype)
-	{
-	    case CHOLMOD_REAL:
-		ok = r_cholmod_rowfac_mask (A, F, beta, kstart, kend,
-		    mask, maskmark, RLinkUp, L, Common) ;
-		break ;
-
-	    case CHOLMOD_COMPLEX:
-		ok = c_cholmod_rowfac_mask (A, F, beta, kstart, kend,
-		    mask, maskmark, RLinkUp, L, Common) ;
-		break ;
-
-	    case CHOLMOD_ZOMPLEX:
-		ok = z_cholmod_rowfac_mask (A, F, beta, kstart, kend,
-		    mask, maskmark, RLinkUp, L, Common) ;
-		break ;
-	}
-    }
-
-    return (ok) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_solve.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_solve.c
deleted file mode 100644
index df0c5d4..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_solve.c
+++ /dev/null
@@ -1,1681 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_solve =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2013, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Solve one of the following systems.  D is identity for an LL' factorization,
- * in which the D operation is skipped:
- *
- *      Ax=b        0: CHOLMOD_A     x = P' * (L' \ (D \ (L \ (P * b))))
- *      LDL'x=b     1: CHOLMOD_LDLt  x =      (L' \ (D \ (L \ (    b))))
- *      LDx=b       2: CHOLMOD_LD    x =      (     (D \ (L \ (    b))))
- *      DL'x=b      3: CHOLMOD_DLt   x =      (L' \ (D \ (    (    b))))
- *      Lx=b        4: CHOLMOD_L     x =      (     (    (L \ (    b))))
- *      L'x=b       5: CHOLMOD_Lt    x =      (L' \ (    (    (    b))))
- *      Dx=b        6: CHOLMOD_D     x =      (     (D \ (    (    b))))
- *      x=Pb        7: CHOLMOD_P     x =      (     (    (    (P * b))))
- *      x=P'b       8: CHOLMOD_Pt    x = P' * (     (    (    (    b))))
- *
- * The factorization can be simplicial LDL', simplicial LL', or supernodal LL'.
- * For an LL' factorization, D is the identity matrix.  Thus CHOLMOD_LD and
- * CHOLMOD_L solve the same system if an LL' factorization was performed,
- * for example.
- *
- * The supernodal solver uses BLAS routines dtrsv, dgemv, dtrsm, and dgemm,
- * or their complex counterparts ztrsv, zgemv, ztrsm, and zgemm.
- *
- * If both L and B are real, then X is returned real.  If either is complex
- * or zomplex, X is returned as either complex or zomplex, depending on the
- * Common->prefer_zomplex parameter.
- *
- * Supports any numeric xtype (pattern-only matrices not supported).
- *
- * This routine does not check to see if the diagonal of L or D is zero,
- * because sometimes a partial solve can be done with indefinite or singular
- * matrix.  If you wish to check in your own code, test L->minor.  If
- * L->minor == L->n, then the matrix has no zero diagonal entries.
- * If k = L->minor < L->n, then L(k,k) is zero for an LL' factorization, or
- * D(k,k) is zero for an LDL' factorization.
- *
- * This routine returns X as NULL only if it runs out of memory.  If L is
- * indefinite or singular, then X may contain Inf's or NaN's, but it will
- * exist on output.
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-#ifndef NSUPERNODAL
-#include "cholmod_supernodal.h"
-#endif
-
-
-/* ========================================================================== */
-/* === TEMPLATE ============================================================= */
-/* ========================================================================== */
-
-#define REAL
-#include "t_cholmod_solve.c"
-
-#define COMPLEX
-#include "t_cholmod_solve.c"
-
-#define ZOMPLEX
-#include "t_cholmod_solve.c"
-
-/* ========================================================================== */
-/* === Permutation macro ==================================================== */
-/* ========================================================================== */
-
-/* If Perm is NULL, it is interpretted as the identity permutation */
-
-#define P(k) ((Perm == NULL) ? (k) : Perm [k])
-
-
-/* ========================================================================== */
-/* === perm ================================================================= */
-/* ========================================================================== */
-
-/* Y = B (P (1:nrow), k1 : min (k1+ncols,ncol)-1) where B is nrow-by-ncol.
- *
- * Creates a permuted copy of a contiguous set of columns of B.
- * Y is already allocated on input.  Y must be of sufficient size.  Let nk be
- * the number of columns accessed in B.  Y->xtype determines the complexity of
- * the result.
- *
- * If B is real and Y is complex (or zomplex), only the real part of B is
- * copied into Y.  The imaginary part of Y is set to zero.
- *
- * If B is complex (or zomplex) and Y is real, both the real and imaginary and
- * parts of B are returned in Y.  Y is returned as nrow-by-2*nk. The even
- * columns of Y contain the real part of B and the odd columns contain the
- * imaginary part of B.  Y->nzmax must be >= 2*nrow*nk.  Otherise, Y is
- * returned as nrow-by-nk with leading dimension nrow.  Y->nzmax must be >=
- * nrow*nk.
- *
- * The case where the input (B) is real and the output (Y) is zomplex is
- * not used.
- */
-
-static void perm
-(
-    /* ---- input ---- */
-    cholmod_dense *B,	/* input matrix B */
-    Int *Perm,		/* optional input permutation (can be NULL) */
-    Int k1,		/* first column of B to copy */
-    Int ncols,		/* last column to copy is min(k1+ncols,B->ncol)-1 */
-    /* ---- in/out --- */
-    cholmod_dense *Y	/* output matrix Y, already allocated */
-)
-{
-    double *Yx, *Yz, *Bx, *Bz ;
-    Int k2, nk, p, k, j, nrow, ncol, d, dual, dj, j2 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    ncol = B->ncol ;
-    nrow = B->nrow ;
-    k2 = MIN (k1+ncols, ncol) ;
-    nk = MAX (k2 - k1, 0) ;
-    dual = (Y->xtype == CHOLMOD_REAL && B->xtype != CHOLMOD_REAL) ? 2 : 1 ;
-    d = B->d ;
-    Bx = B->x ;
-    Bz = B->z ;
-    Yx = Y->x ;
-    Yz = Y->z ;
-    Y->nrow = nrow ;
-    Y->ncol = dual*nk ;
-    Y->d = nrow ;
-    ASSERT (((Int) Y->nzmax) >= nrow*nk*dual) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* Y = B (P (1:nrow), k1:k2-1) */
-    /* ---------------------------------------------------------------------- */
-
-    switch (Y->xtype)
-    {
-
-	case CHOLMOD_REAL:
-
-	    switch (B->xtype)
-	    {
-
-		case CHOLMOD_REAL:
-		    /* Y real, B real */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [k + j2] = Bx [p] ;		/* real */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    /* Y real, B complex. Y is nrow-by-2*nk */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [k + j2       ] = Bx [2*p  ] ;	/* real */
-			    Yx [k + j2 + nrow] = Bx [2*p+1] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y real, B zomplex. Y is nrow-by-2*nk */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [k + j2       ] = Bx [p] ;	/* real */
-			    Yx [k + j2 + nrow] = Bz [p] ;	/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-
-	    switch (B->xtype)
-	    {
-
-		case CHOLMOD_REAL:
-		    /* Y complex, B real */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [2*k   + j2] = Bx [p] ;		/* real */
-			    Yx [2*k+1 + j2] = 0 ;		/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    /* Y complex, B complex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [2*k   + j2] = Bx [2*p  ] ;	/* real */
-			    Yx [2*k+1 + j2] = Bx [2*p+1] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y complex, B zomplex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [2*k   + j2] = Bx [p] ;		/* real */
-			    Yx [2*k+1 + j2] = Bz [p] ;		/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-
-	    switch (B->xtype)
-	    {
-
-#if 0
-		case CHOLMOD_REAL:
-		    /* this case is not used */
-		    break ;
-#endif
-
-		case CHOLMOD_COMPLEX:
-		    /* Y zomplex, B complex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [k + j2] = Bx [2*p  ] ;		/* real */
-			    Yz [k + j2] = Bx [2*p+1] ;		/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y zomplex, B zomplex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [k + j2] = Bx [p] ;		/* real */
-			    Yz [k + j2] = Bz [p] ;		/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-    }
-}
-
-
-/* ========================================================================== */
-/* === iperm ================================================================ */
-/* ========================================================================== */
-
-/* X (P (1:nrow), k1 : min (k1+ncols,ncol)-1) = Y where X is nrow-by-ncol.
- *
- * Copies and permutes Y into a contiguous set of columns of X.  X is already
- * allocated on input.  Y must be of sufficient size.  Let nk be the number
- * of columns accessed in X.  X->xtype determines the complexity of the result.
- *
- * If X is real and Y is complex (or zomplex), only the real part of B is
- * copied into X.  The imaginary part of Y is ignored.
- *
- * If X is complex (or zomplex) and Y is real, both the real and imaginary and
- * parts of Y are returned in X.  Y is nrow-by-2*nk. The even
- * columns of Y contain the real part of B and the odd columns contain the
- * imaginary part of B.  Y->nzmax must be >= 2*nrow*nk.  Otherise, Y is
- * nrow-by-nk with leading dimension nrow.  Y->nzmax must be >= nrow*nk.
- *
- * The case where the input (Y) is complex and the output (X) is real,
- * and the case where the input (Y) is zomplex and the output (X) is real,
- * are not used.
- */
-
-static void iperm
-(
-    /* ---- input ---- */
-    cholmod_dense *Y,	/* input matrix Y */
-    Int *Perm,		/* optional input permutation (can be NULL) */
-    Int k1,		/* first column of B to copy */
-    Int ncols,		/* last column to copy is min(k1+ncols,B->ncol)-1 */
-    /* ---- in/out --- */
-    cholmod_dense *X	/* output matrix X, already allocated */
-)
-{
-    double *Yx, *Yz, *Xx, *Xz ;
-    Int k2, nk, p, k, j, nrow, ncol, d, dj, j2 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    ncol = X->ncol ;
-    nrow = X->nrow ;
-    k2 = MIN (k1+ncols, ncol) ;
-    nk = MAX (k2 - k1, 0) ;
-    d = X->d ;
-    Xx = X->x ;
-    Xz = X->z ;
-    Yx = Y->x ;
-    Yz = Y->z ;
-    ASSERT (((Int) Y->nzmax) >= nrow*nk*
-	    ((X->xtype != CHOLMOD_REAL && Y->xtype == CHOLMOD_REAL) ? 2:1)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* X (P (1:nrow), k1:k2-1) = Y */
-    /* ---------------------------------------------------------------------- */
-
-    switch (Y->xtype)
-    {
-
-	case CHOLMOD_REAL:
-
-	    switch (X->xtype)
-	    {
-
-		case CHOLMOD_REAL:
-		    /* Y real, X real */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [p] = Yx [k + j2] ;		/* real */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    /* Y real, X complex. Y is nrow-by-2*nk */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [2*p  ] = Yx [k + j2       ] ;	/* real */
-			    Xx [2*p+1] = Yx [k + j2 + nrow] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y real, X zomplex. Y is nrow-by-2*nk */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [p] = Yx [k + j2       ] ;	/* real */
-			    Xz [p] = Yx [k + j2 + nrow] ;	/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-
-	    switch (X->xtype)
-	    {
-
-#if 0
-		case CHOLMOD_REAL:
-		    /* this case is not used */
-		    break ;
-#endif
-
-		case CHOLMOD_COMPLEX:
-		    /* Y complex, X complex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [2*p  ] = Yx [2*k   + j2] ;	/* real */
-			    Xx [2*p+1] = Yx [2*k+1 + j2] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y complex, X zomplex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * 2 * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [p] = Yx [2*k   + j2] ;		/* real */
-			    Xz [p] = Yx [2*k+1 + j2] ;		/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-
-	    switch (X->xtype)
-	    {
-
-#if 0
-		case CHOLMOD_REAL:
-		    /* this case is not used */
-		    break ;
-#endif
-
-		case CHOLMOD_COMPLEX:
-		    /* Y zomplex, X complex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [2*p  ] = Yx [k + j2] ;		/* real */
-			    Xx [2*p+1] = Yz [k + j2] ;		/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y zomplex, X zomplex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = nrow * (j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [p] = Yx [k + j2] ;		/* real */
-			    Xz [p] = Yz [k + j2] ;		/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-    }
-}
-
-
-/* ========================================================================== */
-/* === ptrans =============================================================== */
-/* ========================================================================== */
-
-/* Y = B (P (1:nrow), k1 : min (k1+ncols,ncol)-1)' where B is nrow-by-ncol.
- *
- * Creates a permuted and transposed copy of a contiguous set of columns of B.
- * Y is already allocated on input.  Y must be of sufficient size.  Let nk be
- * the number of columns accessed in B.  Y->xtype determines the complexity of
- * the result.
- *
- * If B is real and Y is complex (or zomplex), only the real part of B is
- * copied into Y.  The imaginary part of Y is set to zero.
- *
- * If B is complex (or zomplex) and Y is real, both the real and imaginary and
- * parts of B are returned in Y.  Y is returned as 2*nk-by-nrow. The even
- * rows of Y contain the real part of B and the odd rows contain the
- * imaginary part of B.  Y->nzmax must be >= 2*nrow*nk.  Otherise, Y is
- * returned as nk-by-nrow with leading dimension nk.  Y->nzmax must be >=
- * nrow*nk.
- *
- * The array transpose is performed, not the complex conjugate transpose.
- */
-
-static void ptrans
-(
-    /* ---- input ---- */
-    cholmod_dense *B,	/* input matrix B */
-    Int *Perm,		/* optional input permutation (can be NULL) */
-    Int k1,		/* first column of B to copy */
-    Int ncols,		/* last column to copy is min(k1+ncols,B->ncol)-1 */
-    /* ---- in/out --- */
-    cholmod_dense *Y	/* output matrix Y, already allocated */
-)
-{
-    double *Yx, *Yz, *Bx, *Bz ;
-    Int k2, nk, p, k, j, nrow, ncol, d, dual, dj, j2 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    ncol = B->ncol ;
-    nrow = B->nrow ;
-    k2 = MIN (k1+ncols, ncol) ;
-    nk = MAX (k2 - k1, 0) ;
-    dual = (Y->xtype == CHOLMOD_REAL && B->xtype != CHOLMOD_REAL) ? 2 : 1 ;
-    d = B->d ;
-    Bx = B->x ;
-    Bz = B->z ;
-    Yx = Y->x ;
-    Yz = Y->z ;
-    Y->nrow = dual*nk ;
-    Y->ncol = nrow ;
-    Y->d = dual*nk ;
-    ASSERT (((Int) Y->nzmax) >= nrow*nk*dual) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* Y = B (P (1:nrow), k1:k2-1)' */
-    /* ---------------------------------------------------------------------- */
-
-    switch (Y->xtype)
-    {
-
-	case CHOLMOD_REAL:
-
-	    switch (B->xtype)
-	    {
-
-		case CHOLMOD_REAL:
-		    /* Y real, B real  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = j-k1 ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2 + k*nk] = Bx [p] ;		/* real */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    /* Y real, B complex. Y is 2*nk-by-nrow */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2   + k*2*nk] = Bx [2*p  ] ;	/* real */
-			    Yx [j2+1 + k*2*nk] = Bx [2*p+1] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y real, B zomplex. Y is 2*nk-by-nrow */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2   + k*2*nk] = Bx [p] ;	/* real */
-			    Yx [j2+1 + k*2*nk] = Bz [p] ;	/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-
-	    switch (B->xtype)
-	    {
-
-		case CHOLMOD_REAL:
-		    /* Y complex, B real  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2   + k*2*nk] = Bx [p] ;	/* real */
-			    Yx [j2+1 + k*2*nk] = 0 ;		/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    /* Y complex, B complex  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2   + k*2*nk] = Bx [2*p  ] ;	/* real */
-			    Yx [j2+1 + k*2*nk] = Bx [2*p+1] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y complex, B zomplex  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2   + k*2*nk] = Bx [p] ;	/* real */
-			    Yx [j2+1 + k*2*nk] = Bz [p] ;	/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-
-	    switch (B->xtype)
-	    {
-
-		case CHOLMOD_REAL:
-		    /* Y zomplex, B real  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = j-k1 ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2 + k*nk] = Bx [p] ;		/* real */
-			    Yz [j2 + k*nk] = 0 ;		/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    /* Y zomplex, B complex  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = j-k1 ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2 + k*nk] = Bx [2*p  ] ;	/* real */
-			    Yz [j2 + k*nk] = Bx [2*p+1] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y zomplex, B zomplex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = j-k1 ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Yx [j2 + k*nk] = Bx [p] ;		/* real */
-			    Yz [j2 + k*nk] = Bz [p] ;		/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-    }
-}
-
-
-/* ========================================================================== */
-/* === iptrans ============================================================== */
-/* ========================================================================== */
-
-/* X (P (1:nrow), k1 : min (k1+ncols,ncol)-1) = Y' where X is nrow-by-ncol.
- *
- * Copies into a permuted and transposed contiguous set of columns of X.
- * X is already allocated on input.  Y must be of sufficient size.  Let nk be
- * the number of columns accessed in X.  X->xtype determines the complexity of
- * the result.
- *
- * If X is real and Y is complex (or zomplex), only the real part of Y is
- * copied into X.  The imaginary part of Y is ignored.
- *
- * If X is complex (or zomplex) and Y is real, both the real and imaginary and
- * parts of X are returned in Y.  Y is 2*nk-by-nrow. The even
- * rows of Y contain the real part of X and the odd rows contain the
- * imaginary part of X.  Y->nzmax must be >= 2*nrow*nk.  Otherise, Y is
- * nk-by-nrow with leading dimension nk.  Y->nzmax must be >= nrow*nk.
- *
- * The case where Y is complex or zomplex, and X is real, is not used.
- *
- * The array transpose is performed, not the complex conjugate transpose.
- */
-
-static void iptrans
-(
-    /* ---- input ---- */
-    cholmod_dense *Y,	/* input matrix Y */
-    Int *Perm,		/* optional input permutation (can be NULL) */
-    Int k1,		/* first column of X to copy into */
-    Int ncols,		/* last column to copy is min(k1+ncols,X->ncol)-1 */
-    /* ---- in/out --- */
-    cholmod_dense *X	/* output matrix X, already allocated */
-)
-{
-    double *Yx, *Yz, *Xx, *Xz ;
-    Int k2, nk, p, k, j, nrow, ncol, d, dj, j2 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    ncol = X->ncol ;
-    nrow = X->nrow ;
-    k2 = MIN (k1+ncols, ncol) ;
-    nk = MAX (k2 - k1, 0) ;
-    d = X->d ;
-    Xx = X->x ;
-    Xz = X->z ;
-    Yx = Y->x ;
-    Yz = Y->z ;
-    ASSERT (((Int) Y->nzmax) >= nrow*nk*
-	    ((X->xtype != CHOLMOD_REAL && Y->xtype == CHOLMOD_REAL) ? 2:1)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* X (P (1:nrow), k1:k2-1) = Y' */
-    /* ---------------------------------------------------------------------- */
-
-    switch (Y->xtype)
-    {
-
-	case CHOLMOD_REAL:
-
-	    switch (X->xtype)
-	    {
-
-		case CHOLMOD_REAL:
-		    /* Y real, X real  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = j-k1 ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [p] = Yx [j2 + k*nk] ;		/* real */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    /* Y real, X complex. Y is 2*nk-by-nrow */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [2*p  ] = Yx [j2   + k*2*nk] ;	/* real */
-			    Xx [2*p+1] = Yx [j2+1 + k*2*nk] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y real, X zomplex. Y is 2*nk-by-nrow */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [p] = Yx [j2   + k*2*nk] ;	/* real */
-			    Xz [p] = Yx [j2+1 + k*2*nk] ;	/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-
-	    switch (X->xtype)
-	    {
-
-#if 0
-		case CHOLMOD_REAL:
-		    /* this case is not used */
-		    break ;
-#endif
-
-		case CHOLMOD_COMPLEX:
-		    /* Y complex, X complex  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [2*p  ] = Yx [j2   + k*2*nk] ;	/* real */
-			    Xx [2*p+1] = Yx [j2+1 + k*2*nk] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y complex, X zomplex  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = 2*(j-k1) ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [p] = Yx [j2   + k*2*nk] ;	/* real */
-			    Xz [p] = Yx [j2+1 + k*2*nk] ;	/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-
-	    switch (X->xtype)
-	    {
-
-#if 0
-		case CHOLMOD_REAL:
-		    /* this case is not used */
-		    break ;
-#endif
-
-		case CHOLMOD_COMPLEX:
-		    /* Y zomplex, X complex  */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = j-k1 ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [2*p  ] = Yx [j2 + k*nk] ;	/* real */
-			    Xx [2*p+1] = Yz [j2 + k*nk] ;	/* imag */
-			}
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    /* Y zomplex, X zomplex */
-		    for (j = k1 ; j < k2 ; j++)
-		    {
-			dj = d*j ;
-			j2 = j-k1 ;
-			for (k = 0 ; k < nrow ; k++)
-			{
-			    p = P(k) + dj ;
-			    Xx [p] = Yx [j2 + k*nk] ;		/* real */
-			    Xz [p] = Yz [j2 + k*nk] ;		/* imag */
-			}
-		    }
-		    break ;
-
-	    }
-	    break ;
-
-    }
-}
-
-
-/* ========================================================================== */
-/* === cholmod_solve ======================================================== */
-/* ========================================================================== */
-
-/* Solve a linear system.
- *
- * The factorization can be simplicial LDL', simplicial LL', or supernodal LL'.
- * The Dx=b solve returns silently for the LL' factorizations (it is implicitly
- * identity).
- */
-
-cholmod_dense *CHOLMOD(solve)
-(
-    /* ---- input ---- */
-    int sys,		/* system to solve */
-    cholmod_factor *L,	/* factorization to use */
-    cholmod_dense *B,	/* right-hand-side */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *Y = NULL, *X = NULL ;
-    cholmod_dense *E = NULL ;
-    int ok ;
-
-    /* do the solve, allocating workspaces as needed  */
-    ok = CHOLMOD (solve2) (sys, L, B, NULL, &X, NULL, &Y, &E, Common) ;
-
-    /* free workspaces if allocated, and free result if an error occured */
-    CHOLMOD(free_dense) (&Y, Common) ;
-    CHOLMOD(free_dense) (&E, Common) ;
-    if (!ok)
-    {
-        CHOLMOD(free_dense) (&X, Common) ;
-    }
-    return (X) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_solve2 ======================================================= */
-/* ========================================================================== */
-
-/* This function acts just like cholmod_solve, except that the solution X and
- * the internal workspace (Y and E) can be passed in preallocated.  If the
- * solution X or any required workspaces are not allocated on input, or if they
- * are the wrong size or type, then this function frees them and reallocates
- * them as the proper size and type.  Thus, if you have a sequence of solves to
- * do, you can let this function allocate X, Y, and E on the first call.
- * Subsequent calls to cholmod_solve2 can then reuse this space.  You must
- * then free the workspaces Y and E (and X if desired) when you are finished.
- * For example, the first call to cholmod_l_solve2, below, will solve the
- * requested system.  The next 2 calls (with different right-hand-sides but
- * the same value of "sys") will resuse the workspace and solution X from the
- * first call.  Finally, when all solves are done, you must free the workspaces
- * Y and E (otherwise you will have a memory leak), and you should also free X
- * when you are done with it.  Note that on input, X, Y, and E must be either
- * valid cholmod_dense matrices, or initialized to NULL.  You cannot pass in an
- * uninitialized X, Y, or E.
- *
- *      cholmod_dense *X = NULL, *Y = NULL, *E = NULL ;
- *      ...
- *      cholmod_l_solve2 (sys, L, B1, NULL, &X, NULL, &Y, &E, Common) ;
- *      cholmod_l_solve2 (sys, L, B2, NULL, &X, NULL, &Y, &E, Common) ;
- *      cholmod_l_solve2 (sys, L, B3, NULL, &X, NULL, &Y, &E, Common) ;
- *      cholmod_l_free_dense (&X, Common) ;
- *      cholmod_l_free_dense (&Y, Common) ;
- *      cholmod_l_free_dense (&E, Common) ;
- *
- * The equivalent when using cholmod_l_solve is:
- *
- *      cholmod_dense *X = NULL, *Y = NULL, *E = NULL ;
- *      ...
- *      X = cholmod_l_solve (sys, L, B1, Common) ;
- *      cholmod_l_free_dense (&X, Common) ;
- *      X = cholmod_l_solve (sys, L, B2, Common) ;
- *      cholmod_l_free_dense (&X, Common) ;
- *      X = cholmod_l_solve (sys, L, B3, Common) ;
- *      cholmod_l_free_dense (&X, Common) ;
- *
- * Both methods work fine, but in the 2nd method with cholmod_solve, the
- * internal workspaces (Y and E) are allocated and freed on each call.
- *
- * Bset is an optional sparse column (pattern only) that specifies a set
- * of row indices.  It is ignored if NULL, or if sys is CHOLMOD_P or
- * CHOLMOD_Pt.  If it is present and not ignored, B must be a dense column
- * vector, and only entries B(i) where i is in the pattern of Bset are
- * considered.  All others are treated as if they were zero (they are not
- * accessed).  L must be a simplicial factorization, not supernodal.  L is
- * converted from supernodal to simplicial if necessary.  The solution X is
- * defined only for entries in the output sparse pattern of Xset.
- * The xtype (real/complex/zomplex) of L and B must match.
- *
- * NOTE: If Bset is present and L is supernodal, it is converted to simplicial
- * on output.
- */
-
-int CHOLMOD(solve2)         /* returns TRUE on success, FALSE on failure */
-(
-    /* ---- input ---- */
-    int sys,		            /* system to solve */
-    cholmod_factor *L,	            /* factorization to use */
-    cholmod_dense *B,               /* right-hand-side */
-    cholmod_sparse *Bset,
-    /* ---- output --- */
-    cholmod_dense **X_Handle,       /* solution, allocated if need be */
-    cholmod_sparse **Xset_Handle,
-    /* ---- workspace  */
-    cholmod_dense **Y_Handle,       /* workspace, or NULL */
-    cholmod_dense **E_Handle,       /* workspace, or NULL */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Yx, *Yz, *Bx, *Bz, *Xx, *Xz ;
-    cholmod_dense *Y = NULL, *X = NULL ;
-    cholmod_sparse *C, *Yset, C_header, Yset_header, *Xset ;
-    Int *Perm = NULL, *IPerm = NULL ;
-    Int n, nrhs, ncols, ctype, xtype, k1, nr, ytype, k, blen, p, i, d, nrow ;
-    Int Cp [2], Ysetp [2], *Ci, *Yseti, ysetlen ;
-    Int *Bsetp, *Bseti, *Bsetnz, *Xseti, *Xsetp, *Iwork ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_NULL (B, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (B, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (sys < CHOLMOD_A || sys > CHOLMOD_Pt)
-    {
-	ERROR (CHOLMOD_INVALID, "invalid system") ;
-	return (FALSE) ;
-    }
-    DEBUG (CHOLMOD(dump_factor) (L, "L", Common)) ;
-    DEBUG (CHOLMOD(dump_dense) (B, "B", Common)) ;
-    nrhs = B->ncol ;
-    n = (Int) L->n ;
-    d = (Int) B->d ;
-    nrow = (Int) B->nrow ;
-    if (d < n || nrow != n)
-    {
-	ERROR (CHOLMOD_INVALID, "dimensions of L and B do not match") ;
-	return (FALSE) ;
-    }
-    if (Bset)
-    {
-        if (nrhs != 1)
-        {
-            ERROR (CHOLMOD_INVALID, "Bset requires a single right-hand side") ;
-            return (FALSE) ;
-        }
-        if (L->xtype != B->xtype)
-        {
-            ERROR (CHOLMOD_INVALID, "Bset requires xtype of L and B to match") ;
-            return (FALSE) ;
-        }
-        DEBUG (CHOLMOD(dump_sparse) (Bset, "Bset", Common)) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    if ((sys == CHOLMOD_P || sys == CHOLMOD_Pt || sys == CHOLMOD_A)
-	    && L->ordering != CHOLMOD_NATURAL)
-    {
-        /* otherwise, Perm is NULL, and the identity permutation is used */
-	Perm = L->Perm ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the result X (or resuse the space from a prior call) */
-    /* ---------------------------------------------------------------------- */
-
-    ctype = (Common->prefer_zomplex) ? CHOLMOD_ZOMPLEX : CHOLMOD_COMPLEX ;
-
-    if (Bset)
-    {
-        xtype = L->xtype ;
-    }
-    else if (sys == CHOLMOD_P || sys == CHOLMOD_Pt)
-    {
-	/* x=Pb and x=P'b return X real if B is real; X is the preferred
-	 * complex/zcomplex type if B is complex or zomplex */
-	xtype = (B->xtype == CHOLMOD_REAL) ? CHOLMOD_REAL : ctype ;
-    }
-    else if (L->xtype == CHOLMOD_REAL && B->xtype == CHOLMOD_REAL)
-    {
-	/* X is real if both L and B are real */
-	xtype = CHOLMOD_REAL ;
-    }
-    else
-    {
-	/* X is complex, use the preferred complex/zomplex type */
-	xtype = ctype ;
-    }
-
-    /* ensure X has the right size and type */
-    X = CHOLMOD(ensure_dense) (X_Handle, n, nrhs, n, xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* solve using L, D, L', P, or some combination */
-    /* ---------------------------------------------------------------------- */
-
-    if (Bset)
-    {
-
-        /* ------------------------------------------------------------------ */
-        /* solve for a subset of x, with a sparse b */
-        /* ------------------------------------------------------------------ */
-
-        Int save_realloc_state ;
-
-#ifndef NSUPERNODAL
-        /* convert a supernodal L to simplicial when using Bset */
-        if (L->is_super)
-        {
-            /* Can only use Bset on a simplicial factorization.  The supernodal
-             * factor L is converted to simplicial, leaving the xtype unchanged
-             * (real, complex, or zomplex).  Since the supernodal factorization
-             * is already LL', it is left in that form.   This conversion uses
-             * the ll_super_to_simplicial_numeric function in
-             * cholmod_change_factor.
-             */
-            CHOLMOD(change_factor) (
-                CHOLMOD_REAL,   /* ignored, since L is already numeric */
-                TRUE,           /* convert to LL' (no change to num. values) */
-                FALSE,          /* convert to simplicial */
-                FALSE,          /* do not pack the columns of L */
-                FALSE,          /* (ignored) */
-                L, Common) ;
-            if (Common->status < CHOLMOD_OK)
-            {
-                /* out of memory, L is returned unchanged */
-                return (FALSE) ;
-            }
-        }
-#endif
-
-        /* L, X, and B are all the same xtype */
-        /* ensure Y is the the right size */
-	Y = CHOLMOD(ensure_dense) (Y_Handle, 1, n, 1, L->xtype, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    return (FALSE) ;
-	}
-
-        /* ------------------------------------------------------------------ */
-        /* get the inverse permutation, constructing it if needed */
-        /* ------------------------------------------------------------------ */
-
-        DEBUG (CHOLMOD (dump_perm) (Perm,  n,n, "Perm",  Common)) ;
-
-        if ((sys == CHOLMOD_A || sys == CHOLMOD_P) && Perm != NULL)
-        {
-            /* The inverse permutation IPerm is used for the c=Pb step,
-               which is needed only for solving Ax=b or x=Pb.  No other
-               steps should use IPerm */
-            if (L->IPerm == NULL)
-            {
-                /* construct the inverse permutation.  This is done only once
-                 * and then stored in L permanently.  */
-                L->IPerm = CHOLMOD(malloc) (n, sizeof (Int), Common) ;
-                if (Common->status < CHOLMOD_OK)
-                {
-                    /* out of memory */
-                    return (FALSE) ;
-                }
-                IPerm = L->IPerm ;
-                for (k = 0 ; k < n ; k++)
-                {
-                    IPerm [Perm [k]] = k ;
-                }
-            }
-            /* x=A\b and x=Pb both need IPerm */
-            IPerm = L->IPerm ;
-        }
-
-        if (sys == CHOLMOD_P)
-        {
-            /* x=Pb needs to turn off the subsequent x=P'b permutation */
-            Perm = NULL ;
-        }
-
-        DEBUG (CHOLMOD (dump_perm) (Perm,  n,n, "Perm",  Common)) ;
-        DEBUG (CHOLMOD (dump_perm) (IPerm, n,n, "IPerm", Common)) ;
-
-        /* ------------------------------------------------------------------ */
-        /* ensure Xset is the right size and type */
-        /* ------------------------------------------------------------------ */
-
-        /* Xset is n-by-1, nzmax >= n, pattern-only, packed, unsorted */
-        Xset = *Xset_Handle ;
-        if (Xset == NULL || (Int) Xset->nrow != n || (Int) Xset->ncol != 1 ||
-            (Int) Xset->nzmax < n || Xset->itype != CHOLMOD_PATTERN)
-        {
-            /* this is done only once, for the 1st call to cholmod_solve */
-            CHOLMOD(free_sparse) (Xset_Handle, Common) ;
-            Xset = CHOLMOD(allocate_sparse) (n, 1, n, FALSE, TRUE, 0,
-                CHOLMOD_PATTERN, Common) ;
-            *Xset_Handle = Xset ;
-        }
-        Xset->sorted = FALSE ;
-        Xset->stype = 0 ;
-        if (Common->status < CHOLMOD_OK)
-        {
-            /* out of memory */
-            return (FALSE) ;
-        }
-
-        /* -------------------------------------------------------------- */
-        /* ensure Flag of size n, and 3*n Int workspace is available */
-        /* -------------------------------------------------------------- */
-
-        /* does no work if prior calls already allocated enough space */
-        CHOLMOD(allocate_work) (n, 3*n, 0, Common) ;
-        if (Common->status < CHOLMOD_OK)
-        {
-            /* out of memory */
-            return (FALSE) ;
-        }
-
-        /* [ use Iwork (n:3n-1) for Ci and Yseti */
-        Iwork = Common->Iwork ;
-        /* Iwork (0:n-1) is not used because it is used by check_perm,
-           print_perm, check_sparse, and print_sparse */
-        Ci = Iwork + n ;
-        Yseti = Ci + n ;
-
-        /* reallocating workspace would break Ci and Yseti */
-        save_realloc_state = Common->no_workspace_reallocate ;
-        Common->no_workspace_reallocate = TRUE ;
-
-        /* -------------------------------------------------------------- */
-        /* C = permuted Bset, to correspond to the permutation of L */
-        /* -------------------------------------------------------------- */
-
-        /* C = IPerm (Bset) */
-        DEBUG (CHOLMOD(dump_sparse) (Bset, "Bset", Common)) ;
-
-        Bsetp = Bset->p ;
-        Bseti = Bset->i ;
-        Bsetnz = Bset->nz ;
-        blen = (Bset->packed) ? Bsetp [1] : Bsetnz [0] ;
-
-        /* C = spones (P*B) or C = spones (B) if IPerm is NULL */
-        C = &C_header ;
-        C->nrow = n ;
-        C->ncol = 1 ;
-        C->nzmax = n ;
-        C->packed = TRUE ;
-        C->stype = 0 ;
-        C->itype = ITYPE ;
-        C->xtype = CHOLMOD_PATTERN ;
-        C->dtype = CHOLMOD_DOUBLE ;
-        C->nz = NULL ;
-        C->p = Cp ;
-        C->i = Ci ;
-        C->x = NULL ;
-        C->z = NULL ;
-        C->sorted = FALSE ;
-        Cp [0] = 0 ;
-        Cp [1] = blen ;
-        for (p = 0 ; p < blen ; p++)
-        {
-            Int iold = Bseti [p] ;
-            Ci [p] = IPerm ? IPerm [iold] : iold ;
-        }
-        DEBUG (CHOLMOD (dump_sparse) (C, "C", Common)) ;
-
-        /* create a sparse column Yset from Iwork (n:2n-1) */
-        Yset = &Yset_header ;
-        Yset->nrow = n ;
-        Yset->ncol = 1 ;
-        Yset->nzmax = n ;
-        Yset->packed = TRUE ;
-        Yset->stype = 0 ;
-        Yset->itype = ITYPE ;
-        Yset->xtype = CHOLMOD_PATTERN ;
-        Yset->dtype = CHOLMOD_DOUBLE ;
-        Yset->nz = NULL ;
-        Yset->p = Ysetp ;
-        Yset->i = Yseti ;
-        Yset->x = NULL ;
-        Yset->z = NULL ;
-        Yset->sorted = FALSE ;
-        Ysetp [0] = 0 ;
-        Ysetp [1] = 0 ;
-        DEBUG (CHOLMOD (dump_sparse) (Yset, "Yset empty", Common)) ;
-
-        /* -------------------------------------------------------------- */
-        /* Yset = nonzero pattern of L\C, or just C itself */
-        /* -------------------------------------------------------------- */
-
-        /* this takes O(ysetlen) time  */
-        if (sys == CHOLMOD_P || sys == CHOLMOD_Pt || sys == CHOLMOD_D)
-        {
-            Ysetp [1] = blen ;
-            for (p = 0 ; p < blen ; p++)
-            {
-                Yseti [p] = Ci [p] ;
-            }
-        }
-        else
-        {
-            if (!CHOLMOD(lsolve_pattern) (C, L, Yset, Common))
-            {
-                Common->no_workspace_reallocate = save_realloc_state ;
-                return (FALSE) ;
-            }
-        }
-        DEBUG (CHOLMOD (dump_sparse) (Yset, "Yset", Common)) ;
-
-        /* -------------------------------------------------------------- */
-        /* clear the parts of Y that we will use in the solve */
-        /* -------------------------------------------------------------- */
-
-        Yx = Y->x ;
-        Yz = Y->z ;
-        ysetlen = Ysetp [1] ;
-
-        switch (L->xtype)
-        {
-
-            case CHOLMOD_REAL:
-                for (p = 0 ; p < ysetlen ; p++)
-                {
-                    i = Yseti [p] ;
-                    Yx [i] = 0 ;
-                }
-                break ;
-
-            case CHOLMOD_COMPLEX:
-                for (p = 0 ; p < ysetlen ; p++)
-                {
-                    i = Yseti [p] ;
-                    Yx [2*i  ] = 0 ;
-                    Yx [2*i+1] = 0 ;
-                }
-                break ;
-
-            case CHOLMOD_ZOMPLEX:
-                for (p = 0 ; p < ysetlen ; p++)
-                {
-                    i = Yseti [p] ;
-                    Yx [i] = 0 ;
-                    Yz [i] = 0 ;
-                }
-                break ;
-        }
-
-        DEBUG (CHOLMOD (dump_dense) (Y, "Y (Yset) = 0", Common)) ;
-
-        /* -------------------------------------------------------------- */
-        /* scatter and permute B into Y */
-        /* -------------------------------------------------------------- */
-
-        /* Y (C) = B (Bset) */
-        Bx = B->x ;
-        Bz = B->z ;
-
-        switch (L->xtype)
-        {
-
-            case CHOLMOD_REAL:
-                for (p = 0 ; p < blen ; p++)
-                {
-                    Int iold = Bseti [p] ;
-                    Int inew = Ci [p] ;
-                    Yx [inew] = Bx [iold] ;
-                }
-                break ;
-
-            case CHOLMOD_COMPLEX:
-                for (p = 0 ; p < blen ; p++)
-                {
-                    Int iold = Bseti [p] ;
-                    Int inew = Ci [p] ;
-                    Yx [2*inew  ] = Bx [2*iold  ] ;
-                    Yx [2*inew+1] = Bx [2*iold+1] ;
-                }
-                break ;
-
-            case CHOLMOD_ZOMPLEX:
-                for (p = 0 ; p < blen ; p++)
-                {
-                    Int iold = Bseti [p] ;
-                    Int inew = Ci [p] ;
-                    Yx [inew] = Bx [iold] ;
-                    Yz [inew] = Bz [iold] ;
-                }
-                break ;
-        }
-
-        DEBUG (CHOLMOD (dump_dense) (Y, "Y (C) = B (Bset)", Common)) ;
-
-        /* -------------------------------------------------------------- */
-        /* solve Y = (L' \ (L \ Y'))', or other system, with template */
-        /* -------------------------------------------------------------- */
-
-        /* the solve only iterates over columns in Yseti [0...ysetlen-1] */
-
-        if (! (sys == CHOLMOD_P || sys == CHOLMOD_Pt))
-        {
-            switch (L->xtype)
-            {
-                case CHOLMOD_REAL:
-                    r_simplicial_solver (sys, L, Y, Yseti, ysetlen) ;
-                    break ;
-
-                case CHOLMOD_COMPLEX:
-                    c_simplicial_solver (sys, L, Y, Yseti, ysetlen) ;
-                    break ;
-
-                case CHOLMOD_ZOMPLEX:
-                    z_simplicial_solver (sys, L, Y, Yseti, ysetlen) ;
-                    break ;
-            }
-        }
-
-        DEBUG (CHOLMOD (dump_dense) (Y, "Y after solve", Common)) ;
-
-        /* -------------------------------------------------------------- */
-        /* X = P'*Y, but only for rows in Yset, and create Xset */
-        /* -------------------------------------------------------------- */
-
-        /* X (Perm (Yset)) = Y (Yset) */
-        Xx = X->x ;
-        Xz = X->z ;
-        Xseti = Xset->i ;
-        Xsetp = Xset->p ;
-
-        switch (L->xtype)
-        {
-
-            case CHOLMOD_REAL:
-                for (p = 0 ; p < ysetlen ; p++)
-                {
-                    Int inew = Yseti [p] ;
-                    Int iold = Perm ? Perm [inew] : inew ;
-                    Xx [iold] = Yx [inew] ;
-                    Xseti [p] = iold ;
-                }
-                break ;
-
-            case CHOLMOD_COMPLEX:
-                for (p = 0 ; p < ysetlen ; p++)
-                {
-                    Int inew = Yseti [p] ;
-                    Int iold = Perm ? Perm [inew] : inew ;
-                    Xx [2*iold  ] = Yx [2*inew] ;
-                    Xx [2*iold+1] = Yx [2*inew+1] ;
-                    Xseti [p] = iold ;
-                }
-                break ;
-
-            case CHOLMOD_ZOMPLEX:
-                for (p = 0 ; p < ysetlen ; p++)
-                {
-                    Int inew = Yseti [p] ;
-                    Int iold = Perm ? Perm [inew] : inew ;
-                    Xx [iold] = Yx [inew] ;
-                    Xz [iold] = Yz [inew] ;
-                    Xseti [p] = iold ;
-                }
-                break ;
-        }
-
-        Xsetp [0] = 0 ;
-        Xsetp [1] = ysetlen ;
-
-        DEBUG (CHOLMOD(dump_sparse) (Xset, "Xset", Common)) ;
-        DEBUG (CHOLMOD(dump_dense) (X, "X", Common)) ;
-        Common->no_workspace_reallocate = save_realloc_state ;
-        /* done using Iwork (n:3n-1) for Ci and Yseti ] */
-
-    }
-    else if (sys == CHOLMOD_P)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* x = P*b */
-	/* ------------------------------------------------------------------ */
-
-	perm (B, Perm, 0, nrhs, X) ;
-
-    }
-    else if (sys == CHOLMOD_Pt)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* x = P'*b */
-	/* ------------------------------------------------------------------ */
-
-	iperm (B, Perm, 0, nrhs, X) ;
-
-    }
-    else if (L->is_super)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* solve using a supernodal LL' factorization */
-	/* ------------------------------------------------------------------ */
-
-#ifndef NSUPERNODAL
-	/* allocate workspace */
-	cholmod_dense *E ;
-	Int dual ;
-        Common->blas_ok = TRUE ;
-	dual = (L->xtype == CHOLMOD_REAL && B->xtype != CHOLMOD_REAL) ? 2 : 1 ;
-	Y = CHOLMOD(ensure_dense) (Y_Handle, n, dual*nrhs, n, L->xtype, Common);
-	E = CHOLMOD(ensure_dense) (E_Handle, dual*nrhs, L->maxesize, dual*nrhs,
-		L->xtype, Common) ;
-
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-            return (FALSE) ;
-	}
-
-	perm (B, Perm, 0, nrhs, Y) ;			    /* Y = P*B */
-
-	if (sys == CHOLMOD_A || sys == CHOLMOD_LDLt)
-	{
-	    CHOLMOD(super_lsolve) (L, Y, E, Common) ;	    /* Y = L\Y */
-            CHOLMOD(super_ltsolve) (L, Y, E, Common) ;	    /* Y = L'\Y*/
-	}
-	else if (sys == CHOLMOD_L || sys == CHOLMOD_LD)
-	{
-	    CHOLMOD(super_lsolve) (L, Y, E, Common) ;	    /* Y = L\Y */
-	}
-	else if (sys == CHOLMOD_Lt || sys == CHOLMOD_DLt)
-	{
-	    CHOLMOD(super_ltsolve) (L, Y, E, Common) ;      /* Y = L'\Y*/
-	}
-
-	iperm (Y, Perm, 0, nrhs, X) ;			    /* X = P'*Y */
-
-	if (CHECK_BLAS_INT && !Common->blas_ok)
-	{
-	    /* Integer overflow in the BLAS.  This is probably impossible,
-	     * since the BLAS were used to create the supernodal factorization.
-	     * It might be possible for the calls to the BLAS to differ between
-	     * factorization and forward/backsolves, however.  This statement
-	     * is untested; it does not appear in the compiled code if
-             * CHECK_BLAS_INT is true (when the same integer is used in
-             * CHOLMOD and the BLAS. */
-	    return (FALSE) ;
-	}
-
-#else
-	/* CHOLMOD Supernodal module not installed */
-	ERROR (CHOLMOD_NOT_INSTALLED,"Supernodal module not installed") ;
-#endif
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* solve using a simplicial LL' or LDL' factorization */
-	/* ------------------------------------------------------------------ */
-
-        if (L->xtype == CHOLMOD_REAL && B->xtype == CHOLMOD_REAL)
-	{
-	    /* L, B, and Y are all real */
-	    /* solve with up to 4 columns of B at a time */
-            ncols = 4 ;
-            nr = MAX (4, nrhs) ;
-	    ytype = CHOLMOD_REAL ;
-	}
-	else if (L->xtype == CHOLMOD_REAL)
-	{
-            /* L is real and B is complex or zomplex */
-	    /* solve with one column of B (real/imag), at a time */
-	    ncols = 1 ;
-	    nr = 2 ;
-	    ytype = CHOLMOD_REAL ;
-	}
-	else
-	{
-	    /* L is complex or zomplex, B is real/complex/zomplex, Y has the
-	     * same complexity as L.  Solve with one column of B at a time. */
-	    ncols = 1 ;
-	    nr = 1 ;
-	    ytype = L->xtype ;
-	}
-
-	Y = CHOLMOD(ensure_dense) (Y_Handle, nr, n, nr, ytype, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    return (FALSE) ;
-	}
-
-        for (k1 = 0 ; k1 < nrhs ; k1 += ncols)
-        {
-
-            /* -------------------------------------------------------------- */
-            /* Y = B (P, k1:k1+ncols-1)' = (P * B (:,...))' */
-            /* -------------------------------------------------------------- */
-
-            ptrans (B, Perm, k1, ncols, Y) ;
-
-            /* -------------------------------------------------------------- */
-            /* solve Y = (L' \ (L \ Y'))', or other system, with template */
-            /* -------------------------------------------------------------- */
-
-            switch (L->xtype)
-            {
-                case CHOLMOD_REAL:
-                    r_simplicial_solver (sys, L, Y, NULL, 0) ;
-                    break ;
-
-                case CHOLMOD_COMPLEX:
-                    c_simplicial_solver (sys, L, Y, NULL, 0) ;
-                    break ;
-
-                case CHOLMOD_ZOMPLEX:
-                    z_simplicial_solver (sys, L, Y, NULL, 0) ;
-                    break ;
-            }
-
-            /* -------------------------------------------------------------- */
-            /* X (P, k1:k2+ncols-1) = Y' */
-            /* -------------------------------------------------------------- */
-
-            iptrans (Y, Perm, k1, ncols, X) ;
-        }
-    }
-
-    DEBUG (CHOLMOD(dump_dense) (X, "X result", Common)) ;
-    return (TRUE) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_spsolve.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_spsolve.c
deleted file mode 100644
index 1b0f71a..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/cholmod_spsolve.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/cholmod_spsolve ============================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Given an LL' or LDL' factorization of A, solve one of the following systems:
- *
- *	Ax=b	    0: CHOLMOD_A	also applies the permutation L->Perm
- *	LDL'x=b	    1: CHOLMOD_LDLt	does not apply L->Perm
- *	LDx=b	    2: CHOLMOD_LD
- *	DL'x=b	    3: CHOLMOD_DLt
- *	Lx=b	    4: CHOLMOD_L
- *	L'x=b	    5: CHOLMOD_Lt
- *	Dx=b	    6: CHOLMOD_D
- *	x=Pb	    7: CHOLMOD_P	apply a permutation (P is L->Perm)
- *	x=P'b	    8: CHOLMOD_Pt	apply an inverse permutation
- *
- * where b and x are sparse.  If L and b are real, then x is real.  Otherwise,
- * x is complex or zomplex, depending on the Common->prefer_zomplex parameter.
- * All xtypes of x and b are supported (real, complex, and zomplex).
- */
-
-#ifndef NCHOLESKY
-
-#include "cholmod_internal.h"
-#include "cholmod_cholesky.h"
-
-/* ========================================================================== */
-/* === EXPAND_AS_NEEDED ===================================================== */
-/* ========================================================================== */
-
-/* Double the size of the sparse matrix X, if we have run out of space. */ 
-
-#define EXPAND_AS_NEEDED \
-if (xnz >= nzmax) \
-{ \
-    nzmax *= 2 ; \
-    CHOLMOD(reallocate_sparse) (nzmax, X, Common) ; \
-    if (Common->status < CHOLMOD_OK) \
-    { \
-	CHOLMOD(free_sparse) (&X, Common) ; \
-	CHOLMOD(free_dense) (&X4, Common) ; \
-	CHOLMOD(free_dense) (&B4, Common) ; \
-	return (NULL) ; \
-    } \
-    Xi = X->i ; \
-    Xx = X->x ; \
-    Xz = X->z ; \
-}
-
-
-/* ========================================================================== */
-/* === cholmod_spolve ======================================================= */
-/* ========================================================================== */
-
-cholmod_sparse *CHOLMOD(spsolve)	    /* returns the sparse solution X */
-(
-    /* ---- input ---- */
-    int sys,		/* system to solve */
-    cholmod_factor *L,	/* factorization to use */
-    cholmod_sparse *B,	/* right-hand-side */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double x, z ;
-    cholmod_dense *X4, *B4 ;
-    cholmod_sparse *X ;
-    double *Bx, *Bz, *Xx, *Xz, *B4x, *B4z, *X4x, *X4z ;
-    Int *Bi, *Bp, *Xp, *Xi, *Bnz ;
-    Int n, nrhs, q, p, i, j, jfirst, jlast, packed, block, pend, j_n, xtype ;
-    size_t xnz, nzmax ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (L, NULL) ;
-    RETURN_IF_NULL (B, NULL) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, NULL) ;
-    RETURN_IF_XTYPE_INVALID (B, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, NULL) ;
-    if (L->n != B->nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "dimensions of L and B do not match") ;
-	return (NULL) ;
-    }
-    if (B->stype)
-    {
-	ERROR (CHOLMOD_INVALID, "B cannot be stored in symmetric mode") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace B4 and initial result X */
-    /* ---------------------------------------------------------------------- */
-
-    n = L->n ;
-    nrhs = B->ncol ;
-
-    /* X is real if both L and B are real, complex/zomplex otherwise */
-    xtype = (L->xtype == CHOLMOD_REAL && B->xtype == CHOLMOD_REAL) ?
-	CHOLMOD_REAL :
-	(Common->prefer_zomplex ? CHOLMOD_ZOMPLEX : CHOLMOD_COMPLEX) ;
-
-    /* solve up to 4 columns at a time */
-    block = MIN (nrhs, 4) ;
-
-    /* initial size of X is at most 4*n */
-    nzmax = n*block ;
-
-    X = CHOLMOD(spzeros) (n, nrhs, nzmax, xtype, Common) ;
-    B4 = CHOLMOD(zeros) (n, block, B->xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free_sparse) (&X, Common) ;
-	CHOLMOD(free_dense) (&B4, Common) ;
-	return (NULL) ;
-    }
-
-    Bp = B->p ;
-    Bi = B->i ;
-    Bx = B->x ;
-    Bz = B->z ;
-    Bnz = B->nz ;
-    packed = B->packed ;
-
-    Xp = X->p ;
-    Xi = X->i ;
-    Xx = X->x ;
-    Xz = X->z ;
-
-    xnz = 0 ;
-
-    B4x = B4->x ;
-    B4z = B4->z ;
-
-    /* ---------------------------------------------------------------------- */
-    /* solve in chunks of 4 columns at a time */
-    /* ---------------------------------------------------------------------- */
-
-    for (jfirst = 0 ; jfirst < nrhs ; jfirst += block)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* adjust the number of columns of B4 */
-	/* ------------------------------------------------------------------ */
-
-	jlast = MIN (nrhs, jfirst + block) ;
-	B4->ncol = jlast - jfirst ;
-
-	/* ------------------------------------------------------------------ */
-	/* scatter B(jfirst:jlast-1) into B4 */
-	/* ------------------------------------------------------------------ */
-
-	for (j = jfirst ; j < jlast ; j++)
-	{
-	    p = Bp [j] ;
-	    pend = (packed) ? (Bp [j+1]) : (p + Bnz [j]) ;
-	    j_n = (j-jfirst)*n ;
-
-	    switch (B->xtype)
-	    {
-
-		case CHOLMOD_REAL:
-		    for ( ; p < pend ; p++)
-		    {
-			B4x [Bi [p] + j_n] = Bx [p] ;
-		    }
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    for ( ; p < pend ; p++)
-		    {
-			q = Bi [p] + j_n ;
-			B4x [2*q  ] = Bx [2*p  ] ;
-			B4x [2*q+1] = Bx [2*p+1] ;
-		    }
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    for ( ; p < pend ; p++)
-		    {
-			q = Bi [p] + j_n ;
-			B4x [q] = Bx [p] ;
-			B4z [q] = Bz [p] ;
-		    }
-		    break ;
-	    }
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* solve the system (X4 = A\B4 or other system) */
-	/* ------------------------------------------------------------------ */
-
-	X4 = CHOLMOD(solve) (sys, L, B4, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    CHOLMOD(free_sparse) (&X, Common) ;
-	    CHOLMOD(free_dense) (&B4, Common) ;
-	    CHOLMOD(free_dense) (&X4, Common) ;
-	    return (NULL) ;
-	}
-	ASSERT (X4->xtype == xtype) ;
-	X4x = X4->x ;
-	X4z = X4->z ;
-
-	/* ------------------------------------------------------------------ */
-	/* append the solution onto X */
-	/* ------------------------------------------------------------------ */
-
-	for (j = jfirst ; j < jlast ; j++)
-	{
-	    Xp [j] = xnz ;
-	    j_n = (j-jfirst)*n ;
-	    if ( xnz + n <= nzmax)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* X is guaranteed to be large enough */
-		/* ---------------------------------------------------------- */
-
-		switch (xtype)
-		{
-
-		    case CHOLMOD_REAL:
-			for (i = 0 ; i < n ; i++)
-			{
-			    x = X4x [i + j_n] ;
-			    if (IS_NONZERO (x))
-			    {
-				Xi [xnz] = i ;
-				Xx [xnz] = x ;
-				xnz++ ;
-			    }
-			}
-			break ;
-
-		    case CHOLMOD_COMPLEX:
-			for (i = 0 ; i < n ; i++)
-			{
-			    x = X4x [2*(i + j_n)  ] ;
-			    z = X4x [2*(i + j_n)+1] ;
-			    if (IS_NONZERO (x) || IS_NONZERO (z))
-			    {
-				Xi [xnz] = i ;
-				Xx [2*xnz  ] = x ;
-				Xx [2*xnz+1] = z ;
-				xnz++ ;
-			    }
-			}
-			break ;
-
-		    case CHOLMOD_ZOMPLEX:
-			for (i = 0 ; i < n ; i++)
-			{
-			    x = X4x [i + j_n] ;
-			    z = X4z [i + j_n] ;
-			    if (IS_NONZERO (x) || IS_NONZERO (z))
-			    {
-				Xi [xnz] = i ;
-				Xx [xnz] = x ;
-				Xz [xnz] = z ;
-				xnz++ ;
-			    }
-			}
-			break ;
-		}
-
-	    }
-	    else
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* X may need to increase in size */
-		/* ---------------------------------------------------------- */
-
-		switch (xtype)
-		{
-
-		    case CHOLMOD_REAL:
-			for (i = 0 ; i < n ; i++)
-			{
-			    x = X4x [i + j_n] ;
-			    if (IS_NONZERO (x))
-			    {
-				EXPAND_AS_NEEDED ;
-				Xi [xnz] = i ;
-				Xx [xnz] = x ;
-				xnz++ ;
-			    }
-			}
-			break ;
-
-		    case CHOLMOD_COMPLEX:
-			for (i = 0 ; i < n ; i++)
-			{
-			    x = X4x [2*(i + j_n)  ] ;
-			    z = X4x [2*(i + j_n)+1] ;
-			    if (IS_NONZERO (x) || IS_NONZERO (z))
-			    {
-				EXPAND_AS_NEEDED ;
-				Xi [xnz] = i ;
-				Xx [2*xnz  ] = x ;
-				Xx [2*xnz+1] = z ;
-				xnz++ ;
-			    }
-			}
-			break ;
-
-		    case CHOLMOD_ZOMPLEX:
-			for (i = 0 ; i < n ; i++)
-			{
-			    x = X4x [i + j_n] ;
-			    z = X4z [i + j_n] ;
-			    if (IS_NONZERO (x) || IS_NONZERO (z))
-			    {
-				EXPAND_AS_NEEDED ;
-				Xi [xnz] = i ;
-				Xx [xnz] = x ;
-				Xz [xnz] = z ;
-				xnz++ ;
-			    }
-			}
-			break ;
-		}
-
-	    }
-	}
-	CHOLMOD(free_dense) (&X4, Common) ;
-
-	/* ------------------------------------------------------------------ */
-	/* clear B4 for next iteration */
-	/* ------------------------------------------------------------------ */
-
-	if (jlast < nrhs)
-	{
-
-	    for (j = jfirst ; j < jlast ; j++)
-	    {
-		p = Bp [j] ;
-		pend = (packed) ? (Bp [j+1]) : (p + Bnz [j]) ;
-		j_n = (j-jfirst)*n ;
-
-		switch (B->xtype)
-		{
-
-		    case CHOLMOD_REAL:
-			for ( ; p < pend ; p++)
-			{
-			    B4x [Bi [p] + j_n] = 0 ;
-			}
-			break ;
-
-		    case CHOLMOD_COMPLEX:
-			for ( ; p < pend ; p++)
-			{
-			    q = Bi [p] + j_n ;
-			    B4x [2*q  ] = 0 ;
-			    B4x [2*q+1] = 0 ;
-			}
-			break ;
-
-		    case CHOLMOD_ZOMPLEX:
-			for ( ; p < pend ; p++)
-			{
-			    q = Bi [p] + j_n ;
-			    B4x [q] = 0 ;
-			    B4z [q] = 0 ;
-			}
-			break ;
-		}
-	    }
-	}
-    }
-
-    Xp [nrhs] = xnz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* reduce X in size, free workspace, and return result */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (xnz <= X->nzmax) ;
-    CHOLMOD(reallocate_sparse) (xnz, X, Common) ;
-    ASSERT (Common->status == CHOLMOD_OK) ;
-    CHOLMOD(free_dense) (&B4, Common) ;
-    return (X) ;
-}
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/lesser.txt b/src/C/SuiteSparse/CHOLMOD/Cholesky/lesser.txt
deleted file mode 100644
index 8add30a..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/lesser.txt
+++ /dev/null
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-

-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-

-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-

-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-

-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-

-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-

-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-

-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-

-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_lsolve.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_lsolve.c
deleted file mode 100644
index c91dc2f..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_lsolve.c
+++ /dev/null
@@ -1,850 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/t_cholmod_lsolve ============================================ */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2013, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Template routine to solve Lx=b with unit or non-unit diagonal, or
- * solve LDx=b.
- *
- * The numeric xtype of L and Y must match.  Y contains b on input and x on
- * output, stored in row-form.  Y is nrow-by-n, where nrow must equal 1 for the 
- * complex or zomplex cases, and nrow <= 4 for the real case.
- *
- * This file is not compiled separately.  It is included in t_cholmod_solve.c
- * instead.  It contains no user-callable routines.
- *
- * workspace: none
- *
- * Supports real, complex, and zomplex factors.
- */
-
-/* undefine all prior definitions */
-#undef FORM_NAME
-#undef LSOLVE
-
-/* -------------------------------------------------------------------------- */
-/* define the method */
-/* -------------------------------------------------------------------------- */
-
-#ifdef LL
-/* LL': solve Lx=b with non-unit diagonal */
-#define FORM_NAME(prefix,rank) prefix ## ll_lsolve_ ## rank
-
-#elif defined (LD)
-/* LDL': solve LDx=b */
-#define FORM_NAME(prefix,rank) prefix ## ldl_ldsolve_ ## rank
-
-#else
-/* LDL': solve Lx=b with unit diagonal */
-#define FORM_NAME(prefix,rank) prefix ## ldl_lsolve_ ## rank
-
-#endif
-
-/* LSOLVE(k) defines the name of a routine for an n-by-k right-hand-side. */
-
-#define LSOLVE(prefix,rank) FORM_NAME(prefix,rank)
-
-#ifdef REAL
-
-/* ========================================================================== */
-/* === LSOLVE (1) =========================================================== */
-/* ========================================================================== */
-
-/* Solve Lx=b, where b has 1 column  */
-
-static void LSOLVE (PREFIX,1)
-(
-    cholmod_factor *L,
-    double X [ ]                        /* n-by-1 in row form */
-)
-{
-    double *Lx = L->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int j, n = L->n ;
-
-    for (j = 0 ; j < n ; )
-    {
-	/* get the start, end, and length of column j */
-	Int p = Lp [j] ;
-	Int lnz = Lnz [j] ;
-	Int pend = p + lnz ;
-
-	/* find a chain of supernodes (up to j, j+1, and j+2) */
-	if (lnz < 4 || lnz != Lnz [j+1] + 1 || Li [p+1] != j+1)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a single column of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y = X [j] ;
-#ifdef LL
-	    y /= Lx [p] ;
-	    X [j] = y ;
-#elif defined (LD)
-	    X [j] = y / Lx [p] ;
-#endif
-	    for (p++ ; p < pend ; p++)
-	    {
-		X [Li [p]] -= Lx [p] * y ;
-	    }
-	    j++ ;	/* advance to next column of L */
-
-	}
-	else if (lnz != Lnz [j+2] + 2 || Li [p+2] != j+2)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of two columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2] ;
-	    Int q = Lp [j+1] ;
-#ifdef LL
-	    y [0] = X [j] / Lx [p] ;
-	    y [1] = (X [j+1] - Lx [p+1] * y [0]) / Lx [q] ;
-	    X [j  ] = y [0] ;
-	    X [j+1] = y [1] ;
-#elif defined (LD)
-	    y [0] = X [j] ;
-	    y [1] = X [j+1] - Lx [p+1] * y [0] ;
-	    X [j  ] = y [0] / Lx [p] ;
-	    X [j+1] = y [1] / Lx [q] ;
-#else
-	    y [0] = X [j] ;
-	    y [1] = X [j+1] - Lx [p+1] * y [0] ;
-	    X [j+1] = y [1] ;
-#endif
-	    for (p += 2, q++ ; p < pend ; p++, q++)
-	    {
-		X [Li [p]] -= Lx [p] * y [0] + Lx [q] * y [1] ;
-	    }
-	    j += 2 ;	    /* advance to next column of L */
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of three columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3] ;
-	    Int q = Lp [j+1] ;
-	    Int r = Lp [j+2] ;
-#ifdef LL
-	    y [0] = X [j] / Lx [p] ;
-	    y [1] = (X [j+1] - Lx [p+1] * y [0]) / Lx [q] ;
-	    y [2] = (X [j+2] - Lx [p+2] * y [0] - Lx [q+1] * y [1]) / Lx [r] ;
-	    X [j  ] = y [0] ;
-	    X [j+1] = y [1] ;
-	    X [j+2] = y [2] ;
-#elif defined (LD)
-	    y [0] = X [j] ;
-	    y [1] = X [j+1] - Lx [p+1] * y [0] ;
-	    y [2] = X [j+2] - Lx [p+2] * y [0] - Lx [q+1] * y [1] ;
-	    X [j  ] = y [0] / Lx [p] ;
-	    X [j+1] = y [1] / Lx [q] ;
-	    X [j+2] = y [2] / Lx [r] ;
-#else
-	    y [0] = X [j] ;
-	    y [1] = X [j+1] - Lx [p+1] * y [0] ;
-	    y [2] = X [j+2] - Lx [p+2] * y [0] - Lx [q+1] * y [1] ;
-	    X [j+1] = y [1] ;
-	    X [j+2] = y [2] ;
-#endif
-	    for (p += 3, q += 2, r++ ; p < pend ; p++, q++, r++)
-	    {
-		X [Li [p]] -= Lx [p] * y [0] + Lx [q] * y [1] + Lx [r] * y [2] ;
-	    }
-	    j += 3 ;	    /* advance to next column of L */
-	}
-    }
-}
-
-
-/* ========================================================================== */
-/* === LSOLVE (2) =========================================================== */
-/* ========================================================================== */
-
-/* Solve Lx=b, where b has 2 columns */
-
-static void LSOLVE (PREFIX,2)
-(
-    cholmod_factor *L,
-    double X [ ][2]		/* n-by-2 in row form */
-)
-{
-    double *Lx = L->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int j, n = L->n ;
-
-    for (j = 0 ; j < n ; )
-    {
-	/* get the start, end, and length of column j */
-	Int p = Lp [j] ;
-	Int lnz = Lnz [j] ;
-	Int pend = p + lnz ;
-
-	/* find a chain of supernodes (up to j, j+1, and j+2) */
-	if (lnz < 4 || lnz != Lnz [j+1] + 1 || Li [p+1] != j+1)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a single column of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2] ;
-	    y [0] = X [j][0] ;
-	    y [1] = X [j][1] ;
-#ifdef LL
-	    y [0] /= Lx [p] ;
-	    y [1] /= Lx [p] ;
-	    X [j][0] = y [0] ;
-	    X [j][1] = y [1] ;
-#elif defined (LD)
-	    X [j][0] = y [0] / Lx [p] ;
-	    X [j][1] = y [1] / Lx [p] ;
-#endif
-	    for (p++ ; p < pend ; p++)
-	    {
-		Int i = Li [p] ;
-		X [i][0] -= Lx [p] * y [0] ;
-		X [i][1] -= Lx [p] * y [1] ;
-	    }
-	    j++ ;	/* advance to next column of L */
-
-	}
-	else if (lnz != Lnz [j+2] + 2 || Li [p+2] != j+2)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of two columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2][2] ;
-	    Int q = Lp [j+1] ;
-	    y [0][0] = X [j][0] ;
-	    y [0][1] = X [j][1] ;
-#ifdef LL
-	    y [0][0] /= Lx [p] ;
-	    y [0][1] /= Lx [p] ;
-	    y [1][0] = (X [j+1][0] - Lx [p+1] * y [0][0]) / Lx [q] ;
-	    y [1][1] = (X [j+1][1] - Lx [p+1] * y [0][1]) / Lx [q] ;
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-#elif defined (LD)
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    X [j  ][0] = y [0][0] / Lx [p] ;
-	    X [j  ][1] = y [0][1] / Lx [p] ;
-	    X [j+1][0] = y [1][0] / Lx [q] ;
-	    X [j+1][1] = y [1][1] / Lx [q] ;
-#else
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-#endif
-	    for (p += 2, q++ ; p < pend ; p++, q++)
-	    {
-		Int i = Li [p] ;
-		X [i][0] -= Lx [p] * y [0][0] + Lx [q] * y [1][0] ;
-		X [i][1] -= Lx [p] * y [0][1] + Lx [q] * y [1][1] ;
-	    }
-	    j += 2 ;	    /* advance to next column of L */
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of three columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3][2] ;
-	    Int q = Lp [j+1] ;
-	    Int r = Lp [j+2] ;
-	    y [0][0] = X [j][0] ;
-	    y [0][1] = X [j][1] ;
-#ifdef LL
-	    y [0][0] /= Lx [p] ;
-	    y [0][1] /= Lx [p] ;
-	    y [1][0] = (X [j+1][0] - Lx[p+1] * y[0][0]) / Lx [q] ;
-	    y [1][1] = (X [j+1][1] - Lx[p+1] * y[0][1]) / Lx [q] ;
-	    y [2][0] = (X [j+2][0] - Lx[p+2] * y[0][0] - Lx[q+1]*y[1][0])/Lx[r];
-	    y [2][1] = (X [j+2][1] - Lx[p+2] * y[0][1] - Lx[q+1]*y[1][1])/Lx[r];
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+2][0] = y [2][0] ;
-	    X [j+2][1] = y [2][1] ;
-#elif defined (LD)
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
-	    y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
-	    X [j  ][0] = y [0][0] / Lx [p] ;
-	    X [j  ][1] = y [0][1] / Lx [p] ;
-	    X [j+1][0] = y [1][0] / Lx [q] ;
-	    X [j+1][1] = y [1][1] / Lx [q] ;
-	    X [j+2][0] = y [2][0] / Lx [r] ;
-	    X [j+2][1] = y [2][1] / Lx [r] ;
-#else
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
-	    y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+2][0] = y [2][0] ;
-	    X [j+2][1] = y [2][1] ;
-#endif
-	    for (p += 3, q += 2, r++ ; p < pend ; p++, q++, r++)
-	    {
-		Int i = Li [p] ;
-		X[i][0] -= Lx[p] * y[0][0] + Lx[q] * y[1][0] + Lx[r] * y[2][0] ;
-		X[i][1] -= Lx[p] * y[0][1] + Lx[q] * y[1][1] + Lx[r] * y[2][1] ;
-	    }
-	    j += 3 ;	    /* advance to next column of L */
-	}
-    }
-}
-
-
-/* ========================================================================== */
-/* === LSOLVE (3) =========================================================== */
-/* ========================================================================== */
-
-/* Solve Lx=b, where b has 3 columns */
-
-static void LSOLVE (PREFIX,3)
-(
-    cholmod_factor *L,
-    double X [ ][3]			/* n-by-3 in row form */
-)
-{
-    double *Lx = L->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int j, n = L->n ;
-
-    for (j = 0 ; j < n ; )
-    {
-	/* get the start, end, and length of column j */
-	Int p = Lp [j] ;
-	Int lnz = Lnz [j] ;
-	Int pend = p + lnz ;
-
-	/* find a chain of supernodes (up to j, j+1, and j+2) */
-	if (lnz < 4 || lnz != Lnz [j+1] + 1 || Li [p+1] != j+1)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a single column of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3] ;
-	    y [0] = X [j][0] ;
-	    y [1] = X [j][1] ;
-	    y [2] = X [j][2] ;
-#ifdef LL
-	    y [0] /= Lx [p] ;
-	    y [1] /= Lx [p] ;
-	    y [2] /= Lx [p] ;
-	    X [j][0] = y [0] ;
-	    X [j][1] = y [1] ;
-	    X [j][2] = y [2] ;
-#elif defined (LD)
-	    X [j][0] = y [0] / Lx [p] ;
-	    X [j][1] = y [1] / Lx [p] ;
-	    X [j][2] = y [2] / Lx [p] ;
-#endif
-	    for (p++ ; p < pend ; p++)
-	    {
-		Int i = Li [p] ;
-		double lx = Lx [p] ;
-		X [i][0] -= lx * y [0] ;
-		X [i][1] -= lx * y [1] ;
-		X [i][2] -= lx * y [2] ;
-	    }
-	    j++ ;	/* advance to next column of L */
-
-	}
-	else if (lnz != Lnz [j+2] + 2 || Li [p+2] != j+2)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of two columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2][3] ;
-	    Int q = Lp [j+1] ;
-	    y [0][0] = X [j][0] ;
-	    y [0][1] = X [j][1] ;
-	    y [0][2] = X [j][2] ;
-#ifdef LL
-	    y [0][0] /= Lx [p] ;
-	    y [0][1] /= Lx [p] ;
-	    y [0][2] /= Lx [p] ;
-	    y [1][0] = (X [j+1][0] - Lx [p+1] * y [0][0]) / Lx [q] ;
-	    y [1][1] = (X [j+1][1] - Lx [p+1] * y [0][1]) / Lx [q] ;
-	    y [1][2] = (X [j+1][2] - Lx [p+1] * y [0][2]) / Lx [q] ;
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j  ][2] = y [0][2] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+1][2] = y [1][2] ;
-#elif defined (LD)
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
-	    X [j  ][0] = y [0][0] / Lx [p] ;
-	    X [j  ][1] = y [0][1] / Lx [p] ;
-	    X [j  ][2] = y [0][2] / Lx [p] ;
-	    X [j+1][0] = y [1][0] / Lx [q] ;
-	    X [j+1][1] = y [1][1] / Lx [q] ;
-	    X [j+1][2] = y [1][2] / Lx [q] ;
-#else
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+1][2] = y [1][2] ;
-#endif
-	    for (p += 2, q++ ; p < pend ; p++, q++)
-	    {
-		Int i = Li [p] ;
-		double lx [2] ;
-		lx [0] = Lx [p] ;
-		lx [1] = Lx [q] ;
-		X [i][0] -= lx [0] * y [0][0] + lx [1] * y [1][0] ;
-		X [i][1] -= lx [0] * y [0][1] + lx [1] * y [1][1] ;
-		X [i][2] -= lx [0] * y [0][2] + lx [1] * y [1][2] ;
-	    }
-	    j += 2 ;	    /* advance to next column of L */
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of three columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3][3] ;
-	    Int q = Lp [j+1] ;
-	    Int r = Lp [j+2] ;
-	    y [0][0] = X [j][0] ;
-	    y [0][1] = X [j][1] ;
-	    y [0][2] = X [j][2] ;
-#ifdef LL
-	    y [0][0] /= Lx [p] ;
-	    y [0][1] /= Lx [p] ;
-	    y [0][2] /= Lx [p] ;
-	    y [1][0] = (X [j+1][0] - Lx[p+1] * y[0][0]) / Lx [q] ;
-	    y [1][1] = (X [j+1][1] - Lx[p+1] * y[0][1]) / Lx [q] ;
-	    y [1][2] = (X [j+1][2] - Lx[p+1] * y[0][2]) / Lx [q] ;
-	    y [2][0] = (X [j+2][0] - Lx[p+2] * y[0][0] - Lx[q+1]*y[1][0])/Lx[r];
-	    y [2][1] = (X [j+2][1] - Lx[p+2] * y[0][1] - Lx[q+1]*y[1][1])/Lx[r];
-	    y [2][2] = (X [j+2][2] - Lx[p+2] * y[0][2] - Lx[q+1]*y[1][2])/Lx[r];
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j  ][2] = y [0][2] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+1][2] = y [1][2] ;
-	    X [j+2][0] = y [2][0] ;
-	    X [j+2][1] = y [2][1] ;
-	    X [j+2][2] = y [2][2] ;
-#elif defined (LD)
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
-	    y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
-	    y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
-	    y [2][2] = X [j+2][2] - Lx [p+2] * y [0][2] - Lx [q+1] * y [1][2] ;
-	    X [j  ][0] = y [0][0] / Lx [p] ;
-	    X [j  ][1] = y [0][1] / Lx [p] ;
-	    X [j  ][2] = y [0][2] / Lx [p] ;
-	    X [j+1][0] = y [1][0] / Lx [q] ;
-	    X [j+1][1] = y [1][1] / Lx [q] ;
-	    X [j+1][2] = y [1][2] / Lx [q] ;
-	    X [j+2][0] = y [2][0] / Lx [r] ;
-	    X [j+2][1] = y [2][1] / Lx [r] ;
-	    X [j+2][2] = y [2][2] / Lx [r] ;
-#else
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
-	    y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
-	    y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
-	    y [2][2] = X [j+2][2] - Lx [p+2] * y [0][2] - Lx [q+1] * y [1][2] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+1][2] = y [1][2] ;
-	    X [j+2][0] = y [2][0] ;
-	    X [j+2][1] = y [2][1] ;
-	    X [j+2][2] = y [2][2] ;
-#endif
-	    for (p += 3, q += 2, r++ ; p < pend ; p++, q++, r++)
-	    {
-		Int i = Li [p] ;
-		double lx [3] ;
-		lx [0] = Lx [p] ;
-		lx [1] = Lx [q] ;
-		lx [2] = Lx [r] ;
-		X [i][0] -= lx[0] * y[0][0] + lx[1] * y[1][0] + lx[2] * y[2][0];
-		X [i][1] -= lx[0] * y[0][1] + lx[1] * y[1][1] + lx[2] * y[2][1];
-		X [i][2] -= lx[0] * y[0][2] + lx[1] * y[1][2] + lx[2] * y[2][2];
-	    }
-	    j += 3 ;	    /* advance to next column of L */
-	}
-    }
-}
-
-
-/* ========================================================================== */
-/* === LSOLVE (4) =========================================================== */
-/* ========================================================================== */
-
-/* Solve Lx=b, where b has 4 columns */
-
-static void LSOLVE (PREFIX,4)
-(
-    cholmod_factor *L,
-    double X [ ][4]			    /* n-by-4 in row form */
-)
-{
-    double *Lx = L->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int j, n = L->n ;
-
-    for (j = 0 ; j < n ; )
-    {
-	/* get the start, end, and length of column j */
-	Int p = Lp [j] ;
-	Int lnz = Lnz [j] ;
-	Int pend = p + lnz ;
-
-	/* find a chain of supernodes (up to j, j+1, and j+2) */
-	if (lnz < 4 || lnz != Lnz [j+1] + 1 || Li [p+1] != j+1)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a single column of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [4] ;
-	    y [0] = X [j][0] ;
-	    y [1] = X [j][1] ;
-	    y [2] = X [j][2] ;
-	    y [3] = X [j][3] ;
-#ifdef LL
-	    y [0] /= Lx [p] ;
-	    y [1] /= Lx [p] ;
-	    y [2] /= Lx [p] ;
-	    y [3] /= Lx [p] ;
-	    X [j][0] = y [0] ;
-	    X [j][1] = y [1] ;
-	    X [j][2] = y [2] ;
-	    X [j][3] = y [3] ;
-#elif defined (LD)
-	    X [j][0] = y [0] / Lx [p] ;
-	    X [j][1] = y [1] / Lx [p] ;
-	    X [j][2] = y [2] / Lx [p] ;
-	    X [j][3] = y [3] / Lx [p] ;
-#endif
-	    for (p++ ; p < pend ; p++)
-	    {
-		Int i = Li [p] ;
-		double lx = Lx [p] ;
-		X [i][0] -= lx * y [0] ;
-		X [i][1] -= lx * y [1] ;
-		X [i][2] -= lx * y [2] ;
-		X [i][3] -= lx * y [3] ;
-	    }
-	    j++ ;	/* advance to next column of L */
-
-	}
-	else if (lnz != Lnz [j+2] + 2 || Li [p+2] != j+2)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of two columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2][4] ;
-	    Int q = Lp [j+1] ;
-	    y [0][0] = X [j][0] ;
-	    y [0][1] = X [j][1] ;
-	    y [0][2] = X [j][2] ;
-	    y [0][3] = X [j][3] ;
-#ifdef LL
-	    y [0][0] /= Lx [p] ;
-	    y [0][1] /= Lx [p] ;
-	    y [0][2] /= Lx [p] ;
-	    y [0][3] /= Lx [p] ;
-	    y [1][0] = (X [j+1][0] - Lx [p+1] * y [0][0]) / Lx [q] ;
-	    y [1][1] = (X [j+1][1] - Lx [p+1] * y [0][1]) / Lx [q] ;
-	    y [1][2] = (X [j+1][2] - Lx [p+1] * y [0][2]) / Lx [q] ;
-	    y [1][3] = (X [j+1][3] - Lx [p+1] * y [0][3]) / Lx [q] ;
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j  ][2] = y [0][2] ;
-	    X [j  ][3] = y [0][3] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+1][2] = y [1][2] ;
-	    X [j+1][3] = y [1][3] ;
-#elif defined (LD)
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
-	    y [1][3] = X [j+1][3] - Lx [p+1] * y [0][3] ;
-	    X [j  ][0] = y [0][0] / Lx [p] ;
-	    X [j  ][1] = y [0][1] / Lx [p] ;
-	    X [j  ][2] = y [0][2] / Lx [p] ;
-	    X [j  ][3] = y [0][3] / Lx [p] ;
-	    X [j+1][0] = y [1][0] / Lx [q] ;
-	    X [j+1][1] = y [1][1] / Lx [q] ;
-	    X [j+1][2] = y [1][2] / Lx [q] ;
-	    X [j+1][3] = y [1][3] / Lx [q] ;
-#else
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
-	    y [1][3] = X [j+1][3] - Lx [p+1] * y [0][3] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+1][2] = y [1][2] ;
-	    X [j+1][3] = y [1][3] ;
-#endif
-	    for (p += 2, q++ ; p < pend ; p++, q++)
-	    {
-		Int i = Li [p] ;
-		double lx [2] ;
-		lx [0] = Lx [p] ;
-		lx [1] = Lx [q] ;
-		X [i][0] -= lx [0] * y [0][0] + lx [1] * y [1][0] ;
-		X [i][1] -= lx [0] * y [0][1] + lx [1] * y [1][1] ;
-		X [i][2] -= lx [0] * y [0][2] + lx [1] * y [1][2] ;
-		X [i][3] -= lx [0] * y [0][3] + lx [1] * y [1][3] ;
-	    }
-	    j += 2 ;	    /* advance to next column of L */
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of three columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3][4] ;
-	    Int q = Lp [j+1] ;
-	    Int r = Lp [j+2] ;
-	    y [0][0] = X [j][0] ;
-	    y [0][1] = X [j][1] ;
-	    y [0][2] = X [j][2] ;
-	    y [0][3] = X [j][3] ;
-#ifdef LL
-	    y [0][0] /= Lx [p] ;
-	    y [0][1] /= Lx [p] ;
-	    y [0][2] /= Lx [p] ;
-	    y [0][3] /= Lx [p] ;
-	    y [1][0] = (X [j+1][0] - Lx[p+1] * y[0][0]) / Lx [q] ;
-	    y [1][1] = (X [j+1][1] - Lx[p+1] * y[0][1]) / Lx [q] ;
-	    y [1][2] = (X [j+1][2] - Lx[p+1] * y[0][2]) / Lx [q] ;
-	    y [1][3] = (X [j+1][3] - Lx[p+1] * y[0][3]) / Lx [q] ;
-	    y [2][0] = (X [j+2][0] - Lx[p+2] * y[0][0] - Lx[q+1]*y[1][0])/Lx[r];
-	    y [2][1] = (X [j+2][1] - Lx[p+2] * y[0][1] - Lx[q+1]*y[1][1])/Lx[r];
-	    y [2][2] = (X [j+2][2] - Lx[p+2] * y[0][2] - Lx[q+1]*y[1][2])/Lx[r];
-	    y [2][3] = (X [j+2][3] - Lx[p+2] * y[0][3] - Lx[q+1]*y[1][3])/Lx[r];
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j  ][2] = y [0][2] ;
-	    X [j  ][3] = y [0][3] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+1][2] = y [1][2] ;
-	    X [j+1][3] = y [1][3] ;
-	    X [j+2][0] = y [2][0] ;
-	    X [j+2][1] = y [2][1] ;
-	    X [j+2][2] = y [2][2] ;
-	    X [j+2][3] = y [2][3] ;
-#elif defined (LD)
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
-	    y [1][3] = X [j+1][3] - Lx [p+1] * y [0][3] ;
-	    y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
-	    y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
-	    y [2][2] = X [j+2][2] - Lx [p+2] * y [0][2] - Lx [q+1] * y [1][2] ;
-	    y [2][3] = X [j+2][3] - Lx [p+2] * y [0][3] - Lx [q+1] * y [1][3] ;
-	    X [j  ][0] = y [0][0] / Lx [p] ;
-	    X [j  ][1] = y [0][1] / Lx [p] ;
-	    X [j  ][2] = y [0][2] / Lx [p] ;
-	    X [j  ][3] = y [0][3] / Lx [p] ;
-	    X [j+1][0] = y [1][0] / Lx [q] ;
-	    X [j+1][1] = y [1][1] / Lx [q] ;
-	    X [j+1][2] = y [1][2] / Lx [q] ;
-	    X [j+1][3] = y [1][3] / Lx [q] ;
-	    X [j+2][0] = y [2][0] / Lx [r] ;
-	    X [j+2][1] = y [2][1] / Lx [r] ;
-	    X [j+2][2] = y [2][2] / Lx [r] ;
-	    X [j+2][3] = y [2][3] / Lx [r] ;
-#else
-	    y [1][0] = X [j+1][0] - Lx [p+1] * y [0][0] ;
-	    y [1][1] = X [j+1][1] - Lx [p+1] * y [0][1] ;
-	    y [1][2] = X [j+1][2] - Lx [p+1] * y [0][2] ;
-	    y [1][3] = X [j+1][3] - Lx [p+1] * y [0][3] ;
-	    y [2][0] = X [j+2][0] - Lx [p+2] * y [0][0] - Lx [q+1] * y [1][0] ;
-	    y [2][1] = X [j+2][1] - Lx [p+2] * y [0][1] - Lx [q+1] * y [1][1] ;
-	    y [2][2] = X [j+2][2] - Lx [p+2] * y [0][2] - Lx [q+1] * y [1][2] ;
-	    y [2][3] = X [j+2][3] - Lx [p+2] * y [0][3] - Lx [q+1] * y [1][3] ;
-	    X [j+1][0] = y [1][0] ;
-	    X [j+1][1] = y [1][1] ;
-	    X [j+1][2] = y [1][2] ;
-	    X [j+1][3] = y [1][3] ;
-	    X [j+2][0] = y [2][0] ;
-	    X [j+2][1] = y [2][1] ;
-	    X [j+2][2] = y [2][2] ;
-	    X [j+2][3] = y [2][3] ;
-#endif
-	    for (p += 3, q += 2, r++ ; p < pend ; p++, q++, r++)
-	    {
-		Int i = Li [p] ;
-		double lx [3] ;
-		lx [0] = Lx [p] ;
-		lx [1] = Lx [q] ;
-		lx [2] = Lx [r] ;
-		X [i][0] -= lx[0] * y[0][0] + lx[1] * y[1][0] + lx[2] * y[2][0];
-		X [i][1] -= lx[0] * y[0][1] + lx[1] * y[1][1] + lx[2] * y[2][1];
-		X [i][2] -= lx[0] * y[0][2] + lx[1] * y[1][2] + lx[2] * y[2][2];
-		X [i][3] -= lx[0] * y[0][3] + lx[1] * y[1][3] + lx[2] * y[2][3];
-	    }
-	    j += 3 ;	    /* advance to next column of L */
-	}
-    }
-}
-
-#endif
-
-
-/* ========================================================================== */
-/* === LSOLVE (k) =========================================================== */
-/* ========================================================================== */
-
-static void LSOLVE (PREFIX,k)
-(
-    cholmod_factor *L,
-    cholmod_dense *Y,		    /* nr-by-n where nr is 1 to 4 */
-    Int *Yseti, Int ysetlen
-)
-{
-
-    double yx [2] ;
-#ifdef ZOMPLEX
-    double yz [1] ;
-    double *Lz = L->z ;
-    double *Xz = Y->z ;
-#endif
-    double *Lx = L->x ;
-    double *Xx = Y->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int n = L->n, jj, jjiters ;
-
-    ASSERT (L->xtype == Y->xtype) ; /* L and Y must have the same xtype */
-    ASSERT (L->n == Y->ncol) ;	    /* dimensions must match */
-    ASSERT (Y->nrow == Y->d) ;	    /* leading dimension of Y = # rows of Y */
-    ASSERT (L->xtype != CHOLMOD_PATTERN) ;  /* L is not symbolic */
-    ASSERT (!(L->is_super)) ;	    /* L is simplicial LL' or LDL' */
-
-#ifdef REAL
-
-    if (Yseti == NULL)
-    {
-
-        /* ------------------------------------------------------------------ */
-        /* real case, no Yseti, with 1 to 4 RHS's and dynamic supernodes */
-        /* ------------------------------------------------------------------ */
-
-        ASSERT (Y->nrow <= 4) ;
-
-        switch (Y->nrow)
-        {
-            case 1: LSOLVE (PREFIX,1) (L, Y->x) ; break ;
-            case 2: LSOLVE (PREFIX,2) (L, Y->x) ; break ;
-            case 3: LSOLVE (PREFIX,3) (L, Y->x) ; break ;
-            case 4: LSOLVE (PREFIX,4) (L, Y->x) ; break ;
-        }
-
-    }
-    else
-#endif
-    {
-
-        /* ------------------------------------------------------------------ */
-        /* solve a complex linear system or solve with Yseti */
-        /* ------------------------------------------------------------------ */
-
-        ASSERT (Y->nrow == 1) ;
-
-        jjiters = Yseti ? ysetlen : n ;
-
-        for (jj = 0 ; jj < jjiters ; jj++)
-        {
-            Int j = Yseti ? Yseti [jj] : jj ;
-
-            /* get the start, end, and length of column j */
-            Int p = Lp [j] ;
-            Int lnz = Lnz [j] ;
-            Int pend = p + lnz ;
-
-            /* y = X [j] ; */
-            ASSIGN (yx,yz,0, Xx,Xz,j) ;
-
-#ifdef LL
-            /* y /= Lx [p] ; */
-            /* X [j] = y ; */
-            DIV_REAL (yx,yz,0, yx,yz,0, Lx,p) ;
-            ASSIGN (Xx,Xz,j, yx,yz,0) ;
-#elif defined (LD)
-            /* X [j] = y / Lx [p] ; */
-            DIV_REAL (Xx,Xz,j, yx,yz,0, Lx,p) ;
-#endif
-
-            for (p++ ; p < pend ; p++)
-            {
-                /* X [Li [p]] -= Lx [p] * y ; */
-                Int i = Li [p] ;
-                MULTSUB (Xx,Xz,i, Lx,Lz,p, yx,yz,0) ;
-            }
-        }
-    }
-}
-
-/* prepare for the next inclusion of this file in cholmod_solve.c */
-#undef LL
-#undef LD
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_ltsolve.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_ltsolve.c
deleted file mode 100644
index c04bbbb..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_ltsolve.c
+++ /dev/null
@@ -1,849 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/t_cholmod_ltsolve =========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2013, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Template routine to solve L'x=b with unit or non-unit diagonal, or
- * solve DL'x=b.
- *
- * The numeric xtype of L and Y must match.  Y contains b on input and x on
- * output, stored in row-form.  Y is nrow-by-n, where nrow must equal 1 for the 
- * complex or zomplex cases, and nrow <= 4 for the real case.
- *
- * This file is not compiled separately.  It is included in t_cholmod_solve.c
- * instead.  It contains no user-callable routines.
- *
- * workspace: none
- *
- * Supports real, complex, and zomplex factors.
- */
-
-/* undefine all prior definitions */
-#undef FORM_NAME
-#undef LSOLVE
-#undef DIAG
-
-/* -------------------------------------------------------------------------- */
-/* define the method */
-/* -------------------------------------------------------------------------- */
-
-#ifdef LL
-/* LL': solve Lx=b with non-unit diagonal */
-#define FORM_NAME(prefix,rank) prefix ## ll_ltsolve_ ## rank
-#define DIAG
-
-#elif defined (LD)
-/* LDL': solve LDx=b */
-#define FORM_NAME(prefix,rank) prefix ## ldl_dltsolve_ ## rank
-#define DIAG
-
-#else
-/* LDL': solve Lx=b with unit diagonal */
-#define FORM_NAME(prefix,rank) prefix ## ldl_ltsolve_ ## rank
-
-#endif
-
-/* LSOLVE(k) defines the name of a routine for an n-by-k right-hand-side. */
-#define LSOLVE(prefix,rank) FORM_NAME(prefix,rank)
-
-#ifdef REAL
-
-/* ========================================================================== */
-/* === LSOLVE (1) =========================================================== */
-/* ========================================================================== */
-
-/* Solve L'x=b, where b has 1 column  */
-
-static void LSOLVE (PREFIX,1)
-(
-    cholmod_factor *L,
-    double X [ ]                        /* n-by-1 in row form */
-)
-{
-    double *Lx = L->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int j, n = L->n ;
-
-    for (j = n-1 ; j >= 0 ; )
-    {
-	/* get the start, end, and length of column j */
-	Int p = Lp [j] ;
-	Int lnz = Lnz [j] ;
-	Int pend = p + lnz ;
-
-	/* find a chain of supernodes (up to j, j-1, and j-2) */
-	if (j < 4 || lnz != Lnz [j-1] - 1 || Li [Lp [j-1]+1] != j)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a single column of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y = X [j] ;
-#ifdef DIAG
-	    double d = Lx [p] ;
-#endif
-#ifdef LD
-	    y /= d ;
-#endif
-	    for (p++ ; p < pend ; p++)
-	    {
-		y -= Lx [p] * X [Li [p]] ;
-	    }
-#ifdef LL
-	    X [j] = y / d ;
-#else
-	    X [j] = y ;
-#endif
-	    j-- ;	/* advance to the next column of L */
-
-	}
-	else if (lnz != Lnz [j-2]-2 || Li [Lp [j-2]+2] != j)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of two columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2], t ;
-	    Int q = Lp [j-1] ;
-#ifdef DIAG
-	    double d [2] ;
-	    d [0] = Lx [p] ;
-	    d [1] = Lx [q] ;
-#endif
-	    t = Lx [q+1] ;
-#ifdef LD
-	    y [0] = X [j  ] / d [0] ;
-	    y [1] = X [j-1] / d [1] ;
-#else
-	    y [0] = X [j  ] ;
-	    y [1] = X [j-1] ;
-#endif
-	    for (p++, q += 2 ; p < pend ; p++, q++)
-	    {
-		Int i = Li [p] ;
-		y [0] -= Lx [p] * X [i] ;
-		y [1] -= Lx [q] * X [i] ;
-	    }
-#ifdef LL
-	    y [0] /= d [0] ;
-	    y [1] = (y [1] - t * y [0]) / d [1] ;
-#else
-	    y [1] -= t * y [0] ;
-#endif
-	    X [j  ] = y [0] ;
-	    X [j-1] = y [1] ;
-	    j -= 2 ;	    /* advance to the next column of L */
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of three columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3], t [3] ;
-	    Int q = Lp [j-1] ;
-	    Int r = Lp [j-2] ;
-#ifdef DIAG
-	    double d [3] ;
-	    d [0] = Lx [p] ;
-	    d [1] = Lx [q] ;
-	    d [2] = Lx [r] ;
-#endif
-	    t [0] = Lx [q+1] ;
-	    t [1] = Lx [r+1] ;
-	    t [2] = Lx [r+2] ;
-#ifdef LD
-	    y [0] = X [j]   / d [0] ;
-	    y [1] = X [j-1] / d [1] ;
-	    y [2] = X [j-2] / d [2] ;
-#else
-	    y [0] = X [j] ;
-	    y [1] = X [j-1] ;
-	    y [2] = X [j-2] ;
-#endif
-	    for (p++, q += 2, r += 3 ; p < pend ; p++, q++, r++)
-	    {
-		Int i = Li [p] ;
-		y [0] -= Lx [p] * X [i] ;
-		y [1] -= Lx [q] * X [i] ;
-		y [2] -= Lx [r] * X [i] ;
-	    }
-#ifdef LL
-	    y [0] /= d [0] ;
-	    y [1] = (y [1] - t [0] * y [0]) / d [1] ;
-	    y [2] = (y [2] - t [2] * y [0] - t [1] * y [1]) / d [2] ;
-#else
-	    y [1] -= t [0] * y [0] ;
-	    y [2] -= t [2] * y [0] + t [1] * y [1] ;
-#endif
-	    X [j-2] = y [2] ;
-	    X [j-1] = y [1] ;
-	    X [j  ] = y [0] ;
-	    j -= 3 ;	    /* advance to the next column of L */
-	}
-    }
-}
-
-
-/* ========================================================================== */
-/* === LSOLVE (2) =========================================================== */
-/* ========================================================================== */
-
-/* Solve L'x=b, where b has 2 columns */
-
-static void LSOLVE (PREFIX,2)
-(
-    cholmod_factor *L,
-    double X [ ][2]		    /* n-by-2 in row form */
-)
-{
-    double *Lx = L->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int j, n = L->n ;
-
-    for (j = n-1 ; j >= 0 ; )
-    {
-	/* get the start, end, and length of column j */
-	Int p = Lp [j] ;
-	Int lnz = Lnz [j] ;
-	Int pend = p + lnz ;
-
-	/* find a chain of supernodes (up to j, j-1, and j-2) */
-	if (j < 4 || lnz != Lnz [j-1] - 1 || Li [Lp [j-1]+1] != j)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a single column of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2] ;
-#ifdef DIAG
-	    double d = Lx [p] ;
-#endif
-#ifdef LD
-	    y [0] = X [j][0] / d ;
-	    y [1] = X [j][1] / d ;
-#else
-	    y [0] = X [j][0] ;
-	    y [1] = X [j][1] ;
-#endif
-	    for (p++ ; p < pend ; p++)
-	    {
-		Int i = Li [p] ;
-		y [0] -= Lx [p] * X [i][0] ;
-		y [1] -= Lx [p] * X [i][1] ;
-	    }
-#ifdef LL
-	    X [j][0] = y [0] / d ;
-	    X [j][1] = y [1] / d ;
-#else
-	    X [j][0] = y [0] ;
-	    X [j][1] = y [1] ;
-#endif
-	    j-- ;	/* advance to the next column of L */
-
-	}
-	else if (lnz != Lnz [j-2]-2 || Li [Lp [j-2]+2] != j)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of two columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2][2], t ;
-	    Int q = Lp [j-1] ;
-#ifdef DIAG
-	    double d [2] ;
-	    d [0] = Lx [p] ;
-	    d [1] = Lx [q] ;
-#endif
-	    t = Lx [q+1] ;
-#ifdef LD
-	    y [0][0] = X [j  ][0] / d [0] ;
-	    y [0][1] = X [j  ][1] / d [0] ;
-	    y [1][0] = X [j-1][0] / d [1] ;
-	    y [1][1] = X [j-1][1] / d [1] ;
-#else
-	    y [0][0] = X [j  ][0] ;
-	    y [0][1] = X [j  ][1] ;
-	    y [1][0] = X [j-1][0] ;
-	    y [1][1] = X [j-1][1] ;
-#endif
-	    for (p++, q += 2 ; p < pend ; p++, q++)
-	    {
-		Int i = Li [p] ;
-		y [0][0] -= Lx [p] * X [i][0] ;
-		y [0][1] -= Lx [p] * X [i][1] ;
-		y [1][0] -= Lx [q] * X [i][0] ;
-		y [1][1] -= Lx [q] * X [i][1] ;
-	    }
-#ifdef LL
-	    y [0][0] /= d [0] ;
-	    y [0][1] /= d [0] ;
-	    y [1][0] = (y [1][0] - t * y [0][0]) / d [1] ;
-	    y [1][1] = (y [1][1] - t * y [0][1]) / d [1] ;
-#else
-	    y [1][0] -= t * y [0][0] ;
-	    y [1][1] -= t * y [0][1] ;
-#endif
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j-1][0] = y [1][0] ;
-	    X [j-1][1] = y [1][1] ;
-	    j -= 2 ;	    /* advance to the next column of L */
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of three columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3][2], t [3] ;
-	    Int q = Lp [j-1] ;
-	    Int r = Lp [j-2] ;
-#ifdef DIAG
-	    double d [3] ; 
-	    d [0] = Lx [p] ;
-	    d [1] = Lx [q] ;
-	    d [2] = Lx [r] ;
-#endif
-	    t [0] = Lx [q+1] ;
-	    t [1] = Lx [r+1] ;
-	    t [2] = Lx [r+2] ;
-#ifdef LD
-	    y [0][0] = X [j  ][0] / d [0] ;
-	    y [0][1] = X [j  ][1] / d [0] ;
-	    y [1][0] = X [j-1][0] / d [1] ;
-	    y [1][1] = X [j-1][1] / d [1] ;
-	    y [2][0] = X [j-2][0] / d [2] ;
-	    y [2][1] = X [j-2][1] / d [2] ;
-#else
-	    y [0][0] = X [j  ][0] ;
-	    y [0][1] = X [j  ][1] ;
-	    y [1][0] = X [j-1][0] ;
-	    y [1][1] = X [j-1][1] ;
-	    y [2][0] = X [j-2][0] ;
-	    y [2][1] = X [j-2][1] ;
-#endif
-	    for (p++, q += 2, r += 3 ; p < pend ; p++, q++, r++)
-	    {
-		Int i = Li [p] ;
-		y [0][0] -= Lx [p] * X [i][0] ;
-		y [0][1] -= Lx [p] * X [i][1] ;
-		y [1][0] -= Lx [q] * X [i][0] ;
-		y [1][1] -= Lx [q] * X [i][1] ;
-		y [2][0] -= Lx [r] * X [i][0] ;
-		y [2][1] -= Lx [r] * X [i][1] ;
-	    }
-#ifdef LL
-	    y [0][0] /= d [0] ;
-	    y [0][1] /= d [0] ;
-	    y [1][0] = (y [1][0] - t [0] * y [0][0]) / d [1] ;
-	    y [1][1] = (y [1][1] - t [0] * y [0][1]) / d [1] ;
-	    y [2][0] = (y [2][0] - t [2] * y [0][0] - t [1] * y [1][0]) / d [2];
-	    y [2][1] = (y [2][1] - t [2] * y [0][1] - t [1] * y [1][1]) / d [2];
-#else
-	    y [1][0] -= t [0] * y [0][0] ;
-	    y [1][1] -= t [0] * y [0][1] ;
-	    y [2][0] -= t [2] * y [0][0] + t [1] * y [1][0] ;
-	    y [2][1] -= t [2] * y [0][1] + t [1] * y [1][1] ;
-#endif
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j-1][0] = y [1][0] ;
-	    X [j-1][1] = y [1][1] ;
-	    X [j-2][0] = y [2][0] ;
-	    X [j-2][1] = y [2][1] ;
-	    j -= 3 ;	    /* advance to the next column of L */
-	}
-    }
-}
-
-
-/* ========================================================================== */
-/* === LSOLVE (3) =========================================================== */
-/* ========================================================================== */
-
-/* Solve L'x=b, where b has 3 columns */
-
-static void LSOLVE (PREFIX,3)
-(
-    cholmod_factor *L,
-    double X [ ][3]		    /* n-by-3 in row form */
-)
-{
-    double *Lx = L->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int j, n = L->n ;
-
-    for (j = n-1 ; j >= 0 ; )
-    {
-	/* get the start, end, and length of column j */
-	Int p = Lp [j] ;
-	Int lnz = Lnz [j] ;
-	Int pend = p + lnz ;
-
-	/* find a chain of supernodes (up to j, j-1, and j-2) */
-	if (j < 4 || lnz != Lnz [j-1] - 1 || Li [Lp [j-1]+1] != j)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a single column of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3] ;
-#ifdef DIAG
-	    double d = Lx [p] ;
-#endif
-#ifdef LD
-	    y [0] = X [j][0] / d ;
-	    y [1] = X [j][1] / d ;
-	    y [2] = X [j][2] / d ;
-#else
-	    y [0] = X [j][0] ;
-	    y [1] = X [j][1] ;
-	    y [2] = X [j][2] ;
-#endif
-	    for (p++ ; p < pend ; p++)
-	    {
-		Int i = Li [p] ;
-		y [0] -= Lx [p] * X [i][0] ;
-		y [1] -= Lx [p] * X [i][1] ;
-		y [2] -= Lx [p] * X [i][2] ;
-	    }
-#ifdef LL
-	    X [j][0] = y [0] / d ;
-	    X [j][1] = y [1] / d ;
-	    X [j][2] = y [2] / d ;
-#else
-	    X [j][0] = y [0] ;
-	    X [j][1] = y [1] ;
-	    X [j][2] = y [2] ;
-#endif
-	    j-- ;	/* advance to the next column of L */
-
-	}
-	else if (lnz != Lnz [j-2]-2 || Li [Lp [j-2]+2] != j)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of two columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2][3], t ;
-	    Int q = Lp [j-1] ;
-#ifdef DIAG
-	    double d [2] ;
-	    d [0] = Lx [p] ;
-	    d [1] = Lx [q] ;
-#endif
-	    t = Lx [q+1] ;
-#ifdef LD
-	    y [0][0] = X [j  ][0] / d [0] ;
-	    y [0][1] = X [j  ][1] / d [0] ;
-	    y [0][2] = X [j  ][2] / d [0] ;
-	    y [1][0] = X [j-1][0] / d [1] ;
-	    y [1][1] = X [j-1][1] / d [1] ;
-	    y [1][2] = X [j-1][2] / d [1] ;
-#else
-	    y [0][0] = X [j  ][0] ;
-	    y [0][1] = X [j  ][1] ;
-	    y [0][2] = X [j  ][2] ;
-	    y [1][0] = X [j-1][0] ;
-	    y [1][1] = X [j-1][1] ;
-	    y [1][2] = X [j-1][2] ;
-#endif
-	    for (p++, q += 2 ; p < pend ; p++, q++)
-	    {
-		Int i = Li [p] ;
-		y [0][0] -= Lx [p] * X [i][0] ;
-		y [0][1] -= Lx [p] * X [i][1] ;
-		y [0][2] -= Lx [p] * X [i][2] ;
-		y [1][0] -= Lx [q] * X [i][0] ;
-		y [1][1] -= Lx [q] * X [i][1] ;
-		y [1][2] -= Lx [q] * X [i][2] ;
-	    }
-#ifdef LL
-	    y [0][0] /= d [0] ;
-	    y [0][1] /= d [0] ;
-	    y [0][2] /= d [0] ;
-	    y [1][0] = (y [1][0] - t * y [0][0]) / d [1] ;
-	    y [1][1] = (y [1][1] - t * y [0][1]) / d [1] ;
-	    y [1][2] = (y [1][2] - t * y [0][2]) / d [1] ;
-#else
-	    y [1][0] -= t * y [0][0] ;
-	    y [1][1] -= t * y [0][1] ;
-	    y [1][2] -= t * y [0][2] ;
-#endif
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j  ][2] = y [0][2] ;
-	    X [j-1][0] = y [1][0] ;
-	    X [j-1][1] = y [1][1] ;
-	    X [j-1][2] = y [1][2] ;
-	    j -= 2 ;	    /* advance to the next column of L */
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of three columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [3][3], t [3] ;
-	    Int q = Lp [j-1] ;
-	    Int r = Lp [j-2] ;
-#ifdef DIAG
-	    double d [3] ;
-	    d [0] = Lx [p] ;
-	    d [1] = Lx [q] ;
-	    d [2] = Lx [r] ;
-#endif
-	    t [0] = Lx [q+1] ;
-	    t [1] = Lx [r+1] ;
-	    t [2] = Lx [r+2] ;
-#ifdef LD
-	    y [0][0] = X [j  ][0] / d [0] ;
-	    y [0][1] = X [j  ][1] / d [0] ;
-	    y [0][2] = X [j  ][2] / d [0] ;
-	    y [1][0] = X [j-1][0] / d [1] ;
-	    y [1][1] = X [j-1][1] / d [1] ;
-	    y [1][2] = X [j-1][2] / d [1] ;
-	    y [2][0] = X [j-2][0] / d [2] ;
-	    y [2][1] = X [j-2][1] / d [2] ;
-	    y [2][2] = X [j-2][2] / d [2] ;
-#else
-	    y [0][0] = X [j  ][0] ;
-	    y [0][1] = X [j  ][1] ;
-	    y [0][2] = X [j  ][2] ;
-	    y [1][0] = X [j-1][0] ;
-	    y [1][1] = X [j-1][1] ;
-	    y [1][2] = X [j-1][2] ;
-	    y [2][0] = X [j-2][0] ;
-	    y [2][1] = X [j-2][1] ;
-	    y [2][2] = X [j-2][2] ;
-#endif
-	    for (p++, q += 2, r += 3 ; p < pend ; p++, q++, r++)
-	    {
-		Int i = Li [p] ;
-		y [0][0] -= Lx [p] * X [i][0] ;
-		y [0][1] -= Lx [p] * X [i][1] ;
-		y [0][2] -= Lx [p] * X [i][2] ;
-		y [1][0] -= Lx [q] * X [i][0] ;
-		y [1][1] -= Lx [q] * X [i][1] ;
-		y [1][2] -= Lx [q] * X [i][2] ;
-		y [2][0] -= Lx [r] * X [i][0] ;
-		y [2][1] -= Lx [r] * X [i][1] ;
-		y [2][2] -= Lx [r] * X [i][2] ;
-	    }
-#ifdef LL
-	    y [0][0] /= d [0] ;
-	    y [0][1] /= d [0] ;
-	    y [0][2] /= d [0] ;
-	    y [1][0] = (y [1][0] - t [0] * y [0][0]) / d [1] ;
-	    y [1][1] = (y [1][1] - t [0] * y [0][1]) / d [1] ;
-	    y [1][2] = (y [1][2] - t [0] * y [0][2]) / d [1] ;
-	    y [2][0] = (y [2][0] - t [2] * y [0][0] - t [1] * y [1][0]) / d [2];
-	    y [2][1] = (y [2][1] - t [2] * y [0][1] - t [1] * y [1][1]) / d [2];
-	    y [2][2] = (y [2][2] - t [2] * y [0][2] - t [1] * y [1][2]) / d [2];
-#else
-	    y [1][0] -= t [0] * y [0][0] ;
-	    y [1][1] -= t [0] * y [0][1] ;
-	    y [1][2] -= t [0] * y [0][2] ;
-	    y [2][0] -= t [2] * y [0][0] + t [1] * y [1][0] ;
-	    y [2][1] -= t [2] * y [0][1] + t [1] * y [1][1] ;
-	    y [2][2] -= t [2] * y [0][2] + t [1] * y [1][2] ;
-#endif
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j  ][2] = y [0][2] ;
-	    X [j-1][0] = y [1][0] ;
-	    X [j-1][1] = y [1][1] ;
-	    X [j-1][2] = y [1][2] ;
-	    X [j-2][0] = y [2][0] ;
-	    X [j-2][1] = y [2][1] ;
-	    X [j-2][2] = y [2][2] ;
-	    j -= 3 ;	    /* advance to the next column of L */
-	}
-    }
-}
-
-
-/* ========================================================================== */
-/* === LSOLVE (4) =========================================================== */
-/* ========================================================================== */
-
-/* Solve L'x=b, where b has 4 columns */
-
-static void LSOLVE (PREFIX,4)
-(
-    cholmod_factor *L,
-    double X [ ][4]		    /* n-by-4 in row form */
-)
-{
-    double *Lx = L->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int j, n = L->n ;
-
-    for (j = n-1 ; j >= 0 ; )
-    {
-	/* get the start, end, and length of column j */
-	Int p = Lp [j] ;
-	Int lnz = Lnz [j] ;
-	Int pend = p + lnz ;
-
-	/* find a chain of supernodes (up to j, j-1, and j-2) */
-	if (j < 4 || lnz != Lnz [j-1] - 1 || Li [Lp [j-1]+1] != j)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a single column of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [4] ;
-#ifdef DIAG
-	    double d = Lx [p] ;
-#endif
-#ifdef LD
-	    y [0] = X [j][0] / d ;
-	    y [1] = X [j][1] / d ;
-	    y [2] = X [j][2] / d ;
-	    y [3] = X [j][3] / d ;
-#else
-	    y [0] = X [j][0] ;
-	    y [1] = X [j][1] ;
-	    y [2] = X [j][2] ;
-	    y [3] = X [j][3] ;
-#endif
-	    for (p++ ; p < pend ; p++)
-	    {
-		Int i = Li [p] ;
-		y [0] -= Lx [p] * X [i][0] ;
-		y [1] -= Lx [p] * X [i][1] ;
-		y [2] -= Lx [p] * X [i][2] ;
-		y [3] -= Lx [p] * X [i][3] ;
-	    }
-#ifdef LL
-	    X [j][0] = y [0] / d ;
-	    X [j][1] = y [1] / d ;
-	    X [j][2] = y [2] / d ;
-	    X [j][3] = y [3] / d ;
-#else
-	    X [j][0] = y [0] ;
-	    X [j][1] = y [1] ;
-	    X [j][2] = y [2] ;
-	    X [j][3] = y [3] ;
-#endif
-	    j-- ;	/* advance to the next column of L */
-
-	}
-	else /* if (j == 1 || lnz != Lnz [j-2]-2 || Li [Lp [j-2]+2] != j) */
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* solve with a supernode of two columns of L */
-	    /* -------------------------------------------------------------- */
-
-	    double y [2][4], t ;
-	    Int q = Lp [j-1] ;
-#ifdef DIAG
-	    double d [2] ;
-	    d [0] = Lx [p] ;
-	    d [1] = Lx [q] ;
-#endif
-	    t = Lx [q+1] ;
-#ifdef LD
-	    y [0][0] = X [j  ][0] / d [0] ;
-	    y [0][1] = X [j  ][1] / d [0] ;
-	    y [0][2] = X [j  ][2] / d [0] ;
-	    y [0][3] = X [j  ][3] / d [0] ;
-	    y [1][0] = X [j-1][0] / d [1] ;
-	    y [1][1] = X [j-1][1] / d [1] ;
-	    y [1][2] = X [j-1][2] / d [1] ;
-	    y [1][3] = X [j-1][3] / d [1] ;
-#else
-	    y [0][0] = X [j  ][0] ;
-	    y [0][1] = X [j  ][1] ;
-	    y [0][2] = X [j  ][2] ;
-	    y [0][3] = X [j  ][3] ;
-	    y [1][0] = X [j-1][0] ;
-	    y [1][1] = X [j-1][1] ;
-	    y [1][2] = X [j-1][2] ;
-	    y [1][3] = X [j-1][3] ;
-#endif
-	    for (p++, q += 2 ; p < pend ; p++, q++)
-	    {
-		Int i = Li [p] ;
-		y [0][0] -= Lx [p] * X [i][0] ;
-		y [0][1] -= Lx [p] * X [i][1] ;
-		y [0][2] -= Lx [p] * X [i][2] ;
-		y [0][3] -= Lx [p] * X [i][3] ;
-		y [1][0] -= Lx [q] * X [i][0] ;
-		y [1][1] -= Lx [q] * X [i][1] ;
-		y [1][2] -= Lx [q] * X [i][2] ;
-		y [1][3] -= Lx [q] * X [i][3] ;
-	    }
-#ifdef LL
-	    y [0][0] /= d [0] ;
-	    y [0][1] /= d [0] ;
-	    y [0][2] /= d [0] ;
-	    y [0][3] /= d [0] ;
-	    y [1][0] = (y [1][0] - t * y [0][0]) / d [1] ;
-	    y [1][1] = (y [1][1] - t * y [0][1]) / d [1] ;
-	    y [1][2] = (y [1][2] - t * y [0][2]) / d [1] ;
-	    y [1][3] = (y [1][3] - t * y [0][3]) / d [1] ;
-#else
-	    y [1][0] -= t * y [0][0] ;
-	    y [1][1] -= t * y [0][1] ;
-	    y [1][2] -= t * y [0][2] ;
-	    y [1][3] -= t * y [0][3] ;
-#endif
-	    X [j  ][0] = y [0][0] ;
-	    X [j  ][1] = y [0][1] ;
-	    X [j  ][2] = y [0][2] ;
-	    X [j  ][3] = y [0][3] ;
-	    X [j-1][0] = y [1][0] ;
-	    X [j-1][1] = y [1][1] ;
-	    X [j-1][2] = y [1][2] ;
-	    X [j-1][3] = y [1][3] ;
-	    j -= 2 ;	    /* advance to the next column of L */
-	}
-
-	/* NOTE: with 4 right-hand-sides, it suffices to exploit dynamic
-	 * supernodes of just size 1 and 2.  3-column supernodes are not
-	 * needed. */
-    }
-}
-
-#endif
-
-/* ========================================================================== */
-/* === LSOLVE (k) =========================================================== */
-/* ========================================================================== */
-
-static void LSOLVE (PREFIX,k)
-(
-    cholmod_factor *L,
-    cholmod_dense *Y,		    /* nr-by-n where nr is 1 to 4 */
-    Int *Yseti, Int ysetlen
-)
-{
-
-#ifdef DIAG
-    double d [1] ;
-#endif
-    double yx [2] ;
-#ifdef ZOMPLEX
-    double yz [1] ;
-    double *Lz = L->z ;
-    double *Xz = Y->z ;
-#endif
-    double *Lx = L->x ;
-    double *Xx = Y->x ;
-    Int *Li = L->i ;
-    Int *Lp = L->p ;
-    Int *Lnz = L->nz ;
-    Int n = L->n, jj, jjiters ;
-
-    ASSERT (L->xtype == Y->xtype) ; /* L and Y must have the same xtype */
-    ASSERT (L->n == Y->ncol) ;	    /* dimensions must match */
-    ASSERT (Y->nrow == Y->d) ;	    /* leading dimension of Y = # rows of Y */
-    ASSERT (L->xtype != CHOLMOD_PATTERN) ;  /* L is not symbolic */
-    ASSERT (!(L->is_super)) ;	    /* L is simplicial LL' or LDL' */
-
-#ifdef REAL
-
-    if (Yseti == NULL)
-    {
-
-        /* ------------------------------------------------------------------ */
-        /* real case, no Yseti, with 1 to 4 RHS's and dynamic supernodes */
-        /* ------------------------------------------------------------------ */
-
-        ASSERT (Y->nrow <= 4) ;
-        switch (Y->nrow)
-        {
-            case 1: LSOLVE (PREFIX,1) (L, Y->x) ; break ;
-            case 2: LSOLVE (PREFIX,2) (L, Y->x) ; break ;
-            case 3: LSOLVE (PREFIX,3) (L, Y->x) ; break ;
-            case 4: LSOLVE (PREFIX,4) (L, Y->x) ; break ;
-        }
-
-    }
-    else
-#endif
-    {
-
-        /* ------------------------------------------------------------------ */
-        /* solve a complex linear system or solve with Yseti */
-        /* ------------------------------------------------------------------ */
-
-        ASSERT (Y->nrow == 1) ;
-
-        jjiters = Yseti ? ysetlen : n ;
-
-        for (jj = jjiters-1 ; jj >= 0 ; jj--)
-        {
-
-            Int j = Yseti ? Yseti [jj] : jj ;
-
-            /* get the start, end, and length of column j */
-            Int p = Lp [j] ;
-            Int lnz = Lnz [j] ;
-            Int pend = p + lnz ;
-
-            /* y = X [j] ; */
-            ASSIGN (yx,yz,0, Xx,Xz,j) ;
-
-#ifdef DIAG
-            /* d = Lx [p] ; */
-            ASSIGN_REAL (d,0, Lx,p) ;
-#endif
-#ifdef LD
-            /* y /= d ; */
-            DIV_REAL (yx,yz,0, yx,yz,0, d,0) ;
-#endif
-
-            for (p++ ; p < pend ; p++)
-            {
-                /* y -= conj (Lx [p]) * X [Li [p]] ; */
-                Int i = Li [p] ;
-                MULTSUBCONJ (yx,yz,0, Lx,Lz,p, Xx,Xz,i) ;
-            }
-
-#ifdef LL
-            /* X [j] = y / d ; */
-            DIV_REAL (Xx,Xz,j, yx,yz,0, d,0) ;
-#else
-            /* X [j] = y ; */
-            ASSIGN (Xx,Xz,j, yx,yz,0) ;
-#endif
-
-        }
-    }
-}
-
-/* prepare for the next inclusion of this file in cholmod_solve.c */
-#undef LL
-#undef LD
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_rowfac.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_rowfac.c
deleted file mode 100644
index 63b8442..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_rowfac.c
+++ /dev/null
@@ -1,459 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/t_cholmod_rowfac ============================================ */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_rowfac.  Supports any numeric xtype
- * (real, complex, or zomplex).
- *
- * workspace: Iwork (n), Flag (n), Xwork (n if real, 2*n if complex)
- */
-
-#include "cholmod_template.h"
-
-#ifdef MASK
-static int TEMPLATE (cholmod_rowfac_mask)
-#else
-static int TEMPLATE (cholmod_rowfac)
-#endif
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,f)' */
-    double beta [2],	/* factorize beta*I+A or beta*I+AA' (beta [0] only) */
-    size_t kstart,	/* first row to factorize */
-    size_t kend,	/* last row to factorize is kend-1 */
-#ifdef MASK
-    /* These inputs are used for cholmod_rowfac_mask only */
-    Int *mask,		/* size A->nrow. if mask[i] >= maskmark
-                           then W(i) is set to zero */
-    Int maskmark,
-    Int *RLinkUp,	/* size A->nrow. link list of rows to compute */
-#endif
-    /* ---- in/out --- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double yx [2], lx [2], fx [2], dk [1], di [1], fl = 0 ;
-#ifdef ZOMPLEX
-    double yz [1], lz [1], fz [1] ;
-#endif
-    double *Ax, *Az, *Lx, *Lz, *Wx, *Wz, *Fx, *Fz ;
-    Int *Ap, *Anz, *Ai, *Lp, *Lnz, *Li, *Lnext, *Flag, *Stack, *Fp, *Fi, *Fnz,
-	*Iwork ;
-    Int i, p, k, t, pf, pfend, top, s, mark, pend, n, lnz, is_ll, multadds,
-	use_dbound, packed, stype, Fpacked, sorted, nzmax, len, parent ;
-#ifndef REAL
-    Int dk_imaginary ;
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    PRINT1 (("\nin cholmod_rowfac, kstart %d kend %d stype %d\n",
-		kstart, kend, A->stype)) ;
-    DEBUG (CHOLMOD(dump_factor) (L, "Initial L", Common)) ;
-
-    n = A->nrow ;
-    stype = A->stype ;
-
-    if (stype > 0)
-    {
-	/* symmetric upper case: F is not needed.  It may be NULL */
-	Fp = NULL ;
-	Fi = NULL ;
-	Fx = NULL ;
-	Fz = NULL ;
-	Fnz = NULL ;
-	Fpacked = TRUE ;
-    }
-    else
-    {
-	/* unsymmetric case: F is required. */
-	Fp = F->p ;
-	Fi = F->i ;
-	Fx = F->x ;
-	Fz = F->z ;
-	Fnz = F->nz ;
-	Fpacked = F->packed ;
-    }
-
-    Ap = A->p ;		/* size A->ncol+1, column pointers of A */
-    Ai = A->i ;		/* size nz = Ap [A->ncol], row indices of A */
-    Ax = A->x ;		/* size nz, numeric values of A */
-    Az = A->z ;
-    Anz = A->nz ;
-    packed = A->packed ;
-    sorted = A->sorted ;
-
-    use_dbound = IS_GT_ZERO (Common->dbound) ;
-
-    /* get the current factors L (and D for LDL'); allocate space if needed */
-    is_ll = L->is_ll ;
-    if (L->xtype == CHOLMOD_PATTERN)
-    {
-	/* ------------------------------------------------------------------ */
-	/* L is symbolic only; allocate and initialize L (and D for LDL') */
-	/* ------------------------------------------------------------------ */
-
-	/* workspace: none */
-	CHOLMOD(change_factor) (A->xtype, is_ll, FALSE, FALSE, TRUE, L, Common);
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    return (FALSE) ;
-	}
-	ASSERT (L->minor == (size_t) n) ;
-    }
-    else if (kstart == 0 && kend == (size_t) n)
-    {
-	/* ------------------------------------------------------------------ */
-	/* refactorization; reset L->nz and L->minor to restart factorization */
-	/* ------------------------------------------------------------------ */
-
-	L->minor = n ;
-	Lnz = L->nz ;
-	for (k = 0 ; k < n ; k++)
-	{
-	    Lnz [k] = 1 ;
-	}
-    }
-
-    ASSERT (is_ll == L->is_ll) ;
-    ASSERT (L->xtype != CHOLMOD_PATTERN) ;
-    DEBUG (CHOLMOD(dump_factor) (L, "L ready", Common)) ;
-    DEBUG (CHOLMOD(dump_sparse) (A, "A ready", Common)) ;
-    DEBUG (if (stype == 0) CHOLMOD(dump_sparse) (F, "F ready", Common)) ;
-
-    /* inputs, can be modified on output: */
-    Lp = L->p ;		/* size n+1 */
-    ASSERT (Lp != NULL) ;
-
-    /* outputs, contents defined on input for incremental case only: */
-    Lnz = L->nz ;	/* size n */
-    Lnext = L->next ;	/* size n+2 */
-    Li = L->i ;		/* size L->nzmax, can change in size */
-    Lx = L->x ;		/* size L->nzmax or 2*L->nzmax, can change in size */
-    Lz = L->z ;		/* size L->nzmax for zomplex case, can change in size */
-    nzmax = L->nzmax ;
-    ASSERT (Lnz != NULL && Li != NULL && Lx != NULL) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Iwork = Common->Iwork ;
-    Stack = Iwork ;		/* size n (i/i/l) */
-    Flag = Common->Flag ;	/* size n, Flag [i] < mark must hold */
-    Wx = Common->Xwork ;	/* size n if real, 2*n if complex or 
-				 * zomplex.  Xwork [i] == 0 must hold. */
-    Wz = Wx + n ;		/* size n for zomplex case only */
-    mark = Common->mark ;
-    ASSERT ((Int) Common->xworksize >= (L->xtype == CHOLMOD_REAL ? 1:2)*n) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* compute LDL' or LL' factorization by rows */
-    /* ---------------------------------------------------------------------- */
-
-#ifdef MASK
-#define NEXT(k) k = RLinkUp [k]
-#else
-#define NEXT(k) k++
-#endif
-
-    for (k = kstart ; k < ((Int) kend) ; NEXT(k))
-    {
-	PRINT1 (("\n===============K "ID" Lnz [k] "ID"\n", k, Lnz [k])) ;
-
-	/* ------------------------------------------------------------------ */
-	/* compute pattern of kth row of L and scatter kth input column */
-	/* ------------------------------------------------------------------ */
-
-	/* column k of L is currently empty */
-	ASSERT (Lnz [k] == 1) ;
-	ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 2*n, Common)) ;
-
-	top = n ;		/* Stack is empty */
-	Flag [k] = mark ;	/* do not include diagonal entry in Stack */
-
-	/* use Li [Lp [i]+1] for etree */
-#define PARENT(i) (Lnz [i] > 1) ? (Li [Lp [i] + 1]) : EMPTY
-
-	if (stype > 0)
-	{
-	    /* scatter kth col of triu (beta*I+AA'), get pattern L(k,:) */
-	    p = Ap [k] ;
-	    pend = (packed) ? (Ap [k+1]) : (p + Anz [k]) ;
-	    /* W [i] = Ax [i] ; scatter column of A */
-#define SCATTER ASSIGN(Wx,Wz,i, Ax,Az,p)
-	    SUBTREE ;
-#undef SCATTER
-	}
-	else
-	{
-	    /* scatter kth col of triu (beta*I+AA'), get pattern L(k,:) */
-	    pf = Fp [k] ;
-	    pfend = (Fpacked) ? (Fp [k+1]) : (pf + Fnz [k]) ;
-	    for ( ; pf < pfend ; pf++)
-	    {
-		/* get nonzero entry F (t,k) */
-		t = Fi [pf] ;
-		/* fk = Fx [pf] */
-		ASSIGN (fx, fz, 0, Fx, Fz, pf) ;
-		p = Ap [t] ;
-		pend = (packed) ? (Ap [t+1]) : (p + Anz [t]) ;
-		multadds = 0 ;
-		/* W [i] += Ax [p] * fx ; scatter column of A*A' */
-#define SCATTER MULTADD (Wx,Wz,i, Ax,Az,p, fx,fz,0) ; multadds++  ;
-		SUBTREE ;
-#undef SCATTER
-#ifdef REAL
-		fl += 2 * ((double) multadds) ;
-#else
-		fl += 8 * ((double) multadds) ;
-#endif
-	    }
-	}
-
-#undef PARENT
-
-	/* ------------------------------------------------------------------ */
-	/* if mask is present, set the corresponding entries in W to zero */
-	/* ------------------------------------------------------------------ */
-
-#ifdef MASK
-        /* remove the dead element of Wx */
-        if (mask != NULL)
-        {
-
-#if 0
-	    /* older version */
-            for (p = n; p > top;)
-            {
-                i = Stack [--p] ;
-                if ( mask [i] >= 0 )
-		{
-		    CLEAR (Wx,Wz,i) ;	/* set W(i) to zero */
-		}
-            }
-#endif
-
-            for (s = top ; s < n ; s++)
-            {
-                i = Stack [s] ;
-                if (mask [i] >= maskmark)
-		{
-		    CLEAR (Wx,Wz,i) ;	/* set W(i) to zero */
-		}
-            }
-
-        }
-#endif
-
-	/* nonzero pattern of kth row of L is now in Stack [top..n-1].
-	 * Flag [Stack [top..n-1]] is equal to mark, but no longer needed */
-
-	/* mark = CHOLMOD(clear_flag) (Common) ; */
-	CHOLMOD_CLEAR_FLAG (Common) ;
-	mark = Common->mark ;
-
-	/* ------------------------------------------------------------------ */
-	/* compute kth row of L and store in column form */
-	/* ------------------------------------------------------------------ */
-
-	/* Solve L (0:k-1, 0:k-1) * y (0:k-1) = b (0:k-1) where
-	 * b (0:k) = A (0:k,k) or A(0:k,:) * F(:,k) is in W and Stack.
-	 *
-	 * For LDL' factorization:
-	 * L (k, 0:k-1) = y (0:k-1) ./ D (0:k-1)
-	 * D (k) = b (k) - L (k, 0:k-1) * y (0:k-1)
-	 *
-	 * For LL' factorization:
-	 * L (k, 0:k-1) = y (0:k-1)
-	 * L (k,k) = sqrt (b (k) - L (k, 0:k-1) * L (0:k-1, k))
-	 */
-
-	/* dk = W [k] + beta */
-	ADD_REAL (dk,0, Wx,k, beta,0) ;
-
-#ifndef REAL
-	/* In the unsymmetric case, the imaginary part of W[k] must be real,
-	 * since F is assumed to be the complex conjugate transpose of A.  In
-	 * the symmetric case, W[k] is the diagonal of A.  If the imaginary part
-	 * of W[k] is nonzero, then the Cholesky factorization cannot be
-	 * computed; A is not positive definite */
-	dk_imaginary = (stype > 0) ? (IMAG_IS_NONZERO (Wx,Wz,k)) : FALSE ;
-#endif
-
-	/* W [k] = 0.0 ; */
-	CLEAR (Wx,Wz,k) ;
-
-	for (s = top ; s < n ; s++)
-	{
-	    /* get i for each nonzero entry L(k,i) */
-	    i = Stack [s] ;
-
-	    /* y = W [i] ; */
-	    ASSIGN (yx,yz,0, Wx,Wz,i) ;
-
-	    /* W [i] = 0.0 ; */
-	    CLEAR (Wx,Wz,i) ;
-
-	    lnz = Lnz [i] ;
-	    p = Lp [i] ;
-	    ASSERT (lnz > 0 && Li [p] == i) ;
-	    pend = p + lnz ;
-
-	    /* di = Lx [p] ; the diagonal entry L or D(i,i), which is real */
-	    ASSIGN_REAL (di,0, Lx,p) ;
-
-	    if (i >= (Int) L->minor || IS_ZERO (di [0]))
-	    {
-		/* For the LL' factorization, L(i,i) is zero.  For the LDL',
-		 * D(i,i) is zero.  Skip column i of L, and set L(k,i) = 0. */
-		CLEAR (lx,lz,0) ;
-		p = pend ;
-	    }
-	    else if (is_ll)
-	    {
-#ifdef REAL
-		fl += 2 * ((double) (pend - p - 1)) + 3 ;
-#else
-		fl += 8 * ((double) (pend - p - 1)) + 6 ;
-#endif
-		/* forward solve using L (i:(k-1),i) */
-		/* divide by L(i,i), which must be real and nonzero */
-		/* y /= di [0] */
-		DIV_REAL (yx,yz,0, yx,yz,0, di,0) ;
-		for (p++ ; p < pend ; p++)
-		{
-		    /* W [Li [p]] -= Lx [p] * y ; */
-		    MULTSUB (Wx,Wz,Li[p], Lx,Lz,p, yx,yz,0) ;
-		}
-		/* do not scale L; compute dot product for L(k,k) */
-		/* L(k,i) = conj(y) ; */
-		ASSIGN_CONJ (lx,lz,0, yx,yz,0) ;
-		/* d -= conj(y) * y ; */
-		LLDOT (dk,0, yx,yz,0) ;
-	    }
-	    else
-	    {
-#ifdef REAL
-		fl += 2 * ((double) (pend - p - 1)) + 3 ;
-#else
-		fl += 8 * ((double) (pend - p - 1)) + 6 ;
-#endif
-		/* forward solve using D (i,i) and L ((i+1):(k-1),i) */
-		for (p++ ; p < pend ; p++)
-		{
-		    /* W [Li [p]] -= Lx [p] * y ; */
-		    MULTSUB (Wx,Wz,Li[p], Lx,Lz,p, yx,yz,0) ;
-		}
-		/* Scale L (k,0:k-1) for LDL' factorization, compute D (k,k)*/
-#ifdef REAL
-		/* L(k,i) = y/d */
-		lx [0] = yx [0] / di [0] ;
-		/* d -= L(k,i) * y */
-		dk [0] -= lx [0] * yx [0] ;
-#else
-		/* L(k,i) = conj(y) ; */
-		ASSIGN_CONJ (lx,lz,0, yx,yz,0) ;
-		/* L(k,i) /= di ; */
-		DIV_REAL (lx,lz,0, lx,lz,0, di,0) ;
-		/* d -= conj(y) * y / di */
-		LDLDOT (dk,0, yx,yz,0, di,0) ;
-#endif
-	    }
-
-	    /* determine if column i of L can hold the new L(k,i) entry */
-	    if (p >= Lp [Lnext [i]])
-	    {
-		/* column i needs to grow */
-		PRINT1 (("Factor Colrealloc "ID", old Lnz "ID"\n", i, Lnz [i]));
-		if (!CHOLMOD(reallocate_column) (i, lnz + 1, L, Common))
-		{
-		    /* out of memory, L is now simplicial symbolic */
-		    for (i = 0 ; i < n ; i++)
-		    {
-			/* W [i] = 0 ; */
-			CLEAR (Wx,Wz,i) ;
-		    }
-		    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, n, Common)) ;
-		    return (FALSE) ;
-		}
-		Li = L->i ;		/* L->i, L->x, L->z may have moved */
-		Lx = L->x ;
-		Lz = L->z ;
-		p = Lp [i] + lnz ;	/* contents of L->p changed */
-		ASSERT (p < Lp [Lnext [i]]) ;
-	    }
-
-	    /* store L (k,i) in the column form matrix of L */
-	    Li [p] = k ;
-	    /* Lx [p] = L(k,i) ; */
-	    ASSIGN (Lx,Lz,p, lx,lz,0) ;
-	    Lnz [i]++ ;
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* ensure abs (d) >= dbound if dbound is given, and store it in L */
-	/* ------------------------------------------------------------------ */
-
-	p = Lp [k] ;
-	Li [p] = k ;
-
-	if (k >= (Int) L->minor)
-	{
-	    /* the matrix is already not positive definite */
-	    dk [0] = 0 ;
-	}
-	else if (use_dbound)
-	{
-	    /* modify the diagonal to force LL' or LDL' to exist */
-	    dk [0] = CHOLMOD(dbound) (is_ll ? fabs (dk [0]) : dk [0], Common) ;
-	}
-	else if ((is_ll ? (IS_LE_ZERO (dk [0])) : (IS_ZERO (dk [0])))
-#ifndef REAL
-		|| dk_imaginary
-#endif
-		)
-	{
-	    /* the matrix has just been found to be not positive definite */
-	    dk [0] = 0 ;
-	    L->minor = k ;
-	    ERROR (CHOLMOD_NOT_POSDEF, "not positive definite") ;
-	}
-
-	if (is_ll)
-	{
-	    /* this is counted as one flop, below */
-	    dk [0] = sqrt (dk [0]) ;
-	}
-
-	/* Lx [p] = D(k,k) = d ; real part only */
-	ASSIGN_REAL (Lx,p, dk,0) ;
-	CLEAR_IMAG (Lx,Lz,p) ;
-    }
-
-#undef NEXT
-
-    if (is_ll) fl += MAX ((Int) kend - (Int) kstart, 0) ;   /* count sqrt's */
-    Common->rowfacfl = fl ;
-
-    DEBUG (CHOLMOD(dump_factor) (L, "final cholmod_rowfac", Common)) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, n, Common)) ;
-    return (TRUE) ;
-}
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_solve.c b/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_solve.c
deleted file mode 100644
index 87aa0a9..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Cholesky/t_cholmod_solve.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* ========================================================================== */
-/* === Cholesky/t_cholmod_solve ============================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Cholesky Module.  Copyright (C) 2005-2013, Timothy A. Davis
- * The CHOLMOD/Cholesky Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_solve.  Supports any numeric xtype (real,
- * complex, or zomplex).  The xtypes of all matrices (L and Y) must match.
- */
-
-#include "cholmod_template.h"
-
-/* ========================================================================== */
-/* === simplicial template solvers ========================================== */
-/* ========================================================================== */
-
-/* LL': solve Lx=b with non-unit diagonal */
-#define LL
-#include "t_cholmod_lsolve.c"
-
-/* LDL': solve LDx=b */
-#define LD
-#include "t_cholmod_lsolve.c"
-
-/* LDL': solve Lx=b with unit diagonal */
-#include "t_cholmod_lsolve.c"
-
-/* LL': solve L'x=b with non-unit diagonal */
-#define LL
-#include "t_cholmod_ltsolve.c"
-
-/* LDL': solve DL'x=b */
-#define LD
-#include "t_cholmod_ltsolve.c"
-
-/* LDL': solve L'x=b with unit diagonal */
-#include "t_cholmod_ltsolve.c"
-
-
-/* ========================================================================== */
-/* === t_ldl_dsolve ========================================================= */
-/* ========================================================================== */
-
-/* Solve Dx=b for an LDL' factorization, where Y holds b' on input and x' on
- * output.
- *
- * The number of right-hand-sides (nrhs) is not restricted, even if Yseti
- * is present.
- */
-
-static void TEMPLATE (ldl_dsolve)
-(
-    cholmod_factor *L,
-    cholmod_dense *Y,		/* nr-by-n with leading dimension nr */
-    Int *Yseti, Int ysetlen
-)
-{
-    double d [1] ;
-    double *Lx, *Yx, *Yz ;
-    Int *Lp ;
-    Int n, nrhs, k, p, k1, k2, kk, kkiters ;
-
-    ASSERT (L->xtype == Y->xtype) ; /* L and Y must have the same xtype */
-    ASSERT (L->n == Y->ncol) ;	    /* dimensions must match */
-    ASSERT (Y->nrow == Y->d) ;	    /* leading dimension of Y = # rows of Y */
-    ASSERT (L->xtype != CHOLMOD_PATTERN) ;  /* L is not symbolic */
-    ASSERT (!(L->is_super) && !(L->is_ll)) ;	/* L is simplicial LDL' */
-
-    nrhs = Y->nrow ;
-    n = L->n ;
-    Lp = L->p ;
-    Lx = L->x ;
-    Yx = Y->x ;
-    Yz = Y->z ;
-    kkiters = Yseti ? ysetlen : n ;
-    for (kk = 0 ; kk < kkiters ; kk++)
-    {
-        k = Yseti ? Yseti [kk] : kk ;
-	k1 = k*nrhs ;
-	k2 = (k+1)*nrhs ;
-	ASSIGN_REAL (d,0, Lx,Lp[k]) ;
-	for (p = k1 ; p < k2 ; p++)
-	{
-	    DIV_REAL (Yx,Yz,p, Yx,Yz,p, d,0) ;
-	}
-    }
-}
-
-
-/* ========================================================================== */
-/* === t_simplicial_solver ================================================== */
-/* ========================================================================== */
-
-/* Solve a linear system, where Y' contains the (array-transposed) right-hand
- * side on input, and the solution on output.  No permutations are applied;
- * these must have already been applied to Y on input.
- *
- * Yseti [0..ysetlen-1] is an optional list of indices from
- * cholmod_lsolve_pattern.  The solve is performed only on the columns of L
- * corresponding to entries in Yseti.  Ignored if NULL.  If present, most
- * functions require that Y' consist of a single dense column.
- */
-
-static void TEMPLATE (simplicial_solver)
-(
-    int sys,		    /* system to solve */
-    cholmod_factor *L,	    /* factor to use, a simplicial LL' or LDL' */
-    cholmod_dense *Y,	    /* right-hand-side on input, solution on output */
-    Int *Yseti, Int ysetlen
-)
-{
-    if (L->is_ll)
-    {
-	/* The factorization is LL' */
-	if (sys == CHOLMOD_A || sys == CHOLMOD_LDLt)
-	{
-	    /* Solve Ax=b or LL'x=b */
-	    TEMPLATE (ll_lsolve_k) (L, Y, Yseti, ysetlen) ;
-	    TEMPLATE (ll_ltsolve_k) (L, Y, Yseti, ysetlen) ;
-	}
-	else if (sys == CHOLMOD_L || sys == CHOLMOD_LD)
-	{
-	    /* Solve Lx=b */
-	    TEMPLATE (ll_lsolve_k) (L, Y, Yseti, ysetlen) ;
-	}
-	else if (sys == CHOLMOD_Lt || sys == CHOLMOD_DLt)
-	{
-	    /* Solve L'x=b */
-	    TEMPLATE (ll_ltsolve_k) (L, Y, Yseti, ysetlen) ;
-	}
-    }
-    else
-    {
-	/* The factorization is LDL' */
-	if (sys == CHOLMOD_A || sys == CHOLMOD_LDLt)
-	{
-	    /* Solve Ax=b or LDL'x=b */
-	    TEMPLATE (ldl_lsolve_k) (L, Y, Yseti, ysetlen) ;
-	    TEMPLATE (ldl_dltsolve_k) (L, Y, Yseti, ysetlen) ;
-	}
-	else if (sys == CHOLMOD_LD)
-	{
-	    /* Solve LDx=b */
-	    TEMPLATE (ldl_ldsolve_k) (L, Y, Yseti, ysetlen) ;
-	}
-	else if (sys == CHOLMOD_L)
-	{
-	    /* Solve Lx=b */
-	    TEMPLATE (ldl_lsolve_k) (L, Y, Yseti, ysetlen) ;
-	}
-	else if (sys == CHOLMOD_Lt)
-	{
-	    /* Solve L'x=b */
-	    TEMPLATE (ldl_ltsolve_k) (L, Y, Yseti, ysetlen) ;
-	}
-	else if (sys == CHOLMOD_DLt)
-	{
-	    /* Solve DL'x=b */
-	    TEMPLATE (ldl_dltsolve_k) (L, Y, Yseti, ysetlen) ;
-	}
-	else if (sys == CHOLMOD_D)
-	{
-	    /* Solve Dx=b */
-	    TEMPLATE (ldl_dsolve) (L, Y, Yseti, ysetlen) ;
-	}
-    }
-}
-
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/License.txt b/src/C/SuiteSparse/CHOLMOD/Core/License.txt
deleted file mode 100644
index 1c3ab99..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/License.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-CHOLMOD/Core Module.  Copyright (C) 2005-2006, Univ. of Florida.
-Author: Timothy A. Davis
-CHOLMOD is also available under other licenses; contact authors for details.
-http://www.suitesparse.com
-
-Note that this license is for the CHOLMOD/Core module only.
-All CHOLMOD modules are licensed separately.
-
-
---------------------------------------------------------------------------------
-
-
-This Module 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 Module is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this Module; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_aat.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_aat.c
deleted file mode 100644
index c62580a..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_aat.c
+++ /dev/null
@@ -1,301 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_aat ===================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* C = A*A' or C = A(:,f)*A(:,f)'
- *
- * A can be packed or unpacked, sorted or unsorted, but must be stored with
- * both upper and lower parts (A->stype of zero).  C is returned as packed,
- * C->stype of zero (both upper and lower parts present), and unsorted.  See
- * cholmod_ssmult in the MatrixOps Module for a more general matrix-matrix
- * multiply.
- *
- * You can trivially convert C into a symmetric upper/lower matrix by
- * changing C->stype = 1 or -1 after calling this routine.
- *
- * workspace:
- *	Flag (A->nrow),
- *	Iwork (max (A->nrow, A->ncol)) if fset present,
- *	Iwork (A->nrow) if no fset,
- *	W (A->nrow) if mode > 0,
- *	allocates temporary copy for A'.
- *
- * A can be pattern or real.  Complex or zomplex cases are supported only
- * if the mode is <= 0 (in which case the numerical values are ignored).
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-cholmod_sparse *CHOLMOD(aat)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* input matrix; C=A*A' is constructed */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag)
-			 * -2: pattern only, no diagonal, add 50% + n extra
-			 * space to C */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double fjt ;
-    double *Ax, *Fx, *Cx, *W ;
-    Int *Ap, *Anz, *Ai, *Fp, *Fi, *Cp, *Ci, *Flag ;
-    cholmod_sparse *C, *F ;
-    Int packed, j, i, pa, paend, pf, pfend, n, mark, cnz, t, p, values, diag,
-	extra ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    values = (mode > 0) && (A->xtype != CHOLMOD_PATTERN) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    if (A->stype)
-    {
-	ERROR (CHOLMOD_INVALID, "matrix cannot be symmetric") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    diag = (mode >= 0) ;
-    n = A->nrow ;
-    CHOLMOD(allocate_work) (n, MAX (A->ncol, A->nrow), values ? n : 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n : 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_sparse) (A, "A", Common) >= 0) ;
-
-    /* get the A matrix */
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    packed = A->packed ;
-
-    /* get workspace */
-    W = Common->Xwork ;		/* size n, unused if values is FALSE */
-    Flag = Common->Flag ;	/* size n, Flag [0..n-1] < mark on input*/
-
-    /* ---------------------------------------------------------------------- */
-    /* F = A' or A(:,f)' */
-    /* ---------------------------------------------------------------------- */
-
-    /* workspace: Iwork (nrow if no fset; MAX (nrow,ncol) if fset)*/
-    F = CHOLMOD(ptranspose) (A, values, NULL, fset, fsize, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    Fp = F->p ;
-    Fi = F->i ;
-    Fx = F->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* count the number of entries in the result C */
-    /* ---------------------------------------------------------------------- */
-
-    cnz = 0 ;
-    for (j = 0 ; j < n ; j++)
-    {
-	/* clear the Flag array */
-	/* mark = CHOLMOD(clear_flag) (Common) ; */
-	CHOLMOD_CLEAR_FLAG (Common) ;
-	mark = Common->mark ;
-
-	/* exclude the diagonal, if requested */
-	if (!diag)
-	{
-	    Flag [j] = mark ;
-	}
-
-	/* for each nonzero F(t,j) in column j, do: */
-	pfend = Fp [j+1] ;
-	for (pf = Fp [j] ; pf < pfend ; pf++)
-	{
-	    /* F(t,j) is nonzero */
-	    t = Fi [pf] ;
-
-	    /* add the nonzero pattern of A(:,t) to the pattern of C(:,j) */
-	    pa = Ap [t] ;
-	    paend = (packed) ? (Ap [t+1]) : (pa + Anz [t]) ;
-	    for ( ; pa < paend ; pa++)
-	    {
-		i = Ai [pa] ;
-		if (Flag [i] != mark)
-		{
-		    Flag [i] = mark ;
-		    cnz++ ;
-		}
-	    }
-	}
-	if (cnz < 0)
-	{
-	    break ;	    /* integer overflow case */
-	}
-    }
-
-    extra = (mode == -2) ? (cnz/2 + n) : 0 ;
-
-    mark = CHOLMOD(clear_flag) (Common) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check for integer overflow */
-    /* ---------------------------------------------------------------------- */
-
-    if (cnz < 0 || (cnz + extra) < 0)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	CHOLMOD(clear_flag) (Common) ;
-	CHOLMOD(free_sparse) (&F, Common) ;
-	return (NULL) ;	    /* problem too large */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate C */
-    /* ---------------------------------------------------------------------- */
-
-    C = CHOLMOD(allocate_sparse) (n, n, cnz + extra, FALSE, TRUE, 0,
-	    values ? A->xtype : CHOLMOD_PATTERN, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free_sparse) (&F, Common) ;
-	return (NULL) ;	    /* out of memory */
-    }
-
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* C = A*A' */
-    /* ---------------------------------------------------------------------- */
-
-    cnz = 0 ;
-
-    if (values)
-    {
-
-	/* pattern and values */
-	for (j = 0 ; j < n ; j++)
-	{
-	    /* clear the Flag array */
-	    mark = CHOLMOD(clear_flag) (Common) ;
-
-	    /* start column j of C */
-	    Cp [j] = cnz ;
-
-	    /* for each nonzero F(t,j) in column j, do: */
-	    pfend = Fp [j+1] ;
-	    for (pf = Fp [j] ; pf < pfend ; pf++)
-	    {
-		/* F(t,j) is nonzero */
-		t = Fi [pf] ;
-		fjt = Fx [pf] ;
-
-		/* add the nonzero pattern of A(:,t) to the pattern of C(:,j)
-		 * and scatter the values into W */
-		pa = Ap [t] ;
-		paend = (packed) ? (Ap [t+1]) : (pa + Anz [t]) ;
-		for ( ; pa < paend ; pa++)
-		{
-		    i = Ai [pa] ;
-		    if (Flag [i] != mark)
-		    {
-			Flag [i] = mark ;
-			Ci [cnz++] = i ;
-		    }
-		    W [i] += Ax [pa] * fjt ;
-		}
-	    }
-
-	    /* gather the values into C(:,j) */
-	    for (p = Cp [j] ; p < cnz ; p++)
-	    {
-		i = Ci [p] ;
-		Cx [p] = W [i] ;
-		W [i] = 0 ;
-	    }
-	}
-
-    }
-    else
-    {
-
-	/* pattern only */
-	for (j = 0 ; j < n ; j++)
-	{
-	    /* clear the Flag array */
-	    mark = CHOLMOD(clear_flag) (Common) ;
-
-	    /* exclude the diagonal, if requested */
-	    if (!diag)
-	    {
-		Flag [j] = mark ;
-	    }
-
-	    /* start column j of C */
-	    Cp [j] = cnz ;
-
-	    /* for each nonzero F(t,j) in column j, do: */
-	    pfend = Fp [j+1] ;
-	    for (pf = Fp [j] ; pf < pfend ; pf++)
-	    {
-		/* F(t,j) is nonzero */
-		t = Fi [pf] ;
-
-		/* add the nonzero pattern of A(:,t) to the pattern of C(:,j) */
-		pa = Ap [t] ;
-		paend = (packed) ? (Ap [t+1]) : (pa + Anz [t]) ;
-		for ( ; pa < paend ; pa++)
-		{
-		    i = Ai [pa] ;
-		    if (Flag [i] != mark)
-		    {
-			Flag [i] = mark ;
-			Ci [cnz++] = i ;
-		    }
-		}
-	    }
-	}
-    }
-
-    Cp [n] = cnz ;
-    ASSERT (IMPLIES (mode != -2, MAX (1,cnz) == C->nzmax)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* clear workspace and free temporary matrices and return result */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(free_sparse) (&F, Common) ;
-    CHOLMOD(clear_flag) (Common) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n : 0, Common)) ;
-    DEBUG (i = CHOLMOD(dump_sparse) (C, "aat", Common)) ;
-    ASSERT (IMPLIES (mode < 0, i == 0)) ;
-    return (C) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_add.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_add.c
deleted file mode 100644
index f7fc675..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_add.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_add ===================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* C = alpha*A + beta*B, or spones(A+B).  Result is packed, with sorted or
- * unsorted columns.  This routine is much faster and takes less memory if C
- * is allowed to have unsorted columns.
- *
- * If A and B are both symmetric (in upper form) then C is the same.  Likewise,
- * if A and B are both symmetric (in lower form) then C is the same.
- * Otherwise, C is unsymmetric.  A and B must have the same dimension.
- *
- * workspace: Flag (nrow), W (nrow) if values, Iwork (max (nrow,ncol)).
- *	allocates temporary copies for A and B if they are symmetric.
- *	allocates temporary copy of C if it is to be returned sorted.
- *
- * A and B can have an xtype of pattern or real.  Complex or zomplex cases
- * are supported only if the "values" input parameter is FALSE.
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-cholmod_sparse *CHOLMOD(add)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	    /* matrix to add */
-    cholmod_sparse *B,	    /* matrix to add */
-    double alpha [2],	    /* scale factor for A */
-    double beta [2],	    /* scale factor for B */
-    int values,		    /* if TRUE compute the numerical values of C */
-    int sorted,		    /* if TRUE, sort columns of C */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Bx, *Cx, *W ;
-    Int apacked, up, lo, nrow, ncol, bpacked, nzmax, pa, paend, pb, pbend, i,
-	j, p, mark, nz ;
-    Int *Ap, *Ai, *Anz, *Bp, *Bi, *Bnz, *Flag, *Cp, *Ci ;
-    cholmod_sparse *A2, *B2, *C ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    RETURN_IF_NULL (B, NULL) ;
-    values = values &&
-	(A->xtype != CHOLMOD_PATTERN) && (B->xtype != CHOLMOD_PATTERN) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    RETURN_IF_XTYPE_INVALID (B, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    if (A->nrow != B->nrow || A->ncol != B->ncol)
-    {
-	/* A and B must have the same dimensions */
-	ERROR (CHOLMOD_INVALID, "A and B dimesions do not match") ;
-	return (NULL) ;
-    }
-    /* A and B must have the same numerical type if values is TRUE (both must
-     * be CHOLMOD_REAL, this is implicitly checked above) */
-
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-    CHOLMOD(allocate_work) (nrow, MAX (nrow,ncol), values ? nrow : 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    if (nrow <= 1)
-    {
-	/* C will be implicitly sorted, so no need to sort it here */
-	sorted = FALSE ;
-    }
-
-    /* convert A or B to unsymmetric, if necessary */
-    A2 = NULL ;
-    B2 = NULL ;
-
-    if (A->stype != B->stype)
-    {
-	if (A->stype)
-	{
-	    /* workspace: Iwork (max (nrow,ncol)) */
-	    A2 = CHOLMOD(copy) (A, 0, values, Common) ;
-	    if (Common->status < CHOLMOD_OK)
-	    {
-		return (NULL) ;	    /* out of memory */
-	    }
-	    A = A2 ;
-	}
-	if (B->stype)
-	{
-	    /* workspace: Iwork (max (nrow,ncol)) */
-	    B2 = CHOLMOD(copy) (B, 0, values, Common) ;
-	    if (Common->status < CHOLMOD_OK)
-	    {
-		CHOLMOD(free_sparse) (&A2, Common) ;
-		return (NULL) ;	    /* out of memory */
-	    }
-	    B = B2 ;
-	}
-    }
-
-    /* get the A matrix */
-    ASSERT (A->stype == B->stype) ;
-    up = (A->stype > 0) ;
-    lo = (A->stype < 0) ;
-
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    apacked = A->packed ;
-
-    /* get the B matrix */
-    Bp  = B->p ;
-    Bnz = B->nz ;
-    Bi  = B->i ;
-    Bx  = B->x ;
-    bpacked = B->packed ;
-
-    /* get workspace */
-    W = Common->Xwork ;	    /* size nrow, used if values is TRUE */
-    Flag = Common->Flag ;   /* size nrow, Flag [0..nrow-1] < mark on input */
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the result C */
-    /* ---------------------------------------------------------------------- */
-
-    /* If integer overflow occurs, nzmax < 0 and the allocate fails properly
-     * (likewise in most other matrix manipulation routines). */
-
-    nzmax = CHOLMOD(nnz) (A, Common) + CHOLMOD(nnz) (B, Common) ;
-
-    C = CHOLMOD(allocate_sparse) (nrow, ncol, nzmax, FALSE, TRUE,
-	    SIGN (A->stype), values ? A->xtype : CHOLMOD_PATTERN, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free_sparse) (&A2, Common) ;
-	CHOLMOD(free_sparse) (&B2, Common) ;
-	return (NULL) ;	    /* out of memory */
-    }
-
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* compute C = alpha*A + beta*B */
-    /* ---------------------------------------------------------------------- */
-
-    nz = 0 ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	Cp [j] = nz ;
-
-	/* clear the Flag array */
-	/* mark = CHOLMOD(clear_flag) (Common) ; */
-	CHOLMOD_CLEAR_FLAG (Common) ;
-	mark = Common->mark ;
-
-	/* scatter B into W */
-	pb = Bp [j] ;
-	pbend = (bpacked) ? (Bp [j+1]) : (pb + Bnz [j]) ;
-	for (p = pb ; p < pbend ; p++)
-	{
-	    i = Bi [p] ;
-	    if ((up && i > j) || (lo && i < j))
-	    {
-		continue ;
-	    }
-	    Flag [i] = mark ;
-	    if (values)
-	    {
-		W [i] = beta [0] * Bx [p] ;
-	    }
-	}
-
-	/* add A and gather from W into C(:,j) */
-	pa = Ap [j] ;
-	paend = (apacked) ? (Ap [j+1]) : (pa + Anz [j]) ;
-	for (p = pa ; p < paend ; p++)
-	{
-	    i = Ai [p] ;
-	    if ((up && i > j) || (lo && i < j))
-	    {
-		continue ;
-	    }
-	    Flag [i] = EMPTY ;
-	    Ci [nz] = i ;
-	    if (values)
-	    {
-		Cx [nz] = W [i] + alpha [0] * Ax [p] ;
-		W [i] = 0 ;
-	    }
-	    nz++ ;
-	}
-
-	/* gather remaining entries into C(:,j), using pattern of B */
-	for (p = pb ; p < pbend ; p++)
-	{
-	    i = Bi [p] ;
-	    if ((up && i > j) || (lo && i < j))
-	    {
-		continue ;
-	    }
-	    if (Flag [i] == mark)
-	    {
-		Ci [nz] = i ;
-		if (values)
-		{
-		    Cx [nz] = W [i] ;
-		    W [i] = 0 ;
-		}
-		nz++ ;
-	    }
-	}
-    }
-
-    Cp [ncol] = nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* reduce C in size and free temporary matrices */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (MAX (1,nz) <= C->nzmax) ;
-    CHOLMOD(reallocate_sparse) (nz, C, Common) ;
-    ASSERT (Common->status >= CHOLMOD_OK) ;
-
-    /* clear the Flag array */
-    mark = CHOLMOD(clear_flag) (Common) ;
-
-    CHOLMOD(free_sparse) (&A2, Common) ;
-    CHOLMOD(free_sparse) (&B2, Common) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* sort C, if requested */
-    /* ---------------------------------------------------------------------- */
-
-    if (sorted)
-    {
-	/* workspace: Iwork (max (nrow,ncol)) */
-	if (!CHOLMOD(sort) (C, Common))
-	{
-	    CHOLMOD(free_sparse) (&C, Common) ;
-	    if (Common->status < CHOLMOD_OK)
-	    {
-		return (NULL) ;		/* out of memory */
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_sparse) (C, "add", Common) >= 0) ;
-    return (C) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_band.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_band.c
deleted file mode 100644
index fd03698..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_band.c
+++ /dev/null
@@ -1,373 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_band ==================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* C = tril (triu (A,k1), k2)
- *
- * C is a matrix consisting of the diagonals of A from k1 to k2.
- *
- * k=0 is the main diagonal of A, k=1 is the superdiagonal, k=-1 is the
- * subdiagonal, and so on.  If A is m-by-n, then:
- *
- *	k1=-m		    C = tril (A,k2)
- *	k2=n		    C = triu (A,k1)
- *	k1=0 and k2=0	    C = diag(A), except C is a matrix, not a vector
- *
- * Values of k1 and k2 less than -m are treated as -m, and values greater
- * than n are treated as n.
- *
- * A can be of any symmetry (upper, lower, or unsymmetric); C is returned in
- * the same form, and packed.  If A->stype > 0, entries in the lower
- * triangular part of A are ignored, and the opposite is true if
- * A->stype < 0.  If A has sorted columns, then so does C.
- * C has the same size as A.
- *
- * If inplace is TRUE, then the matrix A is modified in place.
- * Only packed matrices can be converted in place.
- *
- * C can be returned as a numerical valued matrix (if A has numerical values
- * and mode > 0), as a pattern-only (mode == 0), or as a pattern-only but with
- * the diagonal entries removed (mode < 0).
- *
- * workspace: none
- *
- * A can have an xtype of pattern or real.  Complex and zomplex cases supported
- * only if mode <= 0 (in which case the numerical values are ignored).
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-static cholmod_sparse *band		/* returns C, or NULL if failure */
-(
-    /* ---- input or in/out if inplace is TRUE --- */
-    cholmod_sparse *A,
-    /* ---- input ---- */
-    SuiteSparse_long k1,    /* ignore entries below the k1-st diagonal */
-    SuiteSparse_long k2,    /* ignore entries above the k2-nd diagonal */
-    int mode,	    /* >0: numerical, 0: pattern, <0: pattern (no diagonal) */
-    int inplace,    /* if TRUE, then convert A in place */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Cx ;
-    Int packed, nz, j, p, pend, i, ncol, nrow, jlo, jhi, ilo, ihi, sorted,
-	values, diag ;
-    Int *Ap, *Anz, *Ai, *Cp, *Ci ;
-    cholmod_sparse *C ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    values = (mode > 0) && (A->xtype != CHOLMOD_PATTERN) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    packed = A->packed ;
-    diag = (mode >= 0) ;
-    if (inplace && !packed)
-    {
-	/* cannot operate on an unpacked matrix in place */
-	ERROR (CHOLMOD_INVALID, "cannot operate on unpacked matrix in-place") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-
-    PRINT1 (("k1 %ld k2 %ld\n", k1, k2)) ;
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    sorted = A->sorted ;
-
-
-    if (A->stype > 0)
-    {
-	/* ignore any entries in strictly lower triangular part of A */
-	k1 = MAX (k1, 0) ;
-    }
-    if (A->stype < 0)
-    {
-	/* ignore any entries in strictly upper triangular part of A */
-	k2 = MIN (k2, 0) ;
-    }
-    ncol = A->ncol ;
-    nrow = A->nrow ;
-
-    /* ensure k1 and k2 are in the range -nrow to +ncol to
-     * avoid possible integer overflow if k1 and k2 are huge */
-    k1 = MAX (-nrow, k1) ;
-    k1 = MIN (k1, ncol) ;
-    k2 = MAX (-nrow, k2) ;
-    k2 = MIN (k2, ncol) ;
-
-    /* consider columns jlo to jhi.  columns outside this range are empty */
-    jlo = MAX (k1, 0) ;
-    jhi = MIN (k2+nrow, ncol) ;
-
-    if (k1 > k2)
-    {
-	/* nothing to do */
-	jlo = ncol ;
-	jhi = ncol ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate C, or operate on A in place */
-    /* ---------------------------------------------------------------------- */
-
-    if (inplace)
-    {
-	/* convert A in place */
-	C = A ;
-    }
-    else
-    {
-	/* count the number of entries in the result C */
-	nz = 0 ;
-	if (sorted)
-	{
-	    for (j = jlo ; j < jhi ; j++)
-	    {
-		ilo = j-k2 ;
-		ihi = j-k1 ;
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i > ihi)
-		    {
-			break ;
-		    }
-		    if (i >= ilo && (diag || i != j))
-		    {
-			nz++ ;
-		    }
-		}
-	    }
-	}
-	else
-	{
-	    for (j = jlo ; j < jhi ; j++)
-	    {
-		ilo = j-k2 ;
-		ihi = j-k1 ;
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i >= ilo && i <= ihi && (diag || i != j))
-		    {
-			nz++ ;
-		    }
-		}
-	    }
-	}
-	/* allocate C; A will not be modified.  C is sorted if A is sorted */
-	C = CHOLMOD(allocate_sparse) (A->nrow, ncol, nz, sorted, TRUE,
-		A->stype, values ? A->xtype : CHOLMOD_PATTERN, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    return (NULL) ;	/* out of memory */
-	}
-    }
-
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* construct C */
-    /* ---------------------------------------------------------------------- */
-
-    /* columns 0 to jlo-1 are empty */
-    for (j = 0 ; j < jlo ; j++)
-    {
-	Cp [j] = 0 ;
-    }
-
-    nz = 0 ;
-    if (sorted)
-    {
-	if (values)
-	{
-	    /* pattern and values */
-	    ASSERT (diag) ;
-	    for (j = jlo ; j < jhi ; j++)
-	    {
-		ilo = j-k2 ;
-		ihi = j-k1 ;
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		Cp [j] = nz ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i > ihi)
-		    {
-			break ;
-		    }
-		    if (i >= ilo)
-		    {
-			Ci [nz] = i ;
-			Cx [nz] = Ax [p] ;
-			nz++ ;
-		    }
-		}
-	    }
-	}
-	else
-	{
-	    /* pattern only, perhaps with no diagonal */
-	    for (j = jlo ; j < jhi ; j++)
-	    {
-		ilo = j-k2 ;
-		ihi = j-k1 ;
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		Cp [j] = nz ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i > ihi)
-		    {
-			break ;
-		    }
-		    if (i >= ilo && (diag || i != j))
-		    {
-			Ci [nz++] = i ;
-		    }
-		}
-	    }
-	}
-    }
-    else
-    {
-	if (values)
-	{
-	    /* pattern and values */
-	    ASSERT (diag) ;
-	    for (j = jlo ; j < jhi ; j++)
-	    {
-		ilo = j-k2 ;
-		ihi = j-k1 ;
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		Cp [j] = nz ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i >= ilo && i <= ihi)
-		    {
-			Ci [nz] = i ;
-			Cx [nz] = Ax [p] ;
-			nz++ ;
-		    }
-		}
-	    }
-	}
-	else
-	{
-	    /* pattern only, perhaps with no diagonal */
-	    for (j = jlo ; j < jhi ; j++)
-	    {
-		ilo = j-k2 ;
-		ihi = j-k1 ;
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		Cp [j] = nz ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i >= ilo && i <= ihi && (diag || i != j))
-		    {
-			Ci [nz++] = i ;
-		    }
-		}
-	    }
-	}
-    }
-
-    /* columns jhi to ncol-1 are empty */
-    for (j = jhi ; j <= ncol ; j++)
-    {
-	Cp [j] = nz ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* reduce A in size if done in place */
-    /* ---------------------------------------------------------------------- */
-
-    if (inplace)
-    {
-	/* free the unused parts of A, and reduce A->i and A->x in size */
-	ASSERT (MAX (1,nz) <= A->nzmax) ;
-	CHOLMOD(reallocate_sparse) (nz, A, Common) ;
-	ASSERT (Common->status >= CHOLMOD_OK) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the result C */
-    /* ---------------------------------------------------------------------- */
-
-    DEBUG (i = CHOLMOD(dump_sparse) (C, "band", Common)) ;
-    ASSERT (IMPLIES (mode < 0, i == 0)) ;
-    return (C) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_band ========================================================= */
-/* ========================================================================== */
-
-cholmod_sparse *CHOLMOD(band)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to extract band matrix from */
-    SuiteSparse_long k1,    /* ignore entries below the k1-st diagonal */
-    SuiteSparse_long k2,    /* ignore entries above the k2-nd diagonal */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag) */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    return (band (A, k1, k2, mode, FALSE, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_band_inplace ================================================= */
-/* ========================================================================== */
-
-int CHOLMOD(band_inplace)
-(
-    /* ---- input ---- */
-    SuiteSparse_long k1,    /* ignore entries below the k1-st diagonal */
-    SuiteSparse_long k2,    /* ignore entries above the k2-nd diagonal */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag) */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix from which entries not in band are removed */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    return (band (A, k1, k2, mode, TRUE, Common) != NULL) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_change_factor.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_change_factor.c
deleted file mode 100644
index 05032b7..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_change_factor.c
+++ /dev/null
@@ -1,1226 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_change_factor =========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Change the numeric/symbolic, LL/LDL, simplicial/super, packed/unpacked,
- * monotonic/non-monotonic status of a cholmod_factor object.
- *
- * There are four basic classes of factor types:
- *
- * (1) simplicial symbolic:  Consists of two size-n arrays: the fill-reducing
- *	permutation (L->Perm) and the nonzero count for each column of L
- *	(L->ColCount).  All other factor types also include this information.
- *	L->ColCount may be exact (obtained from the analysis routines), or
- *	it may be a guess.  During factorization, and certainly after update/
- *	downdate, the columns of L can have a different number of nonzeros.
- *	L->ColCount is used to allocate space.  L->ColCount is exact for the
- *	supernodal factorizations.  The nonzero pattern of L is not kept.
- *
- * (2) simplicial numeric:  These represent L in a compressed column form.  The
- *	variants of this type are:
- *
- *	LDL':	L is unit diagonal.  Row indices in column j are located in
- *	    L->i [L->p [j] ... L->p [j] + L->nz [j]], and corresponding numeric
- *	    values are in the same locations in L->x.  The total number of
- *	    entries is the sum of L->nz [j].  The unit diagonal is not stored;
- *	    D is stored on the diagonal of L instead.  L->p may or may not be
- *	    monotonic.  The order of storage of the columns in L->i and L->x is
- *	    given by a doubly-linked list (L->prev and L->next).  L->p is of
- *	    size n+1, but only the first n entries are used (it is used if L
- *	    is converted to a sparse matrix via cholmod_factor_to_sparse).
- *
- *	    For the complex case, L->x is stored interleaved with real/imag
- *	    parts, and is of size 2*lnz*sizeof(double).  For the zomplex case,
- *	    L->x is of size lnz*sizeof(double) and holds the real part; L->z
- *	    is the same size and holds the imaginary part.
- *
- *	LL':  This is identical to the LDL' form, except that the non-unit
- *	    diagonal of L is stored as the first entry in each column of L.
- *
- * (3) supernodal symbolic:  A representation of the nonzero pattern of the
- *	supernodes for a supernodal factorization.  There are L->nsuper
- *	supernodes.  Columns L->super [k] to L->super [k+1]-1 are in the kth
- *	supernode.  The row indices for the kth supernode are in
- *	L->s [L->pi [k] ... L->pi [k+1]-1].  The numerical values are not
- *	allocated (L->x), but when they are they will be located in
- *	L->x [L->px [k] ... L->px [k+1]-1], and the L->px array is defined
- *	in this factor type.
- *
- *	For the complex case, L->x is stored interleaved with real/imag parts,
- *	and is of size 2*L->xsize*sizeof(double).  The zomplex supernodal case
- *	is not supported, since it is not compatible with LAPACK and the BLAS.
- *
- * (4) supernodal numeric:  Always an LL' factorization.  L is non-unit
- *      diagonal.  L->x contains the numerical values of the supernodes, as
- *      described above for the supernodal symbolic factor.
- *	For the complex case, L->x is stored interleaved, and is of size
- *	2*L->xsize*sizeof(double).  The zomplex supernodal case is not
- *	supported, since it is not compatible with LAPACK and the BLAS.
- *
- *      FUTURE WORK: support a supernodal LDL' factor.
- *
- *
- * In all cases, the row indices in each column (L->i for simplicial L and
- * L->s for supernodal L) are kept sorted from low indices to high indices.
- * This means the diagonal of L (or D for LDL' factors) is always kept as the
- * first entry in each column.
- *
- * The cholmod_change_factor routine can do almost all possible conversions.
- * It cannot do the following conversions:
- *
- *	(1) Simplicial numeric types cannot be converted to a supernodal
- *	    symbolic type.  This would simultaneously deallocate the
- *	    simplicial pattern and numeric values and reallocate uninitialized
- *	    space for the supernodal pattern.  This isn't useful for the user,
- *	    and not needed by CHOLMOD's own routines either.
- *
- *	(2) Only a symbolic factor (simplicial to supernodal) can be converted
- *	    to a supernodal numeric factor.
- *
- * Some conversions are meant only to be used internally by other CHOLMOD
- * routines, and should not be performed by the end user.  They allocate space
- * whose contents are undefined:
- *
- *	(1) converting from simplicial symbolic to supernodal symbolic.
- *	(2) converting any factor to supernodal numeric.
- *
- * workspace: no conversion routine uses workspace in Common.  No temporary
- *	workspace is allocated.
- *
- * Supports all xtypes, except that there is no supernodal zomplex L.
- *
- * The to_xtype parameter is used only when converting from symbolic to numeric
- * or numeric to symbolic.  It cannot be used to convert a numeric xtype (real,
- * complex, or zomplex) to a different numeric xtype.  For that conversion,
- * use cholmod_factor_xtype instead.
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-static void natural_list (cholmod_factor *L) ;
-
-/* ========================================================================== */
-/* === TEMPLATE ============================================================= */
-/* ========================================================================== */
-
-#define REAL
-#include "t_cholmod_change_factor.c"
-#define COMPLEX
-#include "t_cholmod_change_factor.c"
-#define ZOMPLEX
-#include "t_cholmod_change_factor.c"
-
-
-/* ========================================================================== */
-/* === L_is_packed ========================================================== */
-/* ========================================================================== */
-
-/* Return TRUE if the columns of L are packed, FALSE otherwise.  For debugging
- * only. */
-
-#ifndef NDEBUG
-static int L_is_packed (cholmod_factor *L, cholmod_common *Common)
-{
-    Int j ;
-    Int *Lnz = L->nz ;
-    Int *Lp = L->p ;
-    Int n = L->n ;
-
-    if (L->xtype == CHOLMOD_PATTERN || L->is_super)
-    {
-	return (TRUE) ;
-    }
-
-    if (Lnz == NULL || Lp == NULL)
-    {
-	return (TRUE) ;
-    }
-
-    for (j = 0 ; j < n ; j++)
-    {
-	PRINT3 (("j: "ID" Lnz "ID" Lp[j+1] "ID" Lp[j] "ID"\n", j, Lnz [j],
-		Lp [j+1], Lp [j])) ;
-	if (Lnz [j] != (Lp [j+1] - Lp [j]))
-	{
-	    PRINT2 (("L is not packed\n")) ;
-	    return (FALSE) ;
-	}
-    }
-    return (TRUE) ;
-}
-#endif
-
-
-/* ========================================================================== */
-/* === natural_list ========================================================= */
-/* ========================================================================== */
-
-/* Create a naturally-ordered doubly-linked list of columns. */
-
-static void natural_list (cholmod_factor *L)
-{
-    Int head, tail, n, j ;
-    Int *Lnext, *Lprev ;
-    Lnext = L->next ;
-    Lprev = L->prev ;
-    ASSERT (Lprev != NULL && Lnext != NULL) ;
-    n = L->n ;
-    head = n+1 ;
-    tail = n ;
-    Lnext [head] = 0 ;
-    Lprev [head] = EMPTY ;
-    Lnext [tail] = EMPTY ;
-    Lprev [tail] = n-1 ;
-    for (j = 0 ; j < n ; j++)
-    {
-	Lnext [j] = j+1 ;
-	Lprev [j] = j-1 ;
-    }
-    Lprev [0] = head ;
-    L->is_monotonic = TRUE ;
-}
-
-
-/* ========================================================================== */
-/* === allocate_simplicial_numeric ========================================== */
-/* ========================================================================== */
-
-/* Allocate O(n) arrays for simplicial numeric factorization.  Initializes
- * the link lists only.  Does not allocate the L->i, L->x, or L->z arrays. */
-
-static int allocate_simplicial_numeric
-(
-    cholmod_factor *L,
-    cholmod_common *Common
-)
-{
-    Int n ;
-    Int *Lp, *Lnz, *Lprev, *Lnext ;
-    size_t n1, n2 ;
-
-    PRINT1 (("Allocate simplicial\n")) ;
-
-    ASSERT (L->xtype == CHOLMOD_PATTERN || L->is_super) ;
-    ASSERT (L->p == NULL) ;
-    ASSERT (L->nz == NULL) ;
-    ASSERT (L->prev == NULL) ;
-    ASSERT (L->next == NULL) ;
-
-    n = L->n ;
-
-    /* this cannot cause size_t overflow */
-    n1 = ((size_t) n) + 1 ;
-    n2 = ((size_t) n) + 2 ;
-
-    Lp = CHOLMOD(malloc) (n1, sizeof (Int), Common) ;
-    Lnz = CHOLMOD(malloc) (n, sizeof (Int), Common) ;
-    Lprev = CHOLMOD(malloc) (n2, sizeof (Int), Common) ;
-    Lnext = CHOLMOD(malloc) (n2, sizeof (Int), Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free) (n1, sizeof (Int), Lp,    Common) ;
-	CHOLMOD(free) (n,   sizeof (Int), Lnz,   Common) ;
-	CHOLMOD(free) (n2, sizeof (Int), Lprev, Common) ;
-	CHOLMOD(free) (n2, sizeof (Int), Lnext, Common) ;
-	PRINT1 (("Allocate simplicial failed\n")) ;
-	return (FALSE) ;	/* out of memory */
-    }
-
-    /* ============================================== commit the changes to L */
-
-    L->p = Lp ;
-    L->nz = Lnz ;
-    L->prev = Lprev ;
-    L->next = Lnext ;
-    /* initialize a doubly linked list for columns in natural order */
-    natural_list (L) ;
-    PRINT1 (("Allocate simplicial done\n")) ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === simplicial_symbolic_to_super_symbolic ================================ */
-/* ========================================================================== */
-
-/* Convert a simplicial symbolic factor supernodal symbolic factor.  Does not
- * initialize the new space. */
-
-static int simplicial_symbolic_to_super_symbolic
-(
-    cholmod_factor *L,
-    cholmod_common *Common
-)
-{
-    Int nsuper, xsize, ssize ;
-    Int *Lsuper, *Lpi, *Lpx, *Ls ;
-    size_t nsuper1 ;
-
-    ASSERT (L->xtype == CHOLMOD_PATTERN && !(L->is_super)) ;
-
-    xsize  = L->xsize ;
-    ssize  = L->ssize ;
-    nsuper = L->nsuper ;
-    nsuper1 = ((size_t) nsuper) + 1 ;
-
-    PRINT1 (("simple sym to super sym: ssize "ID" xsize "ID" nsuper "ID""
-	" status %d\n", ssize, xsize, nsuper, Common->status)) ;
-
-    /* O(nsuper) arrays, where nsuper <= n */
-    Lsuper = CHOLMOD(malloc) (nsuper1, sizeof (Int), Common) ;
-    Lpi    = CHOLMOD(malloc) (nsuper1, sizeof (Int), Common) ;
-    Lpx    = CHOLMOD(malloc) (nsuper1, sizeof (Int), Common) ;
-
-    /* O(ssize) array, where ssize <= nnz(L), and usually much smaller */
-    Ls = CHOLMOD(malloc) (ssize, sizeof (Int), Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free) (nsuper1, sizeof (Int), Lsuper, Common) ;
-	CHOLMOD(free) (nsuper1, sizeof (Int), Lpi,    Common) ;
-	CHOLMOD(free) (nsuper1, sizeof (Int), Lpx,    Common) ;
-	CHOLMOD(free) (ssize,    sizeof (Int), Ls,     Common) ;
-	return (FALSE) ;	/* out of memory */
-    }
-
-    /* ============================================== commit the changes to L */
-
-    ASSERT (Lsuper != NULL && Lpi != NULL && Lpx != NULL && Ls != NULL) ;
-
-    L->maxcsize = 0 ;
-    L->maxesize = 0 ;
-
-    L->super = Lsuper ;
-    L->pi = Lpi ;
-    L->px = Lpx ;
-    L->s  = Ls ;
-    Ls [0] = EMPTY ;	    /* supernodal pattern undefined */
-
-    L->is_super = TRUE ;
-    L->is_ll = TRUE ;	    /* supernodal LDL' not supported */
-    L->xtype = CHOLMOD_PATTERN ;
-    L->dtype = DTYPE ;
-    L->minor = L->n ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === any_to_simplicial_symbolic =========================================== */
-/* ========================================================================== */
-
-/* Convert any factor L to a simplicial symbolic factor, leaving only L->Perm
- * and L->ColCount.  Cannot fail.  Any of the components of L (except Perm and
- * ColCount) may already be free'd.  */
-
-static void any_to_simplicial_symbolic
-(
-    cholmod_factor *L,
-    int to_ll,
-    cholmod_common *Common
-)
-{
-    Int n, lnz, xs, ss, s, e ;
-    size_t n1, n2 ;
-
-    /* ============================================== commit the changes to L */
-
-    n = L->n ;
-    lnz = L->nzmax ;
-    s = L->nsuper + 1 ;
-    xs = (L->is_super) ? ((Int) (L->xsize)) : (lnz) ;
-    e = (L->xtype == CHOLMOD_COMPLEX ? 2 : 1) ;
-    ss = L->ssize ;
-
-    /* this cannot cause size_t overflow */
-    n1 = ((size_t) n) + 1 ;
-    n2 = ((size_t) n) + 2 ;
-
-    /* free all but the symbolic analysis (Perm and ColCount) */
-    L->p     = CHOLMOD(free) (n1,  sizeof (Int),      L->p,     Common) ;
-    L->i     = CHOLMOD(free) (lnz, sizeof (Int),      L->i,     Common) ;
-    L->x     = CHOLMOD(free) (xs,  e*sizeof (double), L->x,     Common) ;
-    L->z     = CHOLMOD(free) (lnz, sizeof (double),   L->z,     Common) ;
-    L->nz    = CHOLMOD(free) (n,   sizeof (Int),      L->nz,    Common) ;
-    L->next  = CHOLMOD(free) (n2,  sizeof (Int),      L->next,  Common) ;
-    L->prev  = CHOLMOD(free) (n2,  sizeof (Int),      L->prev,  Common) ;
-    L->super = CHOLMOD(free) (s,   sizeof (Int),      L->super, Common) ;
-    L->pi    = CHOLMOD(free) (s,   sizeof (Int),      L->pi,    Common) ;
-    L->px    = CHOLMOD(free) (s,   sizeof (Int),      L->px,    Common) ;
-    L->s     = CHOLMOD(free) (ss,  sizeof (Int),      L->s,     Common) ;
-    L->nzmax = 0 ;
-    L->is_super = FALSE ;
-    L->xtype = CHOLMOD_PATTERN ;
-    L->dtype = DTYPE ;
-    L->minor = n ;
-    L->is_ll = to_ll ;
-}
-
-
-/* ========================================================================== */
-/* === ll_super_to_super_symbolic =========================================== */
-/* ========================================================================== */
-
-/* Convert a numerical supernodal L to symbolic supernodal.  Cannot fail. */
-
-static void ll_super_to_super_symbolic
-(
-    cholmod_factor *L,
-    cholmod_common *Common
-)
-{
-
-    /* ============================================== commit the changes to L */
-
-    /* free all but the supernodal numerical factor */
-    ASSERT (L->xtype != CHOLMOD_PATTERN && L->is_super && L->is_ll) ;
-    DEBUG (CHOLMOD(dump_factor) (L, "start to super symbolic", Common)) ;
-    L->x = CHOLMOD(free) (L->xsize,
-	    (L->xtype == CHOLMOD_COMPLEX ? 2 : 1) * sizeof (double), L->x,
-	    Common) ;
-    L->xtype = CHOLMOD_PATTERN ;
-    L->dtype = DTYPE ;
-    L->minor = L->n ;
-    L->is_ll = TRUE ;	    /* supernodal LDL' not supported */
-    DEBUG (CHOLMOD(dump_factor) (L, "done  to super symbolic", Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === simplicial_symbolic_to_simplicial_numeric ============================ */
-/* ========================================================================== */
-
-/* Convert a simplicial symbolic L to a simplicial numeric L; allocate space
- * for L using L->ColCount from symbolic analysis, and set L to identity.
- *
- * If packed < 0, then this routine is creating a copy of another factor
- * (via cholmod_copy_factor).  In this case, the space is not initialized. */
-
-static void simplicial_symbolic_to_simplicial_numeric
-(
-    cholmod_factor *L,
-    int to_ll,
-    int packed,
-    int to_xtype,
-    cholmod_common *Common
-)
-{
-    double grow0, grow1, xlen, xlnz ;
-    double *Lx, *Lz ;
-    Int *Li, *Lp, *Lnz, *ColCount ;
-    Int n, grow, grow2, p, j, lnz, len, ok, e ;
-
-    ASSERT (L->xtype == CHOLMOD_PATTERN && !(L->is_super)) ;
-    if (!allocate_simplicial_numeric (L, Common))
-    {
-	PRINT1 (("out of memory, allocate simplicial numeric\n")) ;
-	return ;	/* out of memory */
-    }
-    ASSERT (L->ColCount != NULL && L->nz != NULL && L->p != NULL) ;
-    ASSERT (L->x == NULL && L->z == NULL && L->i == NULL) ;
-
-    ColCount = L->ColCount ;
-    Lnz = L->nz ;
-    Lp = L->p ;
-    ok = TRUE ;
-    n = L->n ;
-
-    if (packed < 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* used by cholmod_copy_factor to allocate a copy of a factor object */
-	/* ------------------------------------------------------------------ */
-
-	lnz = L->nzmax ;
-	L->nzmax = 0 ;
-
-    }
-    else if (packed)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* LDL' or LL' packed */
-	/* ------------------------------------------------------------------ */
-
-	PRINT1 (("convert to packed LL' or LDL'\n")) ;
-	lnz = 0 ;
-	for (j = 0 ; ok && j < n ; j++)
-	{
-	    /* ensure len is in the range 1 to n-j */
-	    len = ColCount [j] ;
-	    len = MAX (1, len) ;
-	    len = MIN (len, n-j) ;
-	    lnz += len ;
-	    ok = (lnz >= 0) ;
-	}
-	for (j = 0 ; j <= n ; j++)
-	{
-	    Lp [j] = j ;
-	}
-	for (j = 0 ; j < n ; j++)
-	{
-	    Lnz [j] = 1 ;
-	}
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* LDL' unpacked */
-	/* ------------------------------------------------------------------ */
-
-	PRINT1 (("convert to unpacked\n")) ;
-	/* compute new lnzmax */
-	/* if any parameter is NaN, grow is false */
-	grow0 = Common->grow0 ;
-	grow1 = Common->grow1 ;
-	grow2 = Common->grow2 ;
-	grow0 = IS_NAN (grow0) ? 1 : grow0 ;
-	grow1 = IS_NAN (grow1) ? 1 : grow1 ;
-	/* fl.pt. compare, but no NaN's: */
-	grow = (grow0 >= 1.0) && (grow1 >= 1.0) && (grow2 > 0) ;
-	PRINT1 (("init, grow1 %g grow2 "ID"\n", grow1, grow2)) ;
-	/* initialize Lp and Lnz for each column */
-	lnz = 0 ;
-	for (j = 0 ; ok && j < n ; j++)
-	{
-	    Lp [j] = lnz ;
-	    Lnz [j] = 1 ;
-
-	    /* ensure len is in the range 1 to n-j */
-	    len = ColCount [j] ;
-	    len = MAX (1, len) ;
-	    len = MIN (len, n-j) ;
-
-	    /* compute len in double to avoid integer overflow */
-	    PRINT1 (("ColCount ["ID"] = "ID"\n", j, len)) ;
-	    if (grow)
-	    {
-		xlen = (double) len ;
-		xlen = grow1 * xlen + grow2 ;
-		xlen = MIN (xlen, n-j) ;
-		len = (Int) xlen ;
-	    }
-	    ASSERT (len >= 1 && len <= n-j) ;
-	    lnz += len ;
-	    ok = (lnz >= 0) ;
-	}
-	if (ok)
-	{
-	    Lp [n] = lnz ;
-	    if (grow)
-	    {
-		/* add extra space */
-		xlnz = (double) lnz ;
-		xlnz *= grow0 ;
-		xlnz = MIN (xlnz, Size_max) ;
-		xlnz = MIN (xlnz, ((double) n * (double) n + (double) n) / 2) ;
-		lnz = (Int) xlnz ;
-	    }
-	}
-    }
-
-    lnz = MAX (1, lnz) ;
-
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-    }
-
-    /* allocate L->i, L->x, and L->z */
-    PRINT1 (("resizing from zero size to lnz "ID"\n", lnz)) ;
-    ASSERT (L->nzmax == 0) ;
-    e = (to_xtype == CHOLMOD_COMPLEX ? 2 : 1) ;
-    if (!ok || !CHOLMOD(realloc_multiple) (lnz, 1, to_xtype, &(L->i), NULL,
-		&(L->x), &(L->z), &(L->nzmax), Common))
-    {
-	L->p    = CHOLMOD(free) (n+1, sizeof (Int),      L->p, Common) ;
-	L->nz   = CHOLMOD(free) (n,   sizeof (Int),      L->nz, Common) ;
-	L->prev = CHOLMOD(free) (n+2, sizeof (Int),      L->prev, Common) ;
-	L->next = CHOLMOD(free) (n+2, sizeof (Int),      L->next, Common) ;
-	L->i    = CHOLMOD(free) (lnz, sizeof (Int),      L->i, Common) ;
-	L->x    = CHOLMOD(free) (lnz, e*sizeof (double), L->x, Common) ;
-	L->z    = CHOLMOD(free) (lnz, sizeof (double),   L->z, Common) ;
-	PRINT1 (("cannot realloc simplicial numeric\n")) ;
-	return ;	/* out of memory */
-    }
-
-    /* ============================================== commit the changes to L */
-
-    /* initialize L to be the identity matrix */
-    L->xtype = to_xtype ;
-    L->dtype = DTYPE ;
-    L->minor = n ;
-
-    Li = L->i ;
-    Lx = L->x ;
-    Lz = L->z ;
-
-#if 0
-    if (lnz == 1)
-    {
-	/* the user won't expect to access this entry, but some CHOLMOD
-	 * routines may.  Set it to zero so that valgrind doesn't complain. */
-	switch (to_xtype)
-	{
-	    case CHOLMOD_REAL:
-		Lx [0] = 0 ;
-		break ;
-
-	    case CHOLMOD_COMPLEX:
-		Lx [0] = 0 ;
-		Lx [1] = 0 ;
-		break ;
-
-	    case CHOLMOD_ZOMPLEX:
-		Lx [0] = 0 ;
-		Lz [0] = 0 ;
-		break ;
-	}
-    }
-#endif
-
-    if (packed >= 0)
-    {
-	/* create the unit diagonal for either the LL' or LDL' case */
-
-	switch (L->xtype)
-	{
-	    case CHOLMOD_REAL:
-		for (j = 0 ; j < n ; j++)
-		{
-		    ASSERT (Lp [j] < Lp [j+1]) ;
-		    p = Lp [j] ;
-		    Li [p] = j ;
-		    Lx [p] = 1 ;
-		}
-		break ;
-
-	    case CHOLMOD_COMPLEX:
-		for (j = 0 ; j < n ; j++)
-		{
-		    ASSERT (Lp [j] < Lp [j+1]) ;
-		    p = Lp [j] ;
-		    Li [p] = j ;
-		    Lx [2*p  ] = 1 ;
-		    Lx [2*p+1] = 0 ;
-		}
-		break ;
-
-	    case CHOLMOD_ZOMPLEX:
-		for (j = 0 ; j < n ; j++)
-		{
-		    ASSERT (Lp [j] < Lp [j+1]) ;
-		    p = Lp [j] ;
-		    Li [p] = j ;
-		    Lx [p] = 1 ;
-		    Lz [p] = 0 ;
-		}
-		break ;
-	}
-    }
-
-    L->is_ll = to_ll ;
-
-    PRINT1 (("done convert simplicial symbolic to numeric\n")) ;
-}
-
-
-/* ========================================================================== */
-/* === change_simplicial_numeric ============================================ */
-/* ========================================================================== */
-
-/* Change LL' to LDL', LDL' to LL', or leave as-is.
- *
- * If to_packed is TRUE, then the columns of L are packed and made monotonic
- * (to_monotonic is ignored; it is implicitly TRUE).
- *
- * If to_monotonic is TRUE but to_packed is FALSE, the columns of L are made
- * monotonic but not packed.
- *
- * If both to_packed and to_monotonic are FALSE, then the columns of L are
- * left as-is, and the conversion is done in place.
- *
- * If L is already monotonic, or if it is to be left non-monotonic, then this
- * conversion always succeeds.
- *
- * When converting an LDL' to LL' factorization, any column with a negative
- * or zero diagonal entry is not modified so that conversion back to LDL' will
- * succeed.  This can result in a matrix L with a negative entry on the diagonal
- * If the kth entry on the diagonal of D is negative, it and the kth column of
- * L are left unchanged.  A subsequent conversion back to an LDL' form will also
- * leave the column unchanged, so the correct LDL' factorization will be
- * restored.  L->minor is set to the smallest k for which D (k,k) is negative.
- */
-
-static void change_simplicial_numeric
-(
-    cholmod_factor *L,
-    int to_ll,
-    int to_packed,
-    int to_monotonic,
-    cholmod_common *Common
-)
-{
-    double grow0, grow1, xlen, xlnz ;
-    void *newLi, *newLx, *newLz ;
-    double *Lx, *Lz ;
-    Int *Lp, *Li, *Lnz ;
-    Int make_monotonic, grow2, n, j, lnz, len, grow, ok, make_ll, make_ldl ;
-    size_t nzmax0 ;
-
-    PRINT1 (("\n===Change simplicial numeric: %d %d %d\n",
-	    to_ll, to_packed, to_monotonic)) ;
-    DEBUG (CHOLMOD(dump_factor) (L, "change simplicial numeric", Common)) ;
-    ASSERT (L->xtype != CHOLMOD_PATTERN && !(L->is_super)) ;
-
-    make_monotonic = ((to_packed || to_monotonic) && !(L->is_monotonic)) ;
-    make_ll  = (to_ll && !(L->is_ll)) ;
-    make_ldl = (!to_ll && L->is_ll) ;
-
-    n = L->n ;
-    Lp = L->p ;
-    Li = L->i ;
-    Lx = L->x ;
-    Lz = L->z ;
-    Lnz = L->nz ;
-
-    grow = FALSE ;
-    grow0 = Common->grow0 ;
-    grow1 = Common->grow1 ;
-    grow2 = Common->grow2 ;
-    grow0 = IS_NAN (grow0) ? 1 : grow0 ;
-    grow1 = IS_NAN (grow1) ? 1 : grow1 ;
-    ok = TRUE ;
-    newLi = NULL ;
-    newLx = NULL ; 
-    newLz = NULL ; 
-    lnz = 0 ;
-
-    if (make_monotonic)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* Columns out of order, but will be reordered and optionally packed. */
-	/* ------------------------------------------------------------------ */
-
-	PRINT1 (("L is non-monotonic\n")) ;
-
-	/* compute new L->nzmax */
-	if (!to_packed)
-	{
-	    /* if any parameter is NaN, grow is false */
-	    /* fl.pt. comparisons below are false if any parameter is NaN */
-	    grow = (grow0 >= 1.0) && (grow1 >= 1.0) && (grow2 > 0) ;
-	}
-	for (j = 0 ; ok && j < n ; j++)
-	{
-	    len = Lnz [j] ;
-	    ASSERT (len >= 1 && len <= n-j) ;
-
-	    /* compute len in double to avoid integer overflow */
-	    if (grow)
-	    {
-		xlen = (double) len ;
-		xlen = grow1 * xlen + grow2 ;
-		xlen = MIN (xlen, n-j) ;
-		len = (Int) xlen ;
-	    }
-	    ASSERT (len >= Lnz [j] && len <= n-j) ;
-
-	    PRINT2 (("j: "ID" Lnz[j] "ID" len "ID" p "ID"\n",
-			j, Lnz [j], len, lnz)) ;
-
-	    lnz += len ;
-	    ok = (lnz >= 0) ;
-	}
-
-	if (!ok)
-	{
-	    ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	    return ;
-	}
-
-	if (grow)
-	{
-	    xlnz = (double) lnz ;
-	    xlnz *= grow0 ;
-	    xlnz = MIN (xlnz, Size_max) ;
-	    xlnz = MIN (xlnz, ((double) n * (double) n + (double) n) / 2) ;
-	    lnz = (Int) xlnz ;
-	}
-
-	lnz = MAX (1, lnz) ;
-	PRINT1 (("final lnz "ID"\n", lnz)) ;
-	nzmax0 = 0 ;
-
-	CHOLMOD(realloc_multiple) (lnz, 1, L->xtype, &newLi, NULL,
-		&newLx, &newLz, &nzmax0, Common) ;
-
-	if (Common->status < CHOLMOD_OK)
-	{
-	    return ;	    /* out of memory */
-	}
-    }
-
-    /* ============================================== commit the changes to L */
-
-    /* ---------------------------------------------------------------------- */
-    /* convert the simplicial L, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (L->xtype)
-    {
-
-	case CHOLMOD_REAL:
-	    r_change_simplicial_numeric (L, to_ll, to_packed,
-		    newLi, newLx, newLz, lnz, grow, grow1, grow2,
-		    make_ll, make_monotonic, make_ldl, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    c_change_simplicial_numeric (L, to_ll, to_packed,
-		    newLi, newLx, newLz, lnz, grow, grow1, grow2,
-		    make_ll, make_monotonic, make_ldl, Common) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    z_change_simplicial_numeric (L, to_ll, to_packed,
-		    newLi, newLx, newLz, lnz, grow, grow1, grow2,
-		    make_ll, make_monotonic, make_ldl, Common) ;
-	    break ;
-    }
-
-    DEBUG (CHOLMOD(dump_factor) (L, "L simplicial changed", Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === ll_super_to_simplicial_numeric ======================================= */
-/* ========================================================================== */
-
-/* Convert a supernodal numeric factorization to any simplicial numeric one.
- * Leaves L->xtype unchanged (real or complex, not zomplex since there is
- * no supernodal zomplex L). */
-
-static void ll_super_to_simplicial_numeric
-(
-    cholmod_factor *L,
-    int to_packed,
-    int to_ll,
-    cholmod_common *Common
-)
-{
-    Int *Ls, *Lpi, *Lpx, *Super, *Li ;
-    Int n, lnz, s, nsuper, psi, psend, nsrow, nscol, k1, k2, erows ;
-
-    DEBUG (CHOLMOD(dump_factor) (L, "start LL super to simplicial", Common)) ;
-    PRINT1 (("super -> simplicial (%d %d)\n", to_packed, to_ll)) ;
-    ASSERT (L->xtype != CHOLMOD_PATTERN && L->is_ll && L->is_super) ;
-    ASSERT (L->x != NULL && L->i == NULL) ;
-
-    n = L->n ;
-    nsuper = L->nsuper ;
-    Lpi = L->pi ;
-    Lpx = L->px ;
-    Ls = L->s ;
-    Super = L->super ;
-
-    /* Int overflow cannot occur since supernodal L already exists */
-
-    if (to_packed)
-    {
-	/* count the number of nonzeros in L.  Each supernode is of the form
-	 *
-	 *    l	. . .	    For this example, nscol = 4 (# columns). nsrow = 9.
-	 *    l l . .	    The "." entries are allocated in the supernodal
-	 *    l l l .	    factor, but not used.  They are not copied to the
-	 *    l l l l	    simplicial factor.  Some "l" and "e" entries may be
-	 *    e e e e	    numerically zero and even symbolically zero if a
-	 *    e e e e	    tight simplicial factorization or resymbol were
-	 *    e e e e	    done, because of numerical cancellation and relaxed
-	 *    e e e e	    supernode amalgamation, respectively.
-	 *    e e e e
-	 */
-	lnz = 0 ;
-	for (s = 0 ; s < nsuper ; s++)
-	{
-	    k1 = Super [s] ;
-	    k2 = Super [s+1] ;
-	    psi = Lpi [s] ;
-	    psend = Lpi [s+1] ;
-	    nsrow = psend - psi ;
-	    nscol = k2 - k1 ;
-	    ASSERT (nsrow >= nscol) ;
-	    erows = nsrow - nscol ;
-
-	    /* lower triangular part, including the diagonal,
-	     * counting the "l" terms in the figure above. */
-	    lnz += nscol * (nscol+1) / 2 ;
-
-	    /* rectangular part, below the diagonal block (the "e" terms) */
-	    lnz += nscol * erows ;
-	}
-	ASSERT (lnz <= (Int) (L->xsize)) ;
-    }
-    else
-    {
-	/* Li will be the same size as Lx */
-	lnz = L->xsize ;
-    }
-    ASSERT (lnz >= 0) ;
-    PRINT1 (("simplicial lnz = "ID"  to_packed: %d  to_ll: %d L->xsize %g\n",
-		lnz, to_ll, to_packed, (double) L->xsize)) ;
-
-    Li = CHOLMOD(malloc) (lnz, sizeof (Int), Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return ;	/* out of memory */
-    }
-
-    if (!allocate_simplicial_numeric (L, Common))
-    {
-	CHOLMOD(free) (lnz, sizeof (Int), Li, Common) ;
-	return ;	/* out of memory */
-    }
-
-    /* ============================================== commit the changes to L */
-
-    L->i = Li ;
-    L->nzmax = lnz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* convert the supernodal L, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (L->xtype)
-    {
-
-	case CHOLMOD_REAL:
-	    r_ll_super_to_simplicial_numeric (L, to_packed, to_ll, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    c_ll_super_to_simplicial_numeric (L, to_packed, to_ll, Common) ;
-	    break ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* free unused parts of L */
-    /* ---------------------------------------------------------------------- */
-
-    L->super = CHOLMOD(free) (nsuper+1, sizeof (Int), L->super, Common) ;
-    L->pi    = CHOLMOD(free) (nsuper+1, sizeof (Int), L->pi, Common) ;
-    L->px    = CHOLMOD(free) (nsuper+1, sizeof (Int), L->px, Common) ;
-    L->s     = CHOLMOD(free) (L->ssize, sizeof (Int), L->s, Common) ;
-
-    L->ssize = 0 ;
-    L->xsize = 0 ;
-    L->nsuper = 0 ;
-    L->maxesize = 0 ;
-    L->maxcsize = 0 ;
-
-    L->is_super = FALSE ;
-
-    DEBUG (CHOLMOD(dump_factor) (L, "done  LL super to simplicial", Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === super_symbolic_to_ll_super =========================================== */
-/* ========================================================================== */
-
-/* Convert a supernodal symbolic factorization to a supernodal numeric
- * factorization by allocating L->x.  Contents of L->x are undefined.
- */
-
-static int super_symbolic_to_ll_super
-(
-    int to_xtype,
-    cholmod_factor *L,
-    cholmod_common *Common
-)
-{
-    double *Lx ;
-    Int wentry = (to_xtype == CHOLMOD_REAL) ? 1 : 2 ;
-    PRINT1 (("convert super sym to num\n")) ;
-    ASSERT (L->xtype == CHOLMOD_PATTERN && L->is_super) ;
-    Lx = CHOLMOD(malloc) (L->xsize, wentry * sizeof (double), Common) ;
-    PRINT1 (("xsize %g\n", (double) L->xsize)) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;	/* out of memory */
-    }
-
-    /* ============================================== commit the changes to L */
-
-    if (L->xsize == 1)
-    {
-	/* the caller won't expect to access this entry, but some CHOLMOD
-	 * routines may.  Set it to zero so that valgrind doesn't complain. */
-	switch (to_xtype)
-	{
-	    case CHOLMOD_REAL:
-		Lx [0] = 0 ;
-		break ;
-
-	    case CHOLMOD_COMPLEX:
-		Lx [0] = 0 ;
-		Lx [1] = 0 ;
-		break ;
-	}
-    }
-
-    L->x = Lx ;
-    L->xtype = to_xtype ;
-    L->dtype = DTYPE ;
-    L->minor = L->n ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_change_factor ================================================ */
-/* ========================================================================== */
-
-/* Convert a factor L.  Some conversions simply allocate uninitialized space
- * that meant to be filled later.
- *
- * If the conversion fails, the factor is left in its original form, with one
- * exception.  Converting a supernodal symbolic factor to a simplicial numeric
- * one (with L=D=I) may leave the factor in simplicial symbolic form.
- *
- * Memory allocated for each conversion is listed below.
- */
-
-int CHOLMOD(change_factor)
-(
-    /* ---- input ---- */
-    int to_xtype,	/* convert to CHOLMOD_PATTERN, _REAL, _COMPLEX, or
-			 * _ZOMPLEX */
-    int to_ll,		/* TRUE: convert to LL', FALSE: LDL' */
-    int to_super,	/* TRUE: convert to supernodal, FALSE: simplicial */
-    int to_packed,	/* TRUE: pack simplicial columns, FALSE: do not pack */
-    int to_monotonic,	/* TRUE: put simplicial columns in order, FALSE: not */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (to_xtype < CHOLMOD_PATTERN || to_xtype > CHOLMOD_ZOMPLEX)
-    {
-	ERROR (CHOLMOD_INVALID, "xtype invalid") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    PRINT1 (("-----convert from (%d,%d,%d,%d,%d) to (%d,%d,%d,%d,%d)\n",
-    L->xtype, L->is_ll, L->is_super, L_is_packed (L, Common), L->is_monotonic,
-    to_xtype, to_ll,    to_super,    to_packed,               to_monotonic)) ;
-
-    /* ensure all parameters are TRUE/FALSE */
-    to_ll = BOOLEAN (to_ll) ;
-    to_super = BOOLEAN (to_super) ;
-
-    ASSERT (BOOLEAN (L->is_ll) == L->is_ll) ;
-    ASSERT (BOOLEAN (L->is_super) == L->is_super) ;
-
-    if (to_super && to_xtype == CHOLMOD_ZOMPLEX)
-    {
-	ERROR (CHOLMOD_INVALID, "supernodal zomplex L not supported") ;
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* convert */
-    /* ---------------------------------------------------------------------- */
-
-    if (to_xtype == CHOLMOD_PATTERN)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* convert to symbolic */
-	/* ------------------------------------------------------------------ */
-
-	if (!to_super)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* convert any factor into a simplicial symbolic factor */
-	    /* -------------------------------------------------------------- */
-
-	    any_to_simplicial_symbolic (L, to_ll, Common) ;    /* cannot fail */
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* convert to a supernodal symbolic factor */
-	    /* -------------------------------------------------------------- */
-
-	    if (L->xtype != CHOLMOD_PATTERN && L->is_super)
-	    {
-		/* convert from supernodal numeric to supernodal symbolic.
-		 * this preserves symbolic pattern of L, discards numeric
-		 * values */
-		ll_super_to_super_symbolic (L, Common) ;       /* cannot fail */
-	    }
-	    else if (L->xtype == CHOLMOD_PATTERN && !(L->is_super))
-	    {
-		/* convert from simplicial symbolic to supernodal symbolic.
-		 * contents of supernodal pattern are uninitialized.  Not meant
-		 * for the end user. */
-		simplicial_symbolic_to_super_symbolic (L, Common) ;
-	    }
-	    else
-	    {
-		/* cannot convert from simplicial numeric to supernodal
-		 * symbolic */
-		ERROR (CHOLMOD_INVALID,
-			"cannot convert L to supernodal symbolic") ;
-	    }
-	}
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* convert to numeric */
-	/* ------------------------------------------------------------------ */
-	    
-	if (to_super)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* convert to supernodal numeric factor */
-	    /* -------------------------------------------------------------- */
-
-	    if (L->xtype == CHOLMOD_PATTERN)
-	    {
-		if (L->is_super)
-		{
-		    /* Convert supernodal symbolic to supernodal numeric.
-		     * Contents of supernodal numeric values are uninitialized.
-		     * This is used by cholmod_super_numeric.  Not meant for
-		     * the end user. */
-		    super_symbolic_to_ll_super (to_xtype, L, Common) ;
-		}
-		else
-		{
-		    /* Convert simplicial symbolic to supernodal numeric.
-		     * Contents not defined.  This is used by
-		     * Core/cholmod_copy_factor only.  Not meant for the end
-		     * user. */
-		    if (!simplicial_symbolic_to_super_symbolic (L, Common))
-		    {
-			/* failure, convert back to simplicial symbolic */
-			any_to_simplicial_symbolic (L, to_ll, Common) ;
-		    }
-		    else
-		    {
-			/* conversion to super symbolic OK, allocate numeric
-			 * part */
-			super_symbolic_to_ll_super (to_xtype, L, Common) ;
-		    }
-		}
-	    }
-	    else
-	    {
-		/* nothing to do if L is already in supernodal numeric form */
-		if (!(L->is_super))
-		{
-		    ERROR (CHOLMOD_INVALID,
-			"cannot convert simplicial L to supernodal") ;
-		}
-		/* FUTURE WORK: convert to/from supernodal LL' and LDL' */
-	    }
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* convert any factor to simplicial numeric */
-	    /* -------------------------------------------------------------- */
-
-	    if (L->xtype == CHOLMOD_PATTERN && !(L->is_super))
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* convert simplicial symbolic to simplicial numeric (L=I,D=I)*/
-		/* ---------------------------------------------------------- */
-
-		simplicial_symbolic_to_simplicial_numeric (L, to_ll, to_packed,
-			to_xtype, Common) ;
-
-	    }
-	    else if (L->xtype != CHOLMOD_PATTERN && L->is_super)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* convert a supernodal LL' to simplicial numeric */
-		/* ---------------------------------------------------------- */
-
-		ll_super_to_simplicial_numeric (L, to_packed, to_ll, Common) ;
-
-	    }
-	    else if (L->xtype == CHOLMOD_PATTERN && L->is_super)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* convert a supernodal symbolic to simplicial numeric (L=D=I)*/
-		/* ---------------------------------------------------------- */
-
-		any_to_simplicial_symbolic (L, to_ll, Common) ;
-		/* if the following fails, it leaves the factor in simplicial
-		 * symbolic form */
-		simplicial_symbolic_to_simplicial_numeric (L, to_ll, to_packed,
-			to_xtype, Common) ;
-
-	    }
-	    else
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* change a simplicial numeric factor */
-		/* ---------------------------------------------------------- */
-
-		/* change LL' to LDL', LDL' to LL', or leave as-is.  pack the
-		 * columns of L, or leave as-is.  Ensure the columns are
-		 * monotonic, or leave as-is. */
-
-		change_simplicial_numeric (L, to_ll, to_packed, to_monotonic,
-			Common) ;
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    return (Common->status >= CHOLMOD_OK) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_common.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_common.c
deleted file mode 100644
index eabcb93..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_common.c
+++ /dev/null
@@ -1,747 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_common ================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Core utility routines for the cholmod_common object:
- *
- * Primary routines:
- * -----------------
- * cholmod_start		the first call to CHOLMOD
- * cholmod_finish		the last call to CHOLMOD
- *
- * Secondary routines:
- * -------------------
- * cholmod_defaults		restore (most) default control parameters
- * cholmod_allocate_work	allocate (or reallocate) workspace in Common
- * cholmod_free_work		free workspace in Common
- * cholmod_clear_flag		clear Common->Flag in workspace
- * cholmod_maxrank		column dimension of Common->Xwork workspace
- *
- * The Common object is unique.  It cannot be allocated or deallocated by
- * CHOLMOD, since it contains the definition of the memory management routines
- * used (pointers to malloc, free, realloc, and calloc, or their equivalent).
- * The Common object contains workspace that is used between calls to
- * CHOLMOD routines.  This workspace allocated by CHOLMOD as needed, by
- * cholmod_allocate_work and cholmod_free_work.
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-/* ========================================================================== */
-/* === cholmod_start ======================================================== */
-/* ========================================================================== */
-
-/* Initialize Common default parameters and statistics.  Sets workspace
- * pointers to NULL.
- *
- * This routine must be called just once, prior to calling any other CHOLMOD
- * routine.  Do not call this routine after any other CHOLMOD routine (except
- * cholmod_finish, to start a new CHOLMOD session), or a memory leak will
- * occur.
- *
- * workspace: none
- */
-
-int CHOLMOD(start)
-(
-    cholmod_common *Common
-)
-{
-    int k ;
-
-    if (Common == NULL)
-    {
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* user error handling routine */
-    /* ---------------------------------------------------------------------- */
-
-    Common->error_handler = NULL ;
-
-    /* ---------------------------------------------------------------------- */
-    /* integer and numerical types */
-    /* ---------------------------------------------------------------------- */
-
-    Common->itype = ITYPE ;
-    Common->dtype = DTYPE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* default control parameters */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(defaults) (Common) ;
-    Common->try_catch = FALSE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* memory management routines */
-    /* ---------------------------------------------------------------------- */
-
-        /* moved to SuiteSparse_config */
-
-    /* ---------------------------------------------------------------------- */
-    /* complex arithmetic routines */
-    /* ---------------------------------------------------------------------- */
-
-        /* moved to SuiteSparse_config */
-
-    /* ---------------------------------------------------------------------- */
-    /* print routine */
-    /* ---------------------------------------------------------------------- */
-
-        /* moved to SuiteSparse_config */
-
-    /* ---------------------------------------------------------------------- */
-    /* workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* This code assumes the workspace held in Common is not initialized.  If
-     * it is, then a memory leak will occur because the pointers are
-     * overwritten with NULL. */
-
-    Common->nrow = 0 ;
-    Common->mark = EMPTY ;
-    Common->xworksize = 0 ;
-    Common->iworksize = 0 ;
-    Common->Flag = NULL ;
-    Common->Head = NULL ;
-    Common->Iwork = NULL ;
-    Common->Xwork = NULL ;
-    Common->no_workspace_reallocate = FALSE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* statistics */
-    /* ---------------------------------------------------------------------- */
-
-    /* fl and lnz are computed in cholmod_analyze and cholmod_rowcolcounts */
-    Common->fl = EMPTY ;
-    Common->lnz = EMPTY ;
-
-    /* modfl is computed in cholmod_updown, cholmod_rowadd, and cholmod_rowdel*/
-    Common->modfl = EMPTY ;
-
-    /* all routines use status as their error-report code */
-    Common->status = CHOLMOD_OK ;
-
-    Common->malloc_count = 0 ;	/* # calls to malloc minus # calls to free */
-    Common->memory_usage = 0 ;	/* peak memory usage (in bytes) */
-    Common->memory_inuse = 0 ;	/* current memory in use (in bytes) */
-
-    Common->nrealloc_col = 0 ;
-    Common->nrealloc_factor = 0 ;
-    Common->ndbounds_hit = 0 ;
-    Common->rowfacfl = 0 ;
-    Common->aatfl = EMPTY ;
-
-    /* Common->called_nd is TRUE if cholmod_analyze called or NESDIS */
-    Common->called_nd = FALSE ;
-
-    Common->blas_ok = TRUE ;    /* false if BLAS int overflow occurs */
-
-    /* ---------------------------------------------------------------------- */
-    /* default SuiteSparseQR knobs and statististics */
-    /* ---------------------------------------------------------------------- */
-
-    for (k = 0 ; k < 10 ; k++) Common->SPQR_istat [k] = 0 ;
-
-    Common->SPQR_flopcount_bound = 0 ;   /* upper bound on flop count */
-    Common->SPQR_tol_used = 0 ;          /* tolerance used */
-    Common->SPQR_norm_E_fro = 0 ;        /* Frobenius norm of dropped entries */
-
-    Common->SPQR_grain = 1 ;    /* no Intel TBB multitasking, by default */
-    Common->SPQR_small = 1e6 ;  /* target min task size for TBB */
-    Common->SPQR_shrink = 1 ;   /* controls SPQR shrink realloc */
-    Common->SPQR_nthreads = 0 ; /* 0: let TBB decide how many threads to use */
-
-    Common->SPQR_flopcount = 0 ;         /* flop count for SPQR */
-    Common->SPQR_analyze_time = 0 ;      /* analysis time for SPQR */
-    Common->SPQR_factorize_time = 0 ;    /* factorize time for SPQR */
-    Common->SPQR_solve_time = 0 ;        /* backsolve time for SPQR */
-
-    /* ---------------------------------------------------------------------- */
-    /* GPU initializations */
-    /* ---------------------------------------------------------------------- */
-
-    /* these are destroyed by cholmod_gpu_deallocate and cholmod_gpu_end */
-    Common->cublasHandle = NULL ;
-    Common->cublasEventPotrf [0] = NULL ;
-    Common->cublasEventPotrf [1] = NULL ;
-    Common->cublasEventPotrf [2] = NULL ;
-    for (k = 0 ; k < CHOLMOD_HOST_SUPERNODE_BUFFERS ; k++)
-    {
-        Common->gpuStream [k] = NULL ;
-        Common->updateCBuffersFree [k] = NULL ;
-    }
-    Common->updateCKernelsComplete = NULL;
-
-    /* these are destroyed by cholmod_gpu_deallocate */
-    Common->dev_mempool = NULL;
-    Common->dev_mempool_size = 0;
-    Common->host_pinned_mempool = NULL;
-    Common->host_pinned_mempool_size = 0;
-
-    Common->syrkStart = 0 ;
-
-    Common->cholmod_cpu_gemm_time = 0 ;
-    Common->cholmod_cpu_syrk_time = 0 ;
-    Common->cholmod_cpu_trsm_time = 0 ;
-    Common->cholmod_cpu_potrf_time = 0 ;
-    Common->cholmod_gpu_gemm_time = 0 ;
-    Common->cholmod_gpu_syrk_time = 0 ;
-    Common->cholmod_gpu_trsm_time = 0 ;
-    Common->cholmod_gpu_potrf_time = 0 ;
-    Common->cholmod_assemble_time = 0 ;
-    Common->cholmod_assemble_time2 = 0 ;
-
-    Common->cholmod_cpu_gemm_calls = 0 ;
-    Common->cholmod_cpu_syrk_calls = 0 ;
-    Common->cholmod_cpu_trsm_calls = 0 ;
-    Common->cholmod_cpu_potrf_calls = 0 ;
-
-    Common->cholmod_gpu_gemm_calls = 0 ;
-    Common->cholmod_gpu_syrk_calls = 0 ;
-    Common->cholmod_gpu_trsm_calls = 0 ;
-    Common->cholmod_gpu_potrf_calls = 0 ;
-
-    Common->maxGpuMemBytes = 0;
-    Common->maxGpuMemFraction = 0.0;
-
-    /* SPQR statistics and settings */
-    Common->gpuMemorySize = 1 ;         /* default: no GPU memory available */
-    Common->gpuKernelTime = 0.0 ;
-    Common->gpuFlops = 0 ;
-    Common->gpuNumKernelLaunches = 0 ;
-
-    DEBUG_INIT ("cholmod start", Common) ;
-
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_defaults ===================================================== */
-/* ========================================================================== */
-
-/* Set Common default parameters, except for the function pointers.
- *
- * workspace: none
- */
-
-int CHOLMOD(defaults)
-(
-    cholmod_common *Common
-)
-{
-    Int i ;
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* default control parameters */
-    /* ---------------------------------------------------------------------- */
-
-    Common->dbound = 0.0 ;
-    Common->grow0 = 1.2 ;
-    Common->grow1 = 1.2 ;
-    Common->grow2 = 5 ;
-    Common->maxrank = 8 ;
-
-    Common->final_asis = TRUE ;
-    Common->final_super = TRUE ;
-    Common->final_ll = FALSE ;
-    Common->final_pack = TRUE ;
-    Common->final_monotonic = TRUE ;
-    Common->final_resymbol = FALSE ;
-
-    /* use simplicial factorization if flop/nnz(L) < 40, supernodal otherwise */
-    Common->supernodal = CHOLMOD_AUTO ;
-    Common->supernodal_switch = 40 ;
-
-    Common->nrelax [0] = 4 ;
-    Common->nrelax [1] = 16 ;
-    Common->nrelax [2] = 48 ;
-    Common->zrelax [0] = 0.8 ;
-    Common->zrelax [1] = 0.1 ;
-    Common->zrelax [2] = 0.05 ;
-
-    Common->prefer_zomplex = FALSE ;
-    Common->prefer_upper = TRUE ;
-    Common->prefer_binary = FALSE ;
-    Common->quick_return_if_not_posdef = FALSE ;
-
-    /* METIS workarounds */
-    Common->metis_memory = 0.0 ;    /* > 0 for memory guard (2 is reasonable) */
-    Common->metis_nswitch = 3000 ;
-    Common->metis_dswitch = 0.66 ;
-
-    Common->print = 3 ;
-    Common->precise = FALSE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* default ordering methods */
-    /* ---------------------------------------------------------------------- */
-
-    /* Note that if the Partition module is not installed, the CHOLMOD_METIS
-     * and CHOLMOD_NESDIS methods will not be available.  cholmod_analyze will
-     * report the CHOLMOD_NOT_INSTALLED error, and safely skip over them.
-     */
-
-#if (CHOLMOD_MAXMETHODS < 9)
-#error "CHOLMOD_MAXMETHODS must be 9 or more (defined in cholmod_core.h)."
-#endif
-
-    /* default strategy: try given, AMD, and then METIS if AMD reports high
-     * fill-in.  NESDIS can be used instead, if Common->default_nesdis is TRUE.
-     */
-    Common->nmethods = 0 ;		/* use default strategy */
-    Common->default_nesdis = FALSE ;	/* use METIS in default strategy */
-
-    Common->current = 0 ;	/* current method being tried */
-    Common->selected = 0 ;	/* the best method selected */
-
-    /* first, fill each method with default parameters */
-    for (i = 0 ; i <= CHOLMOD_MAXMETHODS ; i++)
-    {
-	/* CHOLMOD's default method is AMD for A or AA' */
-	Common->method [i].ordering = CHOLMOD_AMD ;
-
-	/* CHOLMOD nested dissection and minimum degree parameter */
-	Common->method [i].prune_dense = 10.0 ;	/* dense row/col control */
-
-	/* min degree parameters (AMD, COLAMD, SYMAMD, CAMD, CCOLAMD, CSYMAMD)*/
-	Common->method [i].prune_dense2 = -1 ;	/* COLAMD dense row control */
-	Common->method [i].aggressive = TRUE ;	/* aggressive absorption */
-	Common->method [i].order_for_lu = FALSE ;/* order for Cholesky not LU */
-
-	/* CHOLMOD's nested dissection (METIS + constrained AMD) */
-	Common->method [i].nd_small = 200 ;	/* small graphs aren't cut */
-	Common->method [i].nd_compress = TRUE ;	/* compress graph & subgraphs */
-	Common->method [i].nd_camd = 1 ;	/* use CAMD */
-	Common->method [i].nd_components = FALSE ;  /* lump connected comp. */
-	Common->method [i].nd_oksep = 1.0 ;	/* sep ok if < oksep*n */
-
-	/* statistics for each method are not yet computed */
-	Common->method [i].fl = EMPTY ;
-	Common->method [i].lnz = EMPTY ;
-    }
-
-    Common->postorder = TRUE ;	/* follow ordering with weighted postorder */
-
-    /* Next, define some methods.  The first five use default parameters. */
-    Common->method [0].ordering = CHOLMOD_GIVEN ;   /* skip if UserPerm NULL */
-    Common->method [1].ordering = CHOLMOD_AMD ;
-    Common->method [2].ordering = CHOLMOD_METIS ;
-    Common->method [3].ordering = CHOLMOD_NESDIS ;
-    Common->method [4].ordering = CHOLMOD_NATURAL ;
-
-    /* CHOLMOD's nested dissection with large leaves of separator tree */
-    Common->method [5].ordering = CHOLMOD_NESDIS ;
-    Common->method [5].nd_small = 20000 ;
-
-    /* CHOLMOD's nested dissection with tiny leaves, and no AMD ordering */
-    Common->method [6].ordering = CHOLMOD_NESDIS ;
-    Common->method [6].nd_small = 4 ;
-    Common->method [6].nd_camd = 0 ;		/* no CSYMAMD or CAMD */
-
-    /* CHOLMOD's nested dissection with no dense node removal */
-    Common->method [7].ordering = CHOLMOD_NESDIS ;
-    Common->method [7].prune_dense = -1. ;
-
-    /* COLAMD for A*A', AMD for A */
-    Common->method [8].ordering = CHOLMOD_COLAMD ;
-
-    /* ---------------------------------------------------------------------- */
-    /* GPU configuration and statistics */
-    /* ---------------------------------------------------------------------- */
-
-#ifdef DLONG
-    Common->useGPU = EMPTY ;
-#else
-    /* GPU acceleration is not supported for int version of CHOLMOD */
-    Common->useGPU = 0 ;
-#endif
-
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_finish ======================================================= */
-/* ========================================================================== */
-
-/* The last call to CHOLMOD must be cholmod_finish.  You may call this routine
- * more than once, and can safely call any other CHOLMOD routine after calling
- * it (including cholmod_start).
- *
- * The statistics and parameter settings in Common are preserved.  The
- * workspace in Common is freed.  This routine is just another name for
- * cholmod_free_work.
- */
-
-int CHOLMOD(finish)
-(
-    cholmod_common *Common
-)
-{
-    return (CHOLMOD(free_work) (Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_allocate_work ================================================ */
-/* ========================================================================== */
-
-/* Allocate and initialize workspace for CHOLMOD routines, or increase the size
- * of already-allocated workspace.  If enough workspace is already allocated,
- * then nothing happens.
- *
- * workspace: Flag (nrow), Head (nrow+1), Iwork (iworksize), Xwork (xworksize)
- */
-
-int CHOLMOD(allocate_work)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows in the matrix A */
-    size_t iworksize,	/* size of Iwork */
-    size_t xworksize,	/* size of Xwork */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *W ;
-    Int *Head ;
-    Int i ;
-    size_t nrow1 ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* Allocate Flag (nrow) and Head (nrow+1) */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = MAX (1, nrow) ;
-
-    /* nrow1 = nrow + 1 */
-    nrow1 = CHOLMOD(add_size_t) (nrow, 1, &ok) ;
-    if (!ok)
-    {
-	/* nrow+1 causes size_t overflow ; problem is too large */
-	Common->status = CHOLMOD_TOO_LARGE ;
-	CHOLMOD(free_work) (Common) ;
-	return (FALSE) ;
-    }
-
-    if (nrow > Common->nrow)
-    {
-
-	if (Common->no_workspace_reallocate)
-	{
-	    /* CHOLMOD is not allowed to change the workspace here */
-	    Common->status = CHOLMOD_INVALID ;
-	    return (FALSE) ;
-	}
-
-	/* free the old workspace (if any) and allocate new space */
-	Common->Flag = CHOLMOD(free) (Common->nrow,  sizeof (Int), Common->Flag,
-		Common) ;
-	Common->Head = CHOLMOD(free) (Common->nrow+1,sizeof (Int), Common->Head,
-		Common) ;
-	Common->Flag = CHOLMOD(malloc) (nrow,   sizeof (Int), Common) ;
-	Common->Head = CHOLMOD(malloc) (nrow1, sizeof (Int), Common) ;
-
-	/* record the new size of Flag and Head */
-	Common->nrow = nrow ;
-
-	if (Common->status < CHOLMOD_OK)
-	{
-	    CHOLMOD(free_work) (Common) ;
-	    return (FALSE) ;
-	}
-
-	/* initialize Flag and Head */
-	Common->mark = EMPTY ;
-	CHOLMOD(clear_flag) (Common) ;
-	Head = Common->Head ;
-	for (i = 0 ; i <= (Int) (nrow) ; i++)
-	{
-	    Head [i] = EMPTY ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* Allocate Iwork (iworksize) */
-    /* ---------------------------------------------------------------------- */
-
-    iworksize = MAX (1, iworksize) ;
-    if (iworksize > Common->iworksize)
-    {
-
-	if (Common->no_workspace_reallocate)
-	{
-	    /* CHOLMOD is not allowed to change the workspace here */
-	    Common->status = CHOLMOD_INVALID ;
-	    return (FALSE) ;
-	}
-
-	/* free the old workspace (if any) and allocate new space.
-	 * integer overflow safely detected in cholmod_malloc */
-	CHOLMOD(free) (Common->iworksize, sizeof (Int), Common->Iwork, Common) ;
-	Common->Iwork = CHOLMOD(malloc) (iworksize, sizeof (Int), Common) ;
-
-	/* record the new size of Iwork */
-	Common->iworksize = iworksize ;
-
-	if (Common->status < CHOLMOD_OK)
-	{
-	    CHOLMOD(free_work) (Common) ;
-	    return (FALSE) ;
-	}
-
-	/* note that Iwork does not need to be initialized */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* Allocate Xwork (xworksize) and set it to ((double) 0.) */
-    /* ---------------------------------------------------------------------- */
-
-    /* make sure xworksize is >= 1 */
-    xworksize = MAX (1, xworksize) ;
-    if (xworksize > Common->xworksize)
-    {
-
-	if (Common->no_workspace_reallocate)
-	{
-	    /* CHOLMOD is not allowed to change the workspace here */
-	    Common->status = CHOLMOD_INVALID ;
-	    return (FALSE) ;
-	}
-
-	/* free the old workspace (if any) and allocate new space */
-	CHOLMOD(free) (Common->xworksize, sizeof (double), Common->Xwork,
-		Common) ;
-	Common->Xwork = CHOLMOD(malloc) (xworksize, sizeof (double), Common) ;
-
-	/* record the new size of Xwork */
-	Common->xworksize = xworksize ;
-
-	if (Common->status < CHOLMOD_OK)
-	{
-	    CHOLMOD(free_work) (Common) ;
-	    return (FALSE) ;
-	}
-
-	/* initialize Xwork */
-	W = Common->Xwork ;
-	for (i = 0 ; i < (Int) xworksize ; i++)
-	{
-	    W [i] = 0. ;
-	}
-    }
-
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_free_work ==================================================== */
-/* ========================================================================== */
-
-/* Deallocate the CHOLMOD workspace.
- *
- * workspace: deallocates all workspace in Common
- */
-
-int CHOLMOD(free_work)
-(
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->Flag  = CHOLMOD(free) (Common->nrow, sizeof (Int),
-	    Common->Flag, Common) ;
-    Common->Head  = CHOLMOD(free) (Common->nrow+1, sizeof (Int),
-	    Common->Head, Common) ;
-    Common->Iwork = CHOLMOD(free) (Common->iworksize, sizeof (Int),
-	    Common->Iwork, Common) ;
-    Common->Xwork = CHOLMOD(free) (Common->xworksize, sizeof (double),
-	    Common->Xwork, Common) ;
-    Common->nrow = 0 ;
-    Common->iworksize = 0 ;
-    Common->xworksize = 0 ;
-
-#ifdef GPU_BLAS
-    CHOLMOD(gpu_deallocate) (Common) ;
-#endif
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_clear_flag =================================================== */
-/* ========================================================================== */
-
-/* Increment mark to ensure Flag [0..nrow-1] < mark.  If integer overflow
- * occurs, or mark was initially negative, reset the entire array.  This is
- * not an error condition, but an intended function of the Flag workspace.
- *
- * workspace: Flag (nrow).  Does not modify Flag if nrow is zero.
- */
-
-SuiteSparse_long CHOLMOD(clear_flag)
-(
-    cholmod_common *Common
-)
-{
-    Int i, nrow, *Flag ;
-
-    RETURN_IF_NULL_COMMON (-1) ;
-
-    Common->mark++ ;
-    if (Common->mark <= 0)
-    {
-	nrow = Common->nrow ;
-	Flag = Common->Flag ;
-	PRINT2 (("reset Flag: nrow "ID"\n", nrow)) ;
-	PRINT2 (("reset Flag: mark %ld\n", Common->mark)) ;
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    Flag [i] = EMPTY ;
-	}
-	Common->mark = 0 ;
-    }
-    return (Common->mark) ;
-}
-
-
-/* ========================================================================== */
-/* ==== cholmod_maxrank ===================================================== */
-/* ========================================================================== */
-
-/* Find a valid value of Common->maxrank.  Returns 0 if error, or 2, 4, or 8
- * if successful. */
-
-size_t CHOLMOD(maxrank)	/* returns validated value of Common->maxrank */
-(
-    /* ---- input ---- */
-    size_t n,		/* A and L will have n rows */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    size_t maxrank ;
-    RETURN_IF_NULL_COMMON (0) ;
-    maxrank = Common->maxrank ;
-    if (n > 0)
-    {
-	/* Ensure maxrank*n*sizeof(double) does not result in integer overflow.
-	 * If n is so large that 2*n*sizeof(double) results in integer overflow
-	 * (n = 268,435,455 if an Int is 32 bits), then maxrank will be 0 or 1,
-	 * but maxrank will be set to 2 below.  2*n will not result in integer
-	 * overflow, and CHOLMOD will run out of memory or safely detect integer
-	 * overflow elsewhere.
-	 */
-	maxrank = MIN (maxrank, Size_max / (n * sizeof (double))) ;
-    }
-    if (maxrank <= 2)
-    {
-	maxrank = 2 ;
-    }
-    else if (maxrank <= 4)
-    {
-	maxrank = 4 ;
-    }
-    else
-    {
-	maxrank = 8 ;
-    }
-    return (maxrank) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dbound ======================================================= */
-/* ========================================================================== */
-
-/* Ensure the absolute value of a diagonal entry, D (j,j), is greater than
- * Common->dbound.  This routine is not meant for the user to call.  It is used
- * by the various LDL' factorization and update/downdate routines.  The
- * default value of Common->dbound is zero, and in that case this routine is not
- * called at all.  No change is made if D (j,j) is NaN.  CHOLMOD does not call
- * this routine if Common->dbound is NaN.
- */
-
-double CHOLMOD(dbound)	/* returns modified diagonal entry of D */
-(
-    /* ---- input ---- */
-    double dj,		/* diagonal entry of D, for LDL' factorization */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double dbound ;
-    RETURN_IF_NULL_COMMON (0) ;
-    if (!IS_NAN (dj))
-    {
-	dbound = Common->dbound ;
-	if (dj < 0)
-	{
-	    if (dj > -dbound)
-	    {
-		dj = -dbound ;
-		Common->ndbounds_hit++ ;
-		if (Common->status == CHOLMOD_OK)
-		{
-		    ERROR (CHOLMOD_DSMALL, "diagonal below threshold") ;
-		}
-	    }
-	}
-	else
-	{
-	    if (dj < dbound)
-	    {
-		dj = dbound ;
-		Common->ndbounds_hit++ ;
-		if (Common->status == CHOLMOD_OK)
-		{
-		    ERROR (CHOLMOD_DSMALL, "diagonal below threshold") ;
-		}
-	    }
-	}
-    }
-    return (dj) ;
-}
-
-
-/* ========================================================================== */
-/* === scorecomp ============================================================ */
-/* ========================================================================== */
-
-/* For sorting descendant supernodes with qsort */
-int CHOLMOD(score_comp) (struct cholmod_descendant_score_t *i, 
-			       struct cholmod_descendant_score_t *j)
-{
-  if ((*i).score < (*j).score)
-    {
-	return (1) ;
-    }
-    else
-    {
-	return (-1) ;
-    }
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_complex.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_complex.c
deleted file mode 100644
index b25a693..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_complex.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_complex ================================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* If you convert a matrix that contains uninitialized data, valgrind will
- * complain.  This can occur in a factor L which has gaps (a partial
- * factorization, or after updates that change the nonzero pattern), an
- * unpacked sparse matrix, a dense matrix with leading dimension d > # of rows,
- * or any matrix (dense, sparse, triplet, or factor) with more space allocated
- * than is used.  You can safely ignore any of these complaints by valgrind. */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-/* ========================================================================== */
-/* === cholmod_hypot ======================================================== */
-/* ========================================================================== */
-
-double CHOLMOD(hypot) (double x, double y)
-{
-    return (SuiteSparse_config.hypot_func (x, y)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_divcomplex =================================================== */
-/* ========================================================================== */
-
-/* c = a/b where c, a, and b are complex.  The real and imaginary parts are
- * passed as separate arguments to this routine.  The NaN case is ignored
- * for the double relop br >= bi.  Returns 1 if the denominator is zero,
- * 0 otherwise.  Note that this return value is the single exception to the
- * rule that all CHOLMOD routines that return int return TRUE if successful
- * or FALSE otherise.
- *
- * This uses ACM Algo 116, by R. L. Smith, 1962, which tries to avoid
- * underflow and overflow.
- *
- * c can be the same variable as a or b.
- *
- * Default value of the SuiteSparse_config.divcomplex_func pointer is
- * SuiteSparse_divcomplex, located in SuiteSparse_config.c.
- */
-
-int CHOLMOD(divcomplex)
-(
-    double ar, double ai,	/* real and imaginary parts of a */
-    double br, double bi,	/* real and imaginary parts of b */
-    double *cr, double *ci	/* real and imaginary parts of c */
-)
-{
-    return (SuiteSparse_config.divcomplex_func (ar, ai, br, bi, cr, ci)) ;
-}
-
-
-/* ========================================================================== */
-/* === change_complexity ==================================================== */
-/* ========================================================================== */
-
-/* X and Z represent an array of size nz, with numeric xtype given by xtype_in.
- *
- * If xtype_in is:
- * CHOLMOD_PATTERN: X and Z must be NULL.
- * CHOLMOD_REAL:    X is of size nz, Z must be NULL.
- * CHOLMOD_COMPLEX: X is of size 2*nz, Z must be NULL.
- * CHOLMOD_ZOMPLEX: X is of size nz, Z is of size nz.
- *
- * The array is changed into the numeric xtype given by xtype_out, with the
- * same definitions of X and Z above.  Note that the input conditions, above,
- * are not checked.  These are checked in the caller routine.
- *
- * Returns TRUE if successful, FALSE otherwise.  X and Z are not modified if
- * not successful.
- */
-
-static int change_complexity
-(
-    /* ---- input ---- */
-    Int nz,		/* size of X and/or Z */
-    int xtype_in,	/* xtype of X and Z on input */
-    int xtype_out,	/* requested xtype of X and Z on output */
-    int xtype1,		/* xtype_out must be in the range [xtype1 .. xtype2] */
-    int xtype2,
-    /* ---- in/out --- */
-    void **XX,		/* old X on input, new X on output */
-    void **ZZ,		/* old Z on input, new Z on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Xold, *Zold, *Xnew, *Znew ;
-    Int k ;
-    size_t nz2 ;
-
-    if (xtype_out < xtype1 || xtype_out > xtype2)
-    {
-	ERROR (CHOLMOD_INVALID, "invalid xtype") ;
-	return (FALSE) ;
-    }
-
-    Common->status = CHOLMOD_OK ;
-    Xold = *XX ;
-    Zold = *ZZ ;
-
-    switch (xtype_in)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* converting from pattern */
-	/* ------------------------------------------------------------------ */
-
-	case CHOLMOD_PATTERN:
-
-	    switch (xtype_out)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* pattern -> real */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_REAL:
-		    /* allocate X and set to all ones */
-		    Xnew = CHOLMOD(malloc) (nz, sizeof (double), Common) ;
-		    if (Common->status < CHOLMOD_OK)
-		    {
-			return (FALSE) ;
-		    }
-		    for (k = 0 ; k < nz ; k++)
-		    {
-			Xnew [k] = 1 ;
-		    }
-		    *XX = Xnew ;
-		    break ;
-
-		/* ---------------------------------------------------------- */
-		/* pattern -> complex */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_COMPLEX:
-		    /* allocate X and set to all ones */
-		    Xnew = CHOLMOD(malloc) (nz, 2*sizeof (double), Common) ;
-		    if (Common->status < CHOLMOD_OK)
-		    {
-			return (FALSE) ;
-		    }
-		    for (k = 0 ; k < nz ; k++)
-		    {
-			Xnew [2*k  ] = 1 ;
-			Xnew [2*k+1] = 0 ;
-		    }
-		    *XX = Xnew ;
-		    break ;
-
-		/* ---------------------------------------------------------- */
-		/* pattern -> zomplex */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_ZOMPLEX:
-		    /* allocate X and Z and set to all ones */
-		    Xnew = CHOLMOD(malloc) (nz, sizeof (double), Common) ;
-		    Znew = CHOLMOD(malloc) (nz, sizeof (double), Common) ;
-		    if (Common->status < CHOLMOD_OK)
-		    {
-			CHOLMOD(free) (nz, sizeof (double), Xnew, Common) ;
-			CHOLMOD(free) (nz, sizeof (double), Znew, Common) ;
-			return (FALSE) ;
-		    }
-		    for (k = 0 ; k < nz ; k++)
-		    {
-			Xnew [k] = 1 ;
-			Znew [k] = 0 ;
-		    }
-		    *XX = Xnew ;
-		    *ZZ = Znew ;
-		    break ;
-	    }
-	    break ;
-
-	/* ------------------------------------------------------------------ */
-	/* converting from real */
-	/* ------------------------------------------------------------------ */
-
-	case CHOLMOD_REAL:
-
-	    switch (xtype_out)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* real -> pattern */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_PATTERN:
-		    /* free X */
-		    *XX = CHOLMOD(free) (nz, sizeof (double), *XX, Common) ;
-		    break ;
-
-		/* ---------------------------------------------------------- */
-		/* real -> complex */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_COMPLEX:
-		    /* allocate a new X and copy the old X */
-		    Xnew = CHOLMOD(malloc) (nz, 2*sizeof (double), Common) ;
-		    if (Common->status < CHOLMOD_OK)
-		    {
-			return (FALSE) ;
-		    }
-		    for (k = 0 ; k < nz ; k++)
-		    {
-			Xnew [2*k  ] = Xold [k] ;
-			Xnew [2*k+1] = 0 ;
-		    }
-		    CHOLMOD(free) (nz, sizeof (double), *XX, Common) ;
-		    *XX = Xnew ;
-		    break ;
-
-		/* ---------------------------------------------------------- */
-		/* real -> zomplex */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_ZOMPLEX:
-		    /* allocate a new Z and set it to zero */
-		    Znew = CHOLMOD(malloc) (nz, sizeof (double), Common) ;
-		    if (Common->status < CHOLMOD_OK)
-		    {
-			return (FALSE) ;
-		    }
-		    for (k = 0 ; k < nz ; k++)
-		    {
-			Znew [k] = 0 ;
-		    }
-		    *ZZ = Znew ;
-		    break ;
-	    }
-	    break ;
-
-	/* ------------------------------------------------------------------ */
-	/* converting from complex */
-	/* ------------------------------------------------------------------ */
-
-	case CHOLMOD_COMPLEX:
-
-	    switch (xtype_out)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* complex -> pattern */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_PATTERN:
-		    /* free X */
-		    *XX = CHOLMOD(free) (nz, 2*sizeof (double), *XX, Common) ;
-		    break ;
-
-		/* ---------------------------------------------------------- */
-		/* complex -> real */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_REAL:
-		    /* pack the real part of X, discarding the imaginary part */
-		    for (k = 0 ; k < nz ; k++)
-		    {
-			Xold [k] = Xold [2*k] ;
-		    }
-		    /* shrink X in half (this cannot fail) */
-		    nz2 = 2*nz ;
-		    *XX = CHOLMOD(realloc) (nz, sizeof (double), *XX, &nz2,
-			    Common) ;
-		    break ;
-
-		/* ---------------------------------------------------------- */
-		/* complex -> zomplex */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_ZOMPLEX:
-		    /* allocate X and Z and copy the old X into them */
-		    Xnew = CHOLMOD(malloc) (nz, sizeof (double), Common) ;
-		    Znew = CHOLMOD(malloc) (nz, sizeof (double), Common) ;
-		    if (Common->status < CHOLMOD_OK)
-		    {
-			CHOLMOD(free) (nz, sizeof (double), Xnew, Common) ;
-			CHOLMOD(free) (nz, sizeof (double), Znew, Common) ;
-			return (FALSE) ;
-		    }
-		    for (k = 0 ; k < nz ; k++)
-		    {
-			Xnew [k] = Xold [2*k  ] ;
-			Znew [k] = Xold [2*k+1] ;
-		    }
-		    CHOLMOD(free) (nz, 2*sizeof (double), *XX, Common) ;
-		    *XX = Xnew ;
-		    *ZZ = Znew ;
-		    break ;
-	    }
-	    break ;
-
-	/* ------------------------------------------------------------------ */
-	/* converting from zomplex */
-	/* ------------------------------------------------------------------ */
-
-	case CHOLMOD_ZOMPLEX:
-
-	    switch (xtype_out)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* zomplex -> pattern */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_PATTERN:
-		    /* free X and Z */
-		    *XX = CHOLMOD(free) (nz, sizeof (double), *XX, Common) ;
-		    *ZZ = CHOLMOD(free) (nz, sizeof (double), *ZZ, Common) ;
-		    break ;
-
-		/* ---------------------------------------------------------- */
-		/* zomplex -> real */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_REAL:
-		    /* free the imaginary part */
-		    *ZZ = CHOLMOD(free) (nz, sizeof (double), *ZZ, Common) ;
-		    break ;
-
-		/* ---------------------------------------------------------- */
-		/* zomplex -> complex */
-		/* ---------------------------------------------------------- */
-
-		case CHOLMOD_COMPLEX:
-		    Xnew = CHOLMOD(malloc) (nz, 2*sizeof (double), Common) ;
-		    if (Common->status < CHOLMOD_OK)
-		    {
-			return (FALSE) ;
-		    }
-		    for (k = 0 ; k < nz ; k++)
-		    {
-			Xnew [2*k  ] = Xold [k] ;
-			Xnew [2*k+1] = Zold [k] ;
-		    }
-		    CHOLMOD(free) (nz, sizeof (double), *XX, Common) ;
-		    CHOLMOD(free) (nz, sizeof (double), *ZZ, Common) ;
-		    *XX = Xnew ;
-		    *ZZ = NULL ;
-		    break ;
-
-	    }
-	    break ;
-    }
-
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_sparse_xtype ================================================= */
-/* ========================================================================== */
-
-/* Change the numeric xtype of a sparse matrix.  Supports any type on input
- * and output (pattern, real, complex, or zomplex). */
-
-int CHOLMOD(sparse_xtype)
-(
-    /* ---- input ---- */
-    int to_xtype,	/* requested xtype */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* sparse matrix to change */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int ok ;
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-
-    ok = change_complexity (A->nzmax, A->xtype, to_xtype,
-	    CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, &(A->x), &(A->z), Common) ;
-    if (ok)
-    {
-	A->xtype = to_xtype ;
-    }
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_triplet_xtype ================================================ */
-/* ========================================================================== */
-
-/* Change the numeric xtype of a triplet matrix.  Supports any type on input
- * and output (pattern, real, complex, or zomplex). */
-
-int CHOLMOD(triplet_xtype)
-(
-    /* ---- input ---- */
-    int to_xtype,	/* requested xtype */
-    /* ---- in/out --- */
-    cholmod_triplet *T,	/* triplet matrix to change */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int ok ;
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (T, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (T, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    ok = change_complexity (T->nzmax, T->xtype, to_xtype,
-	    CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, &(T->x), &(T->z), Common) ;
-    if (ok)
-    {
-	T->xtype = to_xtype ;
-    }
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dense_xtype ================================================= */
-/* ========================================================================== */
-
-/* Change the numeric xtype of a dense matrix.  Supports real, complex or
- * zomplex on input and output */
-
-int CHOLMOD(dense_xtype)
-(
-    /* ---- input ---- */
-    int to_xtype,	/* requested xtype */
-    /* ---- in/out --- */
-    cholmod_dense *X,	/* dense matrix to change */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int ok ;
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (X, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    ok = change_complexity (X->nzmax, X->xtype, to_xtype,
-	    CHOLMOD_REAL, CHOLMOD_ZOMPLEX, &(X->x), &(X->z), Common) ;
-    if (ok)
-    {
-	X->xtype = to_xtype ;
-    }
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_factor_xtype ================================================= */
-/* ========================================================================== */
-
-/* Change the numeric xtype of a factor.  Supports real, complex or zomplex on
- * input and output.   Supernodal zomplex factors are not supported. */
-
-int CHOLMOD(factor_xtype)
-(
-    /* ---- input ---- */
-    int to_xtype,	/* requested xtype */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to change */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int ok ;
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (L->is_super &&
-	    (L->xtype == CHOLMOD_ZOMPLEX || to_xtype == CHOLMOD_ZOMPLEX))
-    {
-	ERROR (CHOLMOD_INVALID, "invalid xtype for supernodal L") ;
-	return (FALSE) ;
-    }
-    ok = change_complexity ((L->is_super ? L->xsize : L->nzmax), L->xtype,
-	    to_xtype, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, &(L->x), &(L->z), Common) ;
-    if (ok)
-    {
-	L->xtype = to_xtype ;
-    }
-    return (ok) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_copy.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_copy.c
deleted file mode 100644
index 9ceb394..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_copy.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_copy ==================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* C = A, which allocates C and copies A into C, with possible change of
- * stype.  The diagonal can optionally be removed.  The numerical entries
- * can optionally be copied.  This routine differs from cholmod_copy_sparse,
- * which makes an exact copy of a sparse matrix.
- *
- * A can be of any type (packed/unpacked, upper/lower/unsymmetric).  C is
- * packed and can be of any stype (upper/lower/unsymmetric), except that if
- * A is rectangular C can only be unsymmetric.  If the stype of A and C
- * differ, then the appropriate conversion is made.
- *
- * Symmetry of A (A->stype):
- * <0: lower: assume A is symmetric with just tril(A); the rest of A is ignored
- *  0  unsym: assume A is unsymmetric; consider all entries in A
- * >0  upper: assume A is symmetric with just triu(A); the rest of A is ignored
- *
- * Symmetry of C (stype parameter):
- * <0  lower: return just tril(C)
- *  0  unsym: return all of C
- * >0  upper: return just triu(C)
- *
- * In MATLAB:					    Using cholmod_copy:
- * ----------					    ----------------------------
- * C = A ;					    A unsymmetric, C unsymmetric
- * C = tril (A) ;				    A unsymmetric, C lower
- * C = triu (A) ;				    A unsymmetric, C upper
- * U = triu (A) ; L = tril (U',-1) ; C = L+U ;	    A upper, C unsymmetric
- * C = triu (A)' ;				    A upper, C lower
- * C = triu (A) ;				    A upper, C upper
- * L = tril (A) ; U = triu (L',1) ; C = L+U ;	    A lower, C unsymmetric
- * C = tril (A) ;				    A lower, C lower
- * C = tril (A)' ;				    A lower, C upper
- *
- * workspace: Iwork (max (nrow,ncol))
- *
- * A can have an xtype of pattern or real.  Complex and zomplex cases only
- * supported when mode <= 0 (in which case the numerical values are ignored).
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-
-/* ========================================================================== */
-/* === copy_sym_to_unsym ==================================================== */
-/* ========================================================================== */
-
-/* Construct an unsymmetric copy of a symmetric sparse matrix.  This does the
- * work for as C = cholmod_copy (A, 0, mode, Common) when A is symmetric.
- * In this case, extra space can be added to C.
- */
-
-static cholmod_sparse *copy_sym_to_unsym
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag)
-			 * -2: pattern only, no diagonal, add 50% + n extra
-			 * space to C */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double aij ;
-    double *Ax, *Cx ;
-    Int *Ap, *Ai, *Anz, *Cp, *Ci, *Wj, *Iwork ;
-    cholmod_sparse *C ;
-    Int nrow, ncol, nz, packed, j, p, pend, i, pc, up, lo, values, diag,
-	astype, extra ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    packed = A->packed ;
-    values = (mode > 0) && (A->xtype != CHOLMOD_PATTERN) ;
-    diag = (mode >= 0) ;
-
-    astype = SIGN (A->stype) ;
-    up = (astype > 0) ;
-    lo = (astype < 0) ;
-    ASSERT (astype != 0) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* create an unsymmetric copy of a symmetric matrix */
-    /* ---------------------------------------------------------------------- */
-
-    Iwork = Common->Iwork ;
-    Wj = Iwork ;		    /* size ncol (i/i/l) */
-
-    /* In MATLAB notation, for converting a symmetric/upper matrix:
-     *	U = triu (A) ;
-     *	L = tril (U',-1) ;
-     *	C = L + U ;
-     *
-     * For converting a symmetric/lower matrix to unsymmetric:
-     *	L = tril (A) ;
-     *	U = triu (L',1) ;
-     *	C = L + U ;
-     */
-    ASSERT (up || lo) ;
-    PRINT1 (("copy: convert symmetric to unsym\n")) ;
-
-    /* count the number of entries in each column of C */
-    for (j = 0 ; j < ncol ; j++)
-    {
-	Wj [j] = 0 ;
-    }
-    for (j = 0 ; j < ncol ; j++)
-    {
-	p = Ap [j] ;
-	pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	for ( ; p < pend ; p++)
-	{
-	    i = Ai [p] ;
-	    if (i == j)
-	    {
-		/* the diagonal entry A(i,i) will appear just once
-		 * (unless it is excluded with mode < 0) */
-		if (diag)
-		{
-		    Wj [j]++ ;
-		}
-	    }
-	    else if ((up && i < j) || (lo && i > j))
-	    {
-		/* upper case:  A(i,j) is in the strictly upper part;
-		 * A(j,i) will be added to the strictly lower part of C.
-		 * lower case is the opposite. */
-		Wj [j]++ ;
-		Wj [i]++ ;
-	    }
-	}
-    }
-    nz = 0 ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	nz += Wj [j] ;
-    }
-
-    extra = (mode == -2) ? (nz/2 + ncol) : 0 ;
-
-    /* allocate C.  C is sorted if and only if A is sorted */
-    C = CHOLMOD(allocate_sparse) (nrow, ncol, nz + extra, A->sorted, TRUE, 0,
-	    values ? A->xtype : CHOLMOD_PATTERN, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;
-    }
-
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-
-    /* construct the column pointers for C */
-    p = 0 ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	Cp [j] = p ;
-	p += Wj [j] ;
-    }
-    Cp [ncol] = p ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	Wj [j] = Cp [j] ;
-    }
-
-    /* construct C */
-    if (values)
-    {
-
-	/* pattern and values */
-	ASSERT (diag) ;
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		aij = Ax [p] ;
-		if (i == j)
-		{
-		    /* add diagonal entry A(i,i) to column i */
-		    pc = Wj [i]++ ;
-		    Ci [pc] = i ;
-		    Cx [pc] = aij ;
-		}
-		else if ((up && i < j) || (lo && i > j))
-		{
-		    /* add A(i,j) to column j */
-		    pc = Wj [j]++ ;
-		    Ci [pc] = i ;
-		    Cx [pc] = aij ;
-		    /* add A(j,i) to column i */
-		    pc = Wj [i]++ ;
-		    Ci [pc] = j ;
-		    Cx [pc] = aij ;
-		}
-	    }
-	}
-
-    }
-    else
-    {
-
-	/* pattern only, possibly excluding the diagonal */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		if (i == j)
-		{
-		    /* add diagonal entry A(i,i) to column i
-		     * (unless it is excluded with mode < 0) */
-		    if (diag)
-		    {
-			Ci [Wj [i]++] = i ;
-		    }
-		}
-		else if ((up && i < j) || (lo && i > j))
-		{
-		    /* add A(i,j) to column j */
-		    Ci [Wj [j]++] = i ;
-		    /* add A(j,i) to column i */
-		    Ci [Wj [i]++] = j ;
-		}
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the result */
-    /* ---------------------------------------------------------------------- */
-
-    DEBUG (i = CHOLMOD(dump_sparse) (C, "copy_sym_to_unsym", Common)) ;
-    PRINT1 (("mode %d nnzdiag "ID"\n", mode, i)) ;
-    ASSERT (IMPLIES (mode < 0, i == 0)) ;
-    return (C) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_copy ========================================================= */
-/* ========================================================================== */
-
-cholmod_sparse *CHOLMOD(copy)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    int stype,		/* requested stype of C */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag) */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *C ;
-    Int nrow, ncol, up, lo, values, diag, astype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    values = (mode > 0) && (A->xtype != CHOLMOD_PATTERN) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-    if ((stype || A->stype) && nrow != ncol)
-    {
-	/* inputs invalid */
-	ERROR (CHOLMOD_INVALID, "matrix invalid") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(allocate_work) (0, MAX (nrow,ncol), 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    diag = (mode >= 0) ;
-    astype = SIGN (A->stype) ;
-    stype = SIGN (stype) ;
-    up = (astype > 0) ;
-    lo = (astype < 0) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* copy the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    if (astype == stype)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* symmetry of A and C are the same */
-	/* ------------------------------------------------------------------ */
-
-	/* copy A into C, keeping the same symmetry.  If A is symmetric
-	 * entries in the ignored part of A are not copied into C */
-	C = CHOLMOD(band) (A, -nrow, ncol, mode, Common) ;
-
-    }
-    else if (!astype)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* convert unsymmetric matrix A into a symmetric matrix C */
-	/* ------------------------------------------------------------------ */
-
-	if (stype > 0)
-	{
-	    /* C = triu (A) */
-	    C = CHOLMOD(band) (A, 0, ncol, mode, Common) ;
-	}
-	else
-	{
-	    /* C = tril (A) */
-	    C = CHOLMOD(band) (A, -nrow, 0, mode, Common) ;
-	}
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    return (NULL) ;
-	}
-	C->stype = stype ;
-
-    }
-    else if (astype == -stype)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* transpose a symmetric matrix */
-	/* ------------------------------------------------------------------ */
-
-	/* converting upper to lower or lower to upper */
-	/* workspace: Iwork (nrow) */
-	C = CHOLMOD(transpose) (A, values, Common) ;
-	if (!diag)
-	{
-	    /* remove diagonal, if requested */
-	    CHOLMOD(band_inplace) (-nrow, ncol, -1, C, Common) ;
-	}
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* create an unsymmetric copy of a symmetric matrix */
-	/* ------------------------------------------------------------------ */
-
-	C = copy_sym_to_unsym (A, mode, Common) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return if error */
-    /* ---------------------------------------------------------------------- */
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the result */
-    /* ---------------------------------------------------------------------- */
-
-    DEBUG (diag = CHOLMOD(dump_sparse) (C, "copy", Common)) ;
-    PRINT1 (("mode %d nnzdiag "ID"\n", mode, diag)) ;
-    ASSERT (IMPLIES (mode < 0, diag == 0)) ;
-    return (C) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_dense.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_dense.c
deleted file mode 100644
index c54ad67..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_dense.c
+++ /dev/null
@@ -1,686 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_dense =================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2013,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Core utility routines for the cholmod_dense object:
- *
- * The solve routines and some of the MatrixOps and Modify routines use dense
- * matrices as inputs.  These are held in column-major order.  With a leading
- * dimension of d, the entry in row i and column j is held in x [i+j*d].
- *
- * Primary routines:
- * -----------------
- * cholmod_allocate_dense	allocate a dense matrix
- * cholmod_free_dense		free a dense matrix
- *
- * Secondary routines:
- * -------------------
- * cholmod_zeros		allocate a dense matrix of all zeros
- * cholmod_ones			allocate a dense matrix of all ones
- * cholmod_eye			allocate a dense identity matrix 
- * cholmod_sparse_to_dense	create a dense matrix copy of a sparse matrix
- * cholmod_dense_to_sparse	create a sparse matrix copy of a dense matrix
- * cholmod_copy_dense		create a copy of a dense matrix
- * cholmod_copy_dense2		copy a dense matrix (pre-allocated)
- *
- * All routines in this file can handle the real, complex, and zomplex cases.
- * Pattern-only dense matrices are not supported.  cholmod_sparse_to_dense can
- * take a pattern-only input sparse matrix, however, and cholmod_dense_to_sparse
- * can generate a pattern-only output sparse matrix.
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-/* ========================================================================== */
-/* === TEMPLATE ============================================================= */
-/* ========================================================================== */
-
-#define PATTERN
-#include "t_cholmod_dense.c"
-#define REAL
-#include "t_cholmod_dense.c"
-#define COMPLEX
-#include "t_cholmod_dense.c"
-#define ZOMPLEX
-#include "t_cholmod_dense.c"
-
-
-/* ========================================================================== */
-/* === cholmod_allocate_dense =============================================== */
-/* ========================================================================== */
-
-/* Allocate a dense matrix with leading dimension d.  The space is not
- * initialized.
- */
-
-cholmod_dense *CHOLMOD(allocate_dense)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    size_t d,		/* leading dimension */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *X ;
-    size_t nzmax, nzmax0 ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    if (d < nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "leading dimension invalid") ;
-	return (NULL) ;
-    }
-    if (xtype < CHOLMOD_REAL || xtype > CHOLMOD_ZOMPLEX)
-    {
-	ERROR (CHOLMOD_INVALID, "xtype invalid") ;
-	return (NULL) ;
-    }
-
-    /* ensure the dimensions do not cause integer overflow */
-    (void) CHOLMOD(add_size_t) (ncol, 2, &ok) ;
-
-    /* nzmax = MAX (1, d*ncol) ; */
-    nzmax = CHOLMOD(mult_size_t) (d, ncol, &ok) ;
-    nzmax = MAX (1, nzmax) ;
-
-    if (!ok || nrow > Int_max || ncol > Int_max || nzmax > Int_max)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate header */
-    /* ---------------------------------------------------------------------- */
-
-    X = CHOLMOD(malloc) (sizeof (cholmod_dense), 1, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    PRINT1 (("cholmod_allocate_dense %d-by-%d nzmax %d xtype %d\n",
-		nrow, ncol, nzmax, xtype)) ;
-
-    X->nrow = nrow ;
-    X->ncol = ncol ;
-    X->nzmax = nzmax ;
-    X->xtype = xtype ;
-    X->dtype = DTYPE ;
-    X->x = NULL ;
-    X->z = NULL ;
-    X->d = d ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the matrix itself */
-    /* ---------------------------------------------------------------------- */
-
-    nzmax0 = 0 ;
-    CHOLMOD(realloc_multiple) (nzmax, 0, xtype, NULL, NULL, &(X->x), &(X->z),
-	    &nzmax0, Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free_dense) (&X, Common) ;
-	return (NULL) ;	    /* out of memory */
-    }
-
-    return (X) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_zeros ======================================================== */
-/* ========================================================================== */
-
-/* Allocate a dense matrix and set it to zero */
-
-cholmod_dense *CHOLMOD(zeros)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *X ;
-    double *Xx, *Xz ;
-    Int i, nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate a dense matrix and set it to zero */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    X = CHOLMOD(allocate_dense) (nrow, ncol, nrow, xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* NULL Common, out of memory, or inputs invalid */
-    }
-
-    Xx = X->x ;
-    Xz = X->z ;
-    nz = MAX (1, X->nzmax) ;
-
-    switch (xtype)
-    {
-	case CHOLMOD_REAL:
-	    for (i = 0 ; i < nz ; i++)
-	    {
-		Xx [i] = 0 ;
-	    }
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    for (i = 0 ; i < 2*nz ; i++)
-	    {
-		Xx [i] = 0 ;
-	    }
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    for (i = 0 ; i < nz ; i++)
-	    {
-		Xx [i] = 0 ;
-	    }
-	    for (i = 0 ; i < nz ; i++)
-	    {
-		Xz [i] = 0 ;
-	    }
-	    break ;
-    }
-
-    return (X) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_ones ========================================================= */
-/* ========================================================================== */
-
-/* Allocate a dense matrix and set it to zero */
-
-cholmod_dense *CHOLMOD(ones)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *X ;
-    double *Xx, *Xz ;
-    Int i, nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate a dense matrix and set it to all ones */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    X = CHOLMOD(allocate_dense) (nrow, ncol, nrow, xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* NULL Common, out of memory, or inputs invalid */
-    }
-
-    Xx = X->x ;
-    Xz = X->z ;
-    nz = MAX (1, X->nzmax) ;
-
-    switch (xtype)
-    {
-	case CHOLMOD_REAL:
-	    for (i = 0 ; i < nz ; i++)
-	    {
-		Xx [i] = 1 ;
-	    }
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    for (i = 0 ; i < nz ; i++)
-	    {
-		Xx [2*i  ] = 1 ;
-		Xx [2*i+1] = 0 ;
-	    }
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    for (i = 0 ; i < nz ; i++)
-	    {
-		Xx [i] = 1 ;
-	    }
-	    for (i = 0 ; i < nz ; i++)
-	    {
-		Xz [i] = 0 ;
-	    }
-	    break ;
-    }
-
-    return (X) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_eye ========================================================== */
-/* ========================================================================== */
-
-/* Allocate a dense matrix and set it to the identity matrix */
-
-cholmod_dense *CHOLMOD(eye)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *X ;
-    double *Xx, *Xz ;
-    Int i, n, nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate a dense matrix and set it to the identity matrix */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    X = CHOLMOD(zeros) (nrow, ncol, xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* NULL Common, out of memory, or inputs invalid */
-    }
-
-    nz = MAX (1, nrow*ncol) ;
-    Xx = X->x ;
-    Xz = X->z ;
-
-    n = MIN (nrow, ncol) ;
-
-    switch (xtype)
-    {
-	case CHOLMOD_REAL:
-	case CHOLMOD_ZOMPLEX:
-	    for (i = 0 ; i < n ; i++)
-	    {
-		Xx [i + i*nrow] = 1 ;
-	    }
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    for (i = 0 ; i < n ; i++)
-	    {
-		Xx [2 * (i + i*nrow)] = 1 ;
-	    }
-	    break ;
-    }
-
-    return (X) ;
-}
-
-/* ========================================================================== */
-/* === cholmod_free_dense =================================================== */
-/* ========================================================================== */
-
-/* free a dense matrix
- *
- * workspace: none
- */
-
-int CHOLMOD(free_dense)
-(
-    /* ---- in/out --- */
-    cholmod_dense **XHandle,	/* dense matrix to deallocate, NULL on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *X ;
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-
-    if (XHandle == NULL)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-    X = *XHandle ;
-    if (X == NULL)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-
-    switch (X->xtype)
-    {
-	case CHOLMOD_REAL:
-	    X->x = CHOLMOD(free) (X->nzmax, sizeof (double), X->x, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    X->x = CHOLMOD(free) (X->nzmax, 2*sizeof (double), X->x, Common) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    X->x = CHOLMOD(free) (X->nzmax, sizeof (double), X->x, Common) ;
-	    X->z = CHOLMOD(free) (X->nzmax, sizeof (double), X->z, Common) ;
-	    break ;
-    }
-
-    *XHandle = CHOLMOD(free) (1, sizeof (cholmod_dense), (*XHandle), Common) ;
-    return (TRUE) ;
-}
-
-/* ========================================================================== */
-/* === cholmod_ensure_dense ================================================= */
-/* ========================================================================== */
-
-/* Ensure that the input matrix has a certain size and type.  If not, free
- * the existing matrix and reallocate one of the right size and type.
- * Returns a pointer to the cholmod_dense matrix, possibly reallocated.
- * Also modifies the input matrix handle, XHandle, if necessary.
- */
-
-cholmod_dense *CHOLMOD(ensure_dense)
-(
-    /* ---- input/output ---- */
-    cholmod_dense **XHandle,    /* matrix handle to check */
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    size_t d,		/* leading dimension */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *X ;
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    if (XHandle == NULL)
-    {
-        ERROR (CHOLMOD_INVALID, "matrix invalid") ;
-        return (NULL) ;
-    }
-
-    X = *XHandle ;
-    if (X == NULL || X->nrow != nrow || X->ncol != ncol
-        || X->d != d || X->xtype != xtype)
-    {
-        /* Matrix X is not allocated, or has the wrong size.  Free it and
-         * reallocate it in the right size and shape.  If an error occurs
-         * (out of memory or inputs nrow, etc invalid), then the error is
-         * set in cholmod_allocate_dense and X is returned as NULL. */
-        CHOLMOD(free_dense) (XHandle, Common) ;
-        X = CHOLMOD(allocate_dense) (nrow, ncol, d, xtype, Common) ;
-        *XHandle = X ;
-    }
-    return (X) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_sparse_to_dense ============================================== */
-/* ========================================================================== */
-
-/* Convert a sparse matrix to a dense matrix.
- * The output dense matrix has the same xtype as the input sparse matrix,
- * except that a pattern-only sparse matrix A is converted into a real dense
- * matrix X, with 1's and 0's.  All xtypes are supported.
- */
-
-cholmod_dense *CHOLMOD(sparse_to_dense)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *X = NULL ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, NULL) ;
-    if (A->stype && A->nrow != A->ncol)
-    {
-	ERROR (CHOLMOD_INVALID, "matrix invalid") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-    ASSERT (CHOLMOD(dump_sparse) (A, "A", Common) >= 0) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* convert the matrix, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (A->xtype)
-    {
-	case CHOLMOD_PATTERN:
-	    X = p_cholmod_sparse_to_dense (A, Common) ;
-	    break ;
-
-	case CHOLMOD_REAL:
-	    X = r_cholmod_sparse_to_dense (A, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    X = c_cholmod_sparse_to_dense (A, Common) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    X = z_cholmod_sparse_to_dense (A, Common) ;
-	    break ;
-    }
-    return (X) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_dense_to_sparse ============================================== */
-/* ========================================================================== */
-
-/* Convert a dense matrix to a sparse matrix, similar to the MATLAB statements:
- *
- * C = sparse (X)			values = TRUE
- * C = spones (sparse (X))		values = FALSE
- *
- * except that X must be double (it can be of many different types in MATLAB)
- *
- * The resulting sparse matrix C has the same numeric xtype as the input dense
- * matrix X, unless "values" is FALSE (in which case C is real, where C(i,j)=1
- * if (i,j) is an entry in X.
- */
-
-cholmod_sparse *CHOLMOD(dense_to_sparse)
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to copy */
-    int values,		/* TRUE if values to be copied, FALSE otherwise */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *C = NULL ;
-
-    DEBUG (CHOLMOD(dump_dense) (X, "X", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (X, NULL) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, NULL) ;
-    if (X->d < X->nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "matrix invalid") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* convert the matrix, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (X->xtype)
-    {
-	case CHOLMOD_REAL:
-	    C = r_cholmod_dense_to_sparse (X, values, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    C = c_cholmod_dense_to_sparse (X, values, Common) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    C = z_cholmod_dense_to_sparse (X, values, Common) ;
-	    break ;
-    }
-    return (C) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_copy_dense2 ================================================== */
-/* ========================================================================== */
-
-/* Y = X, where X and Y are both already allocated.  The leading dimensions of
- * X and Y may differ, but both must be >= the # of rows in X and Y.
- * Entries in rows nrow to d-1 are not copied from X, since the space might not
- * be initialized.  Y->nzmax is unchanged.  X->nzmax is typically
- * (X->d)*(X->ncol), but a user might modify that condition outside of any
- * CHOLMOD routine.
- *
- * The two dense matrices X and Y must have the same numeric xtype.
- */
-
-int CHOLMOD(copy_dense2)
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to copy */
-    /* ---- output --- */
-    cholmod_dense *Y,	/* copy of matrix X */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (X, FALSE) ;
-    RETURN_IF_NULL (Y, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (Y, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (X->nrow != Y->nrow || X->ncol != Y->ncol || X->xtype != Y->xtype)
-    {
-	ERROR (CHOLMOD_INVALID, "X and Y must have same dimensions and xtype") ;
-	return (FALSE) ;
-    }
-    if (X->d < X->nrow || Y->d < Y->nrow
-	    || (X->d * X->ncol) > X->nzmax || (Y->d * Y->ncol) > Y->nzmax)
-    {
-	ERROR (CHOLMOD_INVALID, "X and/or Y invalid") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* copy the matrix, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (X->xtype)
-    {
-	case CHOLMOD_REAL:
-	    r_cholmod_copy_dense2 (X, Y) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    c_cholmod_copy_dense2 (X, Y) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    z_cholmod_copy_dense2 (X, Y) ;
-	    break ;
-    }
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_copy_dense =================================================== */
-/* ========================================================================== */
-
-/* Y = X, copy a dense matrix */
-
-cholmod_dense *CHOLMOD(copy_dense)
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *Y ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (X, NULL) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, NULL) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate result */
-    /* ---------------------------------------------------------------------- */
-
-    Y = CHOLMOD(allocate_dense) (X->nrow, X->ncol, X->d, X->xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory or X invalid */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* Y = X */
-    /* ---------------------------------------------------------------------- */
-
-    /* This cannot fail (X and Y are allocated, and have the same nrow, ncol
-     * d, and xtype) */
-    CHOLMOD(copy_dense2) (X, Y, Common) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    return (Y) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_error.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_error.c
deleted file mode 100644
index e14887a..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_error.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_error =================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD error-handling routine.  */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-/* ========================================================================== */
-/* ==== cholmod_error ======================================================= */
-/* ========================================================================== */
-
-/* An error has occurred.  Set the status, optionally print an error message,
- * and call the user error-handling routine (if it exists).  If
- * Common->try_catch is TRUE, then CHOLMOD is inside a try/catch block.
- * The status is set, but no message is printed and the user error handler
- * is not called.  This is not (yet) an error, since CHOLMOD may recover.
- *
- * In the current version, this try/catch mechanism is used internally only in
- * cholmod_analyze, which tries multiple ordering methods and picks the best
- * one.  If one or more ordering method fails, it keeps going.  Only one
- * ordering needs to succeed for cholmod_analyze to succeed.
- */
-
-int CHOLMOD(error)
-(
-    /* ---- input ---- */
-    int status,		/* error status */
-    const char *file,	/* name of source code file where error occured */ 
-    int line,		/* line number in source code file where error occured*/
-    const char *message,    /* error message */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (FALSE) ;
-
-    Common->status = status ;
-
-    if (!(Common->try_catch))
-    {
-
-#ifndef NPRINT
-	/* print a warning or error message */
-	if (SuiteSparse_config.printf_func != NULL)
-	{
-	    if (status > 0 && Common->print > 1)
-	    {
-		SuiteSparse_config.printf_func ("CHOLMOD warning: %s\n",
-                    message) ;
-		fflush (stdout) ;
-		fflush (stderr) ;
-	    }
-	    else if (Common->print > 0)
-	    {
-		SuiteSparse_config.printf_func ("CHOLMOD error: %s\n",
-                    message) ;
-		fflush (stdout) ;
-		fflush (stderr) ;
-	    }
-	}
-#endif
-
-	/* call the user error handler, if it exists */
-	if (Common->error_handler != NULL)
-	{
-	    Common->error_handler (status, file, line, message) ;
-	}
-    }
-
-    return (TRUE) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_factor.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_factor.c
deleted file mode 100644
index 6dc020b..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_factor.c
+++ /dev/null
@@ -1,937 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_factor ================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2013,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Core utility routines for the cholmod_factor object:
- *
- * The data structure for an LL' or LDL' factorization is too complex to
- * describe in one sentence.  This object can hold the symbolic analysis alone,
- * or in combination with a "simplicial" (similar to a sparse matrix) or
- * "supernodal" form of the numerical factorization.  Only the routine to free
- * a factor is primary, since a factor object is created by the factorization
- * routine (cholmod_factorize).  It must be freed with cholmod_free_factor.
- *
- * Primary routine:
- * ----------------
- * cholmod_free_factor		free a factor
- *
- * Secondary routines:
- * -------------------
- * cholmod_allocate_factor	allocate a symbolic factor (LL' or LDL')
- * cholmod_reallocate_factor	change the # entries in a factor 
- * cholmod_change_factor	change the type of factor (e.g., LDL' to LL')
- * cholmod_pack_factor		pack the columns of a factor
- * cholmod_reallocate_column	resize a single column of a factor
- * cholmod_factor_to_sparse	create a sparse matrix copy of a factor
- * cholmod_copy_factor		create a copy of a factor
- *
- * Note that there is no cholmod_sparse_to_factor routine to create a factor
- * as a copy of a sparse matrix.  It could be done, after a fashion, but a
- * lower triangular sparse matrix would not necessarily have a chordal graph,
- * which would break the many CHOLMOD routines that rely on this property.
- *
- * The cholmod_factor_to_sparse routine is provided so that matrix operations
- * in the MatrixOps module may be applied to L.  Those operations operate on
- * cholmod_sparse objects, and they are not guaranteed to maintain the chordal
- * property of L.  Such a modified L cannot be safely converted back to a
- * cholmod_factor object.
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-
-/* ========================================================================== */
-/* === cholmod_allocate_factor ============================================== */
-/* ========================================================================== */
-
-/* Allocate a simplicial symbolic factor, with L->Perm and L->ColCount allocated
- * and initialized to "empty" values (Perm [k] = k, and ColCount[k] = 1).
- * The integer and numerical parts of L are not allocated.  L->xtype is returned
- * as CHOLMOD_PATTERN and L->is_super are returned as FALSE.  L->is_ll is also
- * returned FALSE, but this may be modified when the matrix is factorized.
- *
- * This is sufficient (but far from ideal) for input to cholmod_factorize,
- * since the simplicial LL' or LDL' factorization (cholmod_rowfac) can
- * reallocate the columns of L as needed.  The primary purpose of this routine
- * is to allocate space for a symbolic factorization, for the "expert" user to
- * do his or her own symbolic analysis.  The typical user should use
- * cholmod_analyze instead of this routine.
- *
- * workspace: none
- */
-
-cholmod_factor *CHOLMOD(allocate_factor)
-(
-    /* ---- input ---- */
-    size_t n,		/* L is n-by-n */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int j ;
-    Int *Perm, *ColCount ;
-    cholmod_factor *L ;
-    int ok = TRUE ;
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ensure the dimension does not cause integer overflow */
-    (void) CHOLMOD(add_size_t) (n, 2, &ok) ;
-    if (!ok || n > Int_max)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (NULL) ;
-    }
-
-    L = CHOLMOD(malloc) (sizeof (cholmod_factor), 1, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-    L->n = n ;
-    L->is_ll = FALSE ;
-    L->is_super = FALSE ;
-    L->is_monotonic = TRUE ;
-    L->itype = ITYPE ;
-    L->xtype = CHOLMOD_PATTERN ;
-    L->dtype = DTYPE ;
-
-    /* allocate the purely symbolic part of L */
-    L->ordering = CHOLMOD_NATURAL ;
-    L->Perm = CHOLMOD(malloc) (n, sizeof (Int), Common) ;
-    L->IPerm = NULL ;       /* only created by cholmod_solve2 when needed */
-    L->ColCount = CHOLMOD(malloc) (n, sizeof (Int), Common) ;
-
-    /* simplicial part of L is empty */
-    L->nzmax = 0 ;
-    L->p = NULL ;
-    L->i = NULL ;
-    L->x = NULL ;
-    L->z = NULL ;
-    L->nz = NULL ;
-    L->next = NULL ;
-    L->prev = NULL ;
-
-    /* supernodal part of L is also empty */
-    L->nsuper = 0 ;
-    L->ssize = 0 ;
-    L->xsize = 0 ;
-    L->maxesize = 0 ;
-    L->maxcsize = 0 ;
-    L->super = NULL ;
-    L->pi = NULL ;
-    L->px = NULL ;
-    L->s = NULL ;
-    L->useGPU = 0;
-
-    /* L has not been factorized */
-    L->minor = n ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free_factor) (&L, Common) ;
-	return (NULL) ;		/* out of memory */
-    }
-
-    /* initialize Perm and ColCount */
-    Perm = L->Perm ;
-    for (j = 0 ; j < ((Int) n) ; j++)
-    {
-	Perm [j] = j ;
-    }
-    ColCount = L->ColCount ;
-    for (j = 0 ; j < ((Int) n) ; j++)
-    {
-	ColCount [j] = 1 ;
-    }
-
-    return (L) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_free_factor ================================================== */
-/* ========================================================================== */
-
-/* Free a factor object.
- *
- * workspace: none
- */
-
-int CHOLMOD(free_factor)
-(
-    /* ---- in/out --- */
-    cholmod_factor **LHandle,	/* factor to free, NULL on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int n, lnz, xs, ss, s ;
-    cholmod_factor *L ;
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-
-    if (LHandle == NULL)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-    L = *LHandle ;
-    if (L == NULL)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-
-    n = L->n ;
-    lnz = L->nzmax ;
-    s = L->nsuper + 1 ;
-    xs = (L->is_super) ? ((Int) (L->xsize)) : (lnz) ;
-    ss = L->ssize ;
-
-    /* symbolic part of L */
-    CHOLMOD(free) (n,   sizeof (Int), L->Perm,     Common) ;
-    CHOLMOD(free) (n,   sizeof (Int), L->IPerm,    Common) ;
-    CHOLMOD(free) (n,   sizeof (Int), L->ColCount, Common) ;
-
-    /* simplicial form of L */
-    CHOLMOD(free) (n+1, sizeof (Int), L->p,        Common) ;
-    CHOLMOD(free) (lnz, sizeof (Int), L->i,        Common) ;
-    CHOLMOD(free) (n,   sizeof (Int), L->nz,       Common) ;
-    CHOLMOD(free) (n+2, sizeof (Int), L->next,     Common) ;
-    CHOLMOD(free) (n+2, sizeof (Int), L->prev,     Common) ;
-
-    /* supernodal form of L */
-    CHOLMOD(free) (s,   sizeof (Int), L->pi,       Common) ;
-    CHOLMOD(free) (s,   sizeof (Int), L->px,       Common) ;
-    CHOLMOD(free) (s,   sizeof (Int), L->super,    Common) ;
-    CHOLMOD(free) (ss,  sizeof (Int), L->s,        Common) ;
-
-    /* numerical values for both simplicial and supernodal L */
-    if (L->xtype == CHOLMOD_REAL)
-    {
-	CHOLMOD(free) (xs, sizeof (double), L->x, Common) ;
-    }
-    else if (L->xtype == CHOLMOD_COMPLEX)
-    {
-	CHOLMOD(free) (xs, 2*sizeof (double), L->x, Common) ;
-    }
-    else if (L->xtype == CHOLMOD_ZOMPLEX)
-    {
-	CHOLMOD(free) (xs, sizeof (double), L->x, Common) ;
-	CHOLMOD(free) (xs, sizeof (double), L->z, Common) ;
-    }
-
-    *LHandle = CHOLMOD(free) (1, sizeof (cholmod_factor), (*LHandle), Common) ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_reallocate_factor ============================================ */
-/* ========================================================================== */
-
-/* Change the size of L->i and L->x, or allocate them if their current size
- * is zero.  L must be simplicial.
- *
- * workspace: none
- */
-
-int CHOLMOD(reallocate_factor)
-(
-    /* ---- input ---- */
-    size_t nznew,	/* new # of entries in L */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    PRINT1 (("realloc factor: xtype %d\n", L->xtype)) ;
-    if (L->is_super)
-    {
-	/* L must be simplicial, and not symbolic */
-	ERROR (CHOLMOD_INVALID, "L invalid") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-    PRINT1 (("realloc factor %g to %g\n", (double) L->nzmax, (double) nznew)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* resize (or allocate) the L->i and L->x components of the factor */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(realloc_multiple) (nznew, 1, L->xtype, &(L->i), NULL,
-	    &(L->x), &(L->z), &(L->nzmax), Common) ;
-    return (Common->status == CHOLMOD_OK) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_reallocate_column =========================================== */
-/* ========================================================================== */
-
-/* Column j needs more space, reallocate it at the end of L->i and L->x.
- * If the reallocation fails, the factor is converted to a simplicial
- * symbolic factor (no pattern, just L->Perm and L->ColCount).
- *
- * workspace: none
- */
-
-int CHOLMOD(reallocate_column)
-(
-    /* ---- input ---- */
-    size_t j,		/* the column to reallocate */
-    size_t need,	/* required size of column j */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double xneed ;
-    double *Lx, *Lz ;
-    Int *Lp, *Lprev, *Lnext, *Li, *Lnz ;
-    Int n, pold, pnew, len, k, tail ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (L->is_super)
-    {
-	ERROR (CHOLMOD_INVALID, "L must be simplicial") ;
-	return (FALSE) ;
-    }
-    n = L->n ;
-    if (j >= L->n || need == 0)
-    {
-	ERROR (CHOLMOD_INVALID, "j invalid") ;
-	return (FALSE) ;	    /* j out of range */
-    }
-    Common->status = CHOLMOD_OK ;
-
-    DEBUG (CHOLMOD(dump_factor) (L, "start colrealloc", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* increase the size of L if needed */
-    /* ---------------------------------------------------------------------- */
-
-    /* head = n+1 ; */
-    tail = n ;
-    Lp = L->p ;
-    Lnz = L->nz ;
-    Lprev = L->prev ;
-    Lnext = L->next ;
-
-    ASSERT (Lnz != NULL) ;
-    ASSERT (Lnext != NULL && Lprev != NULL) ;
-    PRINT1 (("col %g need %g\n", (double) j, (double) need)) ;
-
-    /* column j cannot have more than n-j entries if all entries are present */
-    need = MIN (need, n-j) ;
-
-    /* compute need in double to avoid integer overflow */
-    if (Common->grow1 >= 1.0)
-    {
-	xneed = (double) need ;
-	xneed = Common->grow1 * xneed + Common->grow2 ;
-	xneed = MIN (xneed, n-j) ;
-	need = (Int) xneed ;
-    }
-    PRINT1 (("really new need %g current %g\n", (double) need,
-	    (double) (Lp [Lnext [j]] - Lp [j]))) ;
-    ASSERT (need >= 1 && need <= n-j) ;
-
-    if (Lp [Lnext [j]] - Lp [j] >= (Int) need)
-    {
-	/* no need to reallocate the column, it's already big enough */
-	PRINT1 (("colrealloc: quick return %g %g\n",
-	    (double) (Lp [Lnext [j]] - Lp [j]), (double) need)) ;
-	return (TRUE) ;
-
-    }
-
-    if (Lp [tail] + need > L->nzmax)
-    {
-	/* use double to avoid integer overflow */
-	xneed = (double) need ;
-	if (Common->grow0 < 1.2)	    /* fl. pt. compare, false if NaN */
-	{
-	    /* if grow0 is less than 1.2 or NaN, don't use it */
-	    xneed = 1.2 * (((double) L->nzmax) + xneed + 1) ;
-	}
-	else
-	{
-	    xneed = Common->grow0 * (((double) L->nzmax) + xneed + 1) ;
-	}
-	if (xneed > Size_max ||
-		!CHOLMOD(reallocate_factor) ((Int) xneed, L, Common))
-	{
-	    /* out of memory, convert to simplicial symbolic */
-	    CHOLMOD(change_factor) (CHOLMOD_PATTERN, L->is_ll, FALSE, TRUE,
-		    TRUE, L, Common) ;
-	    ERROR (CHOLMOD_OUT_OF_MEMORY, "out of memory; L now symbolic") ;
-	    return (FALSE) ;	    /* out of memory */
-	}
-	PRINT1 (("\n=== GROW L from %g to %g\n",
-		    (double) L->nzmax, (double) xneed)) ;
-	/* pack all columns so that each column has at most grow2 free space */
-	CHOLMOD(pack_factor) (L, Common) ;
-	ASSERT (Common->status == CHOLMOD_OK) ;
-	Common->nrealloc_factor++ ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* reallocate the column */
-    /* ---------------------------------------------------------------------- */
-
-    Common->nrealloc_col++ ;
-
-    Li = L->i ;
-    Lx = L->x ;
-    Lz = L->z ;
-
-    /* remove j from its current position in the list */
-    Lnext [Lprev [j]] = Lnext [j] ;
-    Lprev [Lnext [j]] = Lprev [j] ;
-
-    /* place j at the end of the list */
-    Lnext [Lprev [tail]] = j ;
-    Lprev [j] = Lprev [tail] ;
-    Lnext [j] = n ;
-    Lprev [tail] = j ;
-
-    /* L is no longer monotonic; columns are out-of-order */
-    L->is_monotonic = FALSE ;
-
-    /* allocate space for column j */
-    pold = Lp [j] ;
-    pnew = Lp [tail] ;
-    Lp [j] = pnew  ;
-    Lp [tail] += need ;
-
-    /* copy column j to the new space */
-    len = Lnz [j] ;
-    for (k = 0 ; k < len ; k++)
-    {
-	Li [pnew + k] = Li [pold + k] ;
-    }
-
-    if (L->xtype == CHOLMOD_REAL)
-    {
-	for (k = 0 ; k < len ; k++)
-	{
-	    Lx [pnew + k] = Lx [pold + k] ;
-	}
-    }
-    else if (L->xtype == CHOLMOD_COMPLEX)
-    {
-	for (k = 0 ; k < len ; k++)
-	{
-	    Lx [2*(pnew + k)  ] = Lx [2*(pold + k)  ] ;
-	    Lx [2*(pnew + k)+1] = Lx [2*(pold + k)+1] ;
-	}
-    }
-    else if (L->xtype == CHOLMOD_ZOMPLEX)
-    {
-	for (k = 0 ; k < len ; k++)
-	{
-	    Lx [pnew + k] = Lx [pold + k] ;
-	    Lz [pnew + k] = Lz [pold + k] ;
-	}
-    }
-
-    DEBUG (CHOLMOD(dump_factor) (L, "colrealloc done", Common)) ;
-
-    /* successful reallocation of column j of L */
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_pack_factor ================================================== */
-/* ========================================================================== */
-
-/* Pack the columns of a simplicial LDL' or LL' factor.  This can be followed
- * by a call to cholmod_reallocate_factor to reduce the size of L to the exact
- * size required by the factor, if desired.  Alternatively, you can leave the
- * size of L->i and L->x the same, to allow space for future updates/rowadds.
- *
- * Each column is reduced in size so that it has at most Common->grow2 free
- * space at the end of the column.
- *
- * Does nothing and returns silently if given any other type of factor.
- *
- * Does NOT force the columns of L to be monotonic.  It thus differs from
- * cholmod_change_factor (xtype, -, FALSE, TRUE, TRUE, L, Common), which
- * packs the columns and ensures that they appear in monotonic order.
- */
-
-int CHOLMOD(pack_factor)
-(
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Lx, *Lz ;
-    Int *Lp, *Li, *Lnz, *Lnext ;
-    Int pnew, j, k, pold, len, n, head, tail, grow2 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    DEBUG (CHOLMOD(dump_factor) (L, "start pack", Common)) ;
-    PRINT1 (("PACK factor %d\n", L->is_super)) ;
-
-    if (L->xtype == CHOLMOD_PATTERN || L->is_super)
-    {
-	/* nothing to do unless L is simplicial numeric */
-	return (TRUE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* pack */
-    /* ---------------------------------------------------------------------- */
-
-    grow2 = Common->grow2 ;
-    PRINT1 (("\nPACK grow2 "ID"\n", grow2)) ;
-
-    pnew = 0 ;
-    n = L->n ;
-    Lp = L->p ;
-    Li = L->i ;
-    Lx = L->x ;
-    Lz = L->z ;
-    Lnz = L->nz ;
-    Lnext = L->next ;
-
-    head = n+1 ;
-    tail = n ;
-
-    for (j = Lnext [head] ; j != tail ; j = Lnext [j])
-    {
-	/* pack column j */
-	pold = Lp [j] ;
-	len = Lnz [j] ;
-	ASSERT (len > 0) ;
-	PRINT2 (("col "ID" pnew "ID" pold "ID"\n", j, pnew, pold)) ;
-	if (pnew < pold)
-	{
-	    PRINT2 (("    pack this column\n")) ;
-
-	    for (k = 0 ; k < len ; k++)
-	    {
-		Li [pnew + k] = Li [pold + k] ;
-	    }
-
-	    if (L->xtype == CHOLMOD_REAL)
-	    {
-		for (k = 0 ; k < len ; k++)
-		{
-		    Lx [pnew + k] = Lx [pold + k] ;
-		}
-	    }
-	    else if (L->xtype == CHOLMOD_COMPLEX)
-	    {
-		for (k = 0 ; k < len ; k++)
-		{
-		    Lx [2*(pnew + k)  ] = Lx [2*(pold + k)  ] ;
-		    Lx [2*(pnew + k)+1] = Lx [2*(pold + k)+1] ;
-		}
-	    }
-	    else if (L->xtype == CHOLMOD_ZOMPLEX)
-	    {
-		for (k = 0 ; k < len ; k++)
-		{
-		    Lx [pnew + k] = Lx [pold + k] ;
-		    Lz [pnew + k] = Lz [pold + k] ;
-		}
-	    }
-
-	    Lp [j] = pnew ;
-	}
-	len = MIN (len + grow2, n - j) ;
-	pnew = MIN (Lp [j] + len, Lp [Lnext [j]]) ;
-    }
-    PRINT2 (("final pnew = "ID"\n", pnew)) ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_factor_to_sparse ============================================= */
-/* ========================================================================== */
-
-/* Constructs a column-oriented sparse matrix containing the pattern and values
- * of a simplicial or supernodal numerical factor, and then converts the factor
- * into a simplicial symbolic factor.  If L is already packed, monotonic,
- * and simplicial (which is the case when cholmod_factorize uses the simplicial
- * Cholesky factorization algorithm) then this routine requires only O(1)
- * memory and takes O(1) time.
- *
- * Only operates on numeric factors (real, complex, or zomplex).  Does not
- * change the numeric L->xtype (the resulting sparse matrix has the same xtype
- * as L).  If this routine fails, L is left unmodified.
- */
-
-cholmod_sparse *CHOLMOD(factor_to_sparse)
-(
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to copy, converted to symbolic on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *Lsparse ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (L, NULL) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, NULL) ;
-    Common->status = CHOLMOD_OK ;
-    DEBUG (CHOLMOD(dump_factor) (L, "start convert to matrix", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* convert to packed, monotonic, simplicial, numeric */
-    /* ---------------------------------------------------------------------- */
-
-    /* leave as LL or LDL' */
-    if (!CHOLMOD(change_factor) (L->xtype, L->is_ll, FALSE, TRUE, TRUE, L,
-		Common))
-    {
-	ERROR (CHOLMOD_INVALID, "cannot convert L") ;
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* create Lsparse */
-    /* ---------------------------------------------------------------------- */
-
-    /* allocate the header for Lsparse, the sparse matrix version of L */
-    Lsparse = CHOLMOD(malloc) (sizeof (cholmod_sparse), 1, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;		/* out of memory */
-    }
-
-    /* transfer the contents from L to Lsparse */
-    Lsparse->nrow = L->n ;
-    Lsparse->ncol = L->n ;
-    Lsparse->p = L->p ;
-    Lsparse->i = L->i ;
-    Lsparse->x = L->x ;
-    Lsparse->z = L->z ;
-    Lsparse->nz = NULL ;
-    Lsparse->stype = 0 ;
-    Lsparse->itype = L->itype ;
-    Lsparse->xtype = L->xtype ;
-    Lsparse->dtype = L->dtype ;
-    Lsparse->sorted = TRUE ;
-    Lsparse->packed = TRUE ;
-    Lsparse->nzmax = L->nzmax ;
-    ASSERT (CHOLMOD(dump_sparse) (Lsparse, "Lsparse", Common) >= 0) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* convert L to symbolic, but do not free contents transfered to Lsparse */
-    /* ---------------------------------------------------------------------- */
-
-    L->p = NULL ;
-    L->i = NULL ;
-    L->x = NULL ;
-    L->z = NULL ;
-    L->xtype = CHOLMOD_PATTERN ;
-    CHOLMOD(change_factor) (CHOLMOD_PATTERN, FALSE, FALSE, TRUE, TRUE, L,
-	    Common) ;
-
-    return (Lsparse) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_copy_factor ================================================== */
-/* ========================================================================== */
-
-/* Create an exact copy of a factor, with one exception:
- *
- * Entries in unused space are not copied (they might not be initialized,
- *	and copying them would cause program checkers such as purify and
- *	valgrind to complain).
- *
- * Note that a supernodal L cannot be zomplex.
- */
-
-cholmod_factor *CHOLMOD(copy_factor)
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to copy */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_factor *L2 ;
-    double *Lx, *L2x, *Lz, *L2z ;
-    Int *Perm, *ColCount, *Lp, *Li, *Lnz, *Lnext, *Lprev, *Lsuper, *Lpi, *Lpx,
-	*Ls, *Perm2, *ColCount2, *L2p, *L2i, *L2nz, *L2next, *L2prev, *L2super,
-	*L2pi, *L2px, *L2s ;
-    Int n, j, p, pend, s, xsize, ssize, nsuper ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (L, NULL) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, NULL) ;
-    Common->status = CHOLMOD_OK ;
-    DEBUG (CHOLMOD(dump_factor) (L, "start copy", Common)) ;
-
-    n = L->n ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate a simplicial symbolic factor  */
-    /* ---------------------------------------------------------------------- */
-
-    /* allocates L2->Perm and L2->ColCount */
-    L2 = CHOLMOD(allocate_factor) (n, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-    ASSERT (L2->xtype == CHOLMOD_PATTERN && !(L2->is_super)) ;
-
-    Perm = L->Perm ;
-    ColCount = L->ColCount ;
-    Perm2 = L2->Perm ;
-    ColCount2 = L2->ColCount ;
-    L2->ordering = L->ordering ;
-
-    for (j = 0 ; j < n ; j++)
-    {
-	Perm2 [j] = Perm [j] ;
-    }
-    for (j = 0 ; j < n ; j++)
-    {
-	ColCount2 [j] = ColCount [j] ;
-    }
-    L2->is_ll = L->is_ll ;
-
-    /* ---------------------------------------------------------------------- */
-    /* copy the rest of the factor */
-    /* ---------------------------------------------------------------------- */
-
-    if (L->xtype != CHOLMOD_PATTERN && !(L->super))
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* allocate a simplicial numeric factor */
-	/* ------------------------------------------------------------------ */
-
-	/* allocate L2->p, L2->nz, L2->prev, L2->next, L2->i, and L2->x.
-	 * packed = -1 so that cholmod_change_factor allocates space of
-	 * size L2->nzmax */
-	L2->nzmax = L->nzmax ;
-	if (!CHOLMOD(change_factor) (L->xtype, L->is_ll, FALSE, -1, TRUE,
-		    L2, Common))
-	{
-	    CHOLMOD(free_factor) (&L2, Common) ;
-	    return (NULL) ;	/* out of memory */
-	}
-	ASSERT (MAX (1, L->nzmax) == L2->nzmax) ;
-
-	/* ------------------------------------------------------------------ */
-	/* copy the contents of a simplicial numeric factor */
-	/* ------------------------------------------------------------------ */
-
-	Lp = L->p ;
-	Li = L->i ;
-	Lx = L->x ;
-	Lz = L->z ;
-	Lnz = L->nz ;
-	Lnext = L->next ;
-	Lprev = L->prev ;
-
-	L2p = L2->p ;
-	L2i = L2->i ;
-	L2x = L2->x ;
-	L2z = L2->z ;
-	L2nz = L2->nz ;
-	L2next = L2->next ;
-	L2prev = L2->prev ;
-	L2->xtype = L->xtype ;
-	L2->dtype = L->dtype ;
-
-	for (j = 0 ; j <= n ; j++)
-	{
-	    L2p [j] = Lp [j] ;
-	}
-
-	for (j = 0 ; j < n+2 ; j++)
-	{
-	    L2prev [j] = Lprev [j] ;
-	}
-
-	for (j = 0 ; j < n+2 ; j++)
-	{
-	    L2next [j] = Lnext [j] ;
-	}
-
-	for (j = 0 ; j < n ; j++)
-	{
-	    L2nz [j] = Lnz [j] ;
-	}
-
-	for (j = 0 ; j < n ; j++)
-	{
-	    p = Lp [j] ;
-	    pend = p + Lnz [j] ;
-	    for ( ; p < pend ; p++)
-	    {
-		L2i [p] = Li [p] ;
-	    }
-	    p = Lp [j] ;
-
-	    if (L->xtype == CHOLMOD_REAL)
-	    {
-		for ( ; p < pend ; p++)
-		{
-		    L2x [p] = Lx [p] ;
-		}
-	    }
-	    else if (L->xtype == CHOLMOD_COMPLEX)
-	    {
-		for ( ; p < pend ; p++)
-		{
-		    L2x [2*p  ] = Lx [2*p  ] ;
-		    L2x [2*p+1] = Lx [2*p+1] ;
-		}
-	    }
-	    else if (L->xtype == CHOLMOD_ZOMPLEX)
-	    {
-		for ( ; p < pend ; p++)
-		{
-		    L2x [p] = Lx [p] ;
-		    L2z [p] = Lz [p] ;
-		}
-	    }
-
-	}
-
-    }
-    else if (L->is_super)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* copy a supernodal factor */
-	/* ------------------------------------------------------------------ */
-
-	xsize = L->xsize ;
-	ssize = L->ssize ;
-	nsuper = L->nsuper ;
-
-	L2->xsize = xsize ;
-	L2->ssize = ssize ;
-	L2->nsuper = nsuper ;
-
-	/* allocate L2->super, L2->pi, L2->px, and L2->s.  Allocate L2->x if
-	 * L is numeric */
-	if (!CHOLMOD(change_factor) (L->xtype, TRUE, TRUE, TRUE, TRUE, L2,
-		    Common))
-	{
-	    CHOLMOD(free_factor) (&L2, Common) ;
-	    return (NULL) ;	/* out of memory */
-	}
-
-	ASSERT (L2->s != NULL) ;
-
-	/* ------------------------------------------------------------------ */
-	/* copy the contents of a supernodal factor */
-	/* ------------------------------------------------------------------ */
-
-	Lsuper = L->super ;
-	Lpi = L->pi ;
-	Lpx = L->px ;
-	Ls = L->s ;
-	Lx = L->x ;
-
-	L2super = L2->super ;
-	L2pi = L2->pi ;
-	L2px = L2->px ;
-	L2s = L2->s ;
-	L2x = L2->x ;
-
-	L2->maxcsize = L->maxcsize ;
-	L2->maxesize = L->maxesize ;
-
-	for (s = 0 ; s <= nsuper ; s++)
-	{
-	    L2super [s] = Lsuper [s] ;
-	}
-	for (s = 0 ; s <= nsuper ; s++)
-	{
-	    L2pi [s] = Lpi [s] ;
-	}
-	for (s = 0 ; s <= nsuper ; s++)
-	{
-	    L2px [s] = Lpx [s] ;
-	}
-
-	L2s [0] = 0 ;
-	for (p = 0 ; p < ssize ; p++)
-	{
-	    L2s [p] = Ls [p] ;
-	}
-
-	if (L->xtype == CHOLMOD_REAL)
-	{
-	    for (p = 0 ; p < xsize ; p++)
-	    {
-		L2x [p] = Lx [p] ;
-	    }
-	}
-	else if (L->xtype == CHOLMOD_COMPLEX)
-	{
-	    for (p = 0 ; p < 2*xsize ; p++)
-	    {
-		L2x [p] = Lx [p] ;
-	    }
-	}
-    }
-
-    L2->minor = L->minor ;
-    L2->is_monotonic = L->is_monotonic ;
-
-    DEBUG (CHOLMOD(dump_factor) (L2, "L2 got copied", Common)) ;
-    ASSERT (L2->xtype == L->xtype && L2->is_super == L->is_super) ;
-    return (L2) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_memory.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_memory.c
deleted file mode 100644
index 17eb489..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_memory.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_memory ================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2013,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Core memory management routines:
- *
- * Primary routines:
- * -----------------
- * cholmod_malloc		malloc wrapper
- * cholmod_free			free wrapper
- *
- * Secondary routines:
- * -------------------
- * cholmod_calloc		calloc wrapper
- * cholmod_realloc		realloc wrapper
- * cholmod_realloc_multiple	realloc wrapper for multiple objects
- *
- * The user may make use of these, just like malloc and free.  You can even
- * malloc an object and safely free it with cholmod_free, and visa versa
- * (except that the memory usage statistics will be corrupted).  These routines
- * do differ from malloc and free.  If cholmod_free is given a NULL pointer,
- * for example, it does nothing (unlike the ANSI free).  cholmod_realloc does
- * not return NULL if given a non-NULL pointer and a nonzero size, even if it
- * fails (it sets an error code in Common->status instead).
- *
- * CHOLMOD keeps track of the amount of memory it has allocated, and so the
- * cholmod_free routine includes as a parameter the size of the object being
- * freed.  This is only used for memory usage statistics, which are very useful
- * in finding memory leaks in your program.  If you, the user of CHOLMOD, pass
- * the wrong size, the only consequence is that the memory usage statistics
- * will be invalid.  This will causes assertions to fail if CHOLMOD is
- * compiled with debugging enabled, but otherwise it will cause no errors.
- *
- * The cholmod_free_* routines for each CHOLMOD object keep track of the size
- * of the blocks they free, so they do not require you to pass their sizes
- * as a parameter.
- *
- * If a block of size zero is requested, these routines allocate a block of
- * size one instead.
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-/* ========================================================================== */
-/* === cholmod_add_size_t =================================================== */
-/* ========================================================================== */
-
-/* Safely compute a+b, and check for integer overflow.  If overflow occurs,
- * return 0 and set OK to FALSE.  Also return 0 if OK is FALSE on input. */
-
-size_t CHOLMOD(add_size_t) (size_t a, size_t b, int *ok)
-{
-    size_t s = a + b ;
-    (*ok) = (*ok) && (s >= a) ;
-    return ((*ok) ? s : 0) ;
-}
-
-/* ========================================================================== */
-/* === cholmod_mult_size_t ================================================== */
-/* ========================================================================== */
-
-/* Safely compute a*k, where k should be small, and check for integer overflow.
- * If overflow occurs, return 0 and set OK to FALSE.  Also return 0 if OK is
- * FALSE on input. */
-
-size_t CHOLMOD(mult_size_t) (size_t a, size_t k, int *ok)
-{
-    size_t p = 0, s ;
-    while (*ok)
-    {
-	if (k % 2)
-	{
-	    p = p + a ;
-	    (*ok) = (*ok) && (p >= a) ;
-	}
-	k = k / 2 ;
-	if (!k) return (p) ;
-	s = a + a ;
-	(*ok) = (*ok) && (s >= a) ;
-	a = s ;
-    }
-    return (0) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_malloc ======================================================= */
-/* ========================================================================== */
-
-/* Wrapper around malloc routine.  Allocates space of size MAX(1,n)*size, where
- * size is normally a sizeof (...).
- *
- * This routine, cholmod_calloc, and cholmod_realloc do not set Common->status
- * to CHOLMOD_OK on success, so that a sequence of cholmod_malloc's, _calloc's,
- * or _realloc's can be used.  If any of them fails, the Common->status will
- * hold the most recent error status.
- *
- * Usage, for a pointer to int:
- *
- *	p = cholmod_malloc (n, sizeof (int), Common)
- *
- * Uses a pointer to the malloc routine (or its equivalent) defined in Common.
- */
-
-void *CHOLMOD(malloc)	/* returns pointer to the newly malloc'd block */
-(
-    /* ---- input ---- */
-    size_t n,		/* number of items */
-    size_t size,	/* size of each item */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    void *p ;
-    size_t s ;
-    /*
-    int ok = TRUE ;
-    */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    if (size == 0)
-    {
-	ERROR (CHOLMOD_INVALID, "sizeof(item) must be > 0")  ;
-	p = NULL ;
-    }
-    else if (n >= (Size_max / size) || n >= Int_max)
-    {
-	/* object is too big to allocate without causing integer overflow */
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	p = NULL ;
-    }
-    else
-    {
-	/* call malloc, or its equivalent */
-	p = SuiteSparse_malloc (n, size) ;
-
-	if (p == NULL)
-	{
-	    /* failure: out of memory */
-	    ERROR (CHOLMOD_OUT_OF_MEMORY, "out of memory") ;
-	}
-	else
-	{
-	    /* success: increment the count of objects allocated */
-	    Common->malloc_count++ ;
-	    Common->memory_inuse += (n * size) ;
-	    Common->memory_usage =
-		MAX (Common->memory_usage, Common->memory_inuse) ;
-	    PRINTM (("cholmod_malloc %p %g cnt: %g inuse %g\n",
-		    p, (double) n*size, (double) Common->malloc_count,
-                    (double) Common->memory_inuse)) ;
-	}
-    }
-    return (p) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_free ========================================================= */
-/* ========================================================================== */
-
-/* Wrapper around free routine.  Returns NULL, which can be assigned to the
- * pointer being freed, as in:
- *
- *	p = cholmod_free (n, sizeof (int), p, Common) ;
- *
- * In CHOLMOD, the syntax:
- *
- *	cholmod_free (n, sizeof (int), p, Common) ;
- *
- * is used if p is a local pointer and the routine is returning shortly.
- * Uses a pointer to the free routine (or its equivalent) defined in Common.
- * Nothing is freed if the pointer is NULL.
- */
-
-void *CHOLMOD(free)	/* always returns NULL */
-(
-    /* ---- input ---- */
-    size_t n,		/* number of items */
-    size_t size,	/* size of each item */
-    /* ---- in/out --- */
-    void *p,		/* block of memory to free */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    RETURN_IF_NULL_COMMON (NULL) ;
-    if (p != NULL)
-    {
-	/* only free the object if the pointer is not NULL */
-	/* call free, or its equivalent */
-	SuiteSparse_free (p) ;
-
-	Common->malloc_count-- ;
-	Common->memory_inuse -= (n * size) ;
-	PRINTM (("cholmod_free   %p %g cnt: %g inuse %g\n",
-		p, (double) n*size, (double) Common->malloc_count,
-                (double) Common->memory_inuse)) ;
-	/* This assertion will fail if the user calls cholmod_malloc and
-	 * cholmod_free with mismatched memory sizes.  It shouldn't fail
-	 * otherwise. */
-	ASSERT (IMPLIES (Common->malloc_count == 0, Common->memory_inuse == 0));
-    }
-    /* return NULL, and the caller should assign this to p.  This avoids
-     * freeing the same pointer twice. */
-    return (NULL) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_calloc ======================================================= */
-/* ========================================================================== */
-
-/* Wrapper around calloc routine.
- *
- * Uses a pointer to the calloc routine (or its equivalent) defined in Common.
- * This routine is identical to malloc, except that it zeros the newly allocated
- * block to zero.
- */
-
-void *CHOLMOD(calloc)	/* returns pointer to the newly calloc'd block */
-(
-    /* ---- input ---- */
-    size_t n,		/* number of items */
-    size_t size,	/* size of each item */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    void *p ;
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    if (size == 0)
-    {
-	ERROR (CHOLMOD_INVALID, "sizeof(item) must be > 0") ;
-	p = NULL ;
-    }
-    else if (n >= (Size_max / size) || n >= Int_max)
-    {
-	/* object is too big to allocate without causing integer overflow */
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	p = NULL ;
-    }
-    else
-    {
-	/* call calloc, or its equivalent */
-	p = SuiteSparse_calloc (n, size) ;
-
-	if (p == NULL)
-	{
-	    /* failure: out of memory */
-	    ERROR (CHOLMOD_OUT_OF_MEMORY, "out of memory") ;
-	}
-	else
-	{
-	    /* success: increment the count of objects allocated */
-	    Common->malloc_count++ ;
-	    Common->memory_inuse += (n * size) ;
-	    Common->memory_usage =
-		MAX (Common->memory_usage, Common->memory_inuse) ;
-	    PRINTM (("cholmod_malloc %p %g cnt: %g inuse %g\n",
-		    p, (double) n*size, (double) Common->malloc_count,
-                    (double) Common->memory_inuse)) ;
-	}
-    }
-    return (p) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_realloc ====================================================== */
-/* ========================================================================== */
-
-/* Wrapper around realloc routine.  Given a pointer p to a block of size
- * (*n)*size memory, it changes the size of the block pointed to by p to be
- * MAX(1,nnew)*size in size.  It may return a pointer different than p.  This
- * should be used as (for a pointer to int):
- *
- *	p = cholmod_realloc (nnew, sizeof (int), p, *n, Common) ;
- *
- * If p is NULL, this is the same as p = cholmod_malloc (...).
- * A size of nnew=0 is treated as nnew=1.
- *
- * If the realloc fails, p is returned unchanged and Common->status is set
- * to CHOLMOD_OUT_OF_MEMORY.  If successful, Common->status is not modified,
- * and p is returned (possibly changed) and pointing to a large block of memory.
- *
- * Uses a pointer to the realloc routine (or its equivalent) defined in Common.
- */
-
-void *CHOLMOD(realloc)	/* returns pointer to reallocated block */
-(
-    /* ---- input ---- */
-    size_t nnew,	/* requested # of items in reallocated block */
-    size_t size,	/* size of each item */
-    /* ---- in/out --- */
-    void *p,		/* block of memory to realloc */
-    size_t *n,		/* current size on input, nnew on output if successful*/
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    size_t nold = (*n) ;
-    void *pnew ;
-    size_t s ;
-    int ok = TRUE ;
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    if (size == 0)
-    {
-	ERROR (CHOLMOD_INVALID, "sizeof(item) must be > 0") ;
-	p = NULL ;
-    }
-    else if (p == NULL)
-    {
-	/* A fresh object is being allocated. */
-	PRINT1 (("realloc fresh: %d %d\n", nnew, size)) ;
-	p = CHOLMOD(malloc) (nnew, size, Common) ;
-	*n = (p == NULL) ? 0 : nnew ;
-    }
-    else if (nold == nnew)
-    {
-	/* Nothing to do.  Do not change p or n. */
-	PRINT1 (("realloc nothing: %d %d\n", nnew, size)) ;
-    }
-    else if (nnew >= (Size_max / size) || nnew >= Int_max)
-    {
-	/* failure: nnew is too big.  Do not change p or n. */
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-    }
-    else
-    {
-	/* The object exists, and is changing to some other nonzero size. */
-	/* call realloc, or its equivalent */
-	PRINT1 (("realloc : %d to %d, %d\n", nold, nnew, size)) ;
-        pnew = SuiteSparse_realloc (nnew, nold, size, p, &ok) ;
-        if (ok)
-        {
-	    /* success: return revised p and change the size of the block */
-	    PRINTM (("cholmod_free %p %g cnt: %g inuse %g\n"
-		     "cholmod_malloc %p %g cnt: %g inuse %g\n",
-		p, (double) nold*size, (double) Common->malloc_count-1,
-                   (double) (Common->memory_inuse - nold*size),
-		pnew, (double) nnew*size, (double) Common->malloc_count,
-                   (double) (Common->memory_inuse + (nnew-nold)*size))) ;
-	    p = pnew ;
-	    *n = nnew ;
-	    Common->memory_inuse += ((nnew-nold) * size) ;
-	}
-        else
-        {
-            /* Increasing the size of the block has failed.
-             * Do not change n. */
-            ERROR (CHOLMOD_OUT_OF_MEMORY, "out of memory") ;
-        }
-
-	Common->memory_usage = MAX (Common->memory_usage, Common->memory_inuse);
-    }
-
-    return (p) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_realloc_multiple ============================================= */
-/* ========================================================================== */
-
-/* reallocate multiple blocks of memory, all of the same size (up to two integer
- * and two real blocks).  Either reallocations all succeed, or all are returned
- * in the original size (they are freed if the original size is zero).  The nnew
- * blocks are of size 1 or more.
- */
-
-int CHOLMOD(realloc_multiple)
-(
-    /* ---- input ---- */
-    size_t nnew,	/* requested # of items in reallocated blocks */
-    int nint,		/* number of int/SuiteSparse_long blocks */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* ---- in/out --- */
-    void **Iblock,	/* int or SuiteSparse_long block */
-    void **Jblock,	/* int or SuiteSparse_long block */
-    void **Xblock,	/* complex or double block */
-    void **Zblock,	/* zomplex case only: double block */
-    size_t *nold_p,	/* current size of the I,J,X,Z blocks on input,
-			 * nnew on output if successful */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *xx, *zz ;
-    size_t i, j, x, z, nold ;
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-
-    if (xtype < CHOLMOD_PATTERN || xtype > CHOLMOD_ZOMPLEX)
-    {
-	ERROR (CHOLMOD_INVALID, "invalid xtype") ;
-	return (FALSE) ;
-    }
-
-    nold = *nold_p ;
-
-    if (nint < 1 && xtype == CHOLMOD_PATTERN)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-
-    i = nold ;
-    j = nold ;
-    x = nold ;
-    z = nold ;
-
-    if (nint > 0)
-    {
-	*Iblock = CHOLMOD(realloc) (nnew, sizeof (Int), *Iblock, &i, Common) ;
-    }
-    if (nint > 1)
-    {
-	*Jblock = CHOLMOD(realloc) (nnew, sizeof (Int), *Jblock, &j, Common) ;
-    }
-
-    switch (xtype)
-    {
-	case CHOLMOD_REAL:
-	    *Xblock = CHOLMOD(realloc) (nnew, sizeof (double), *Xblock, &x,
-                    Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    *Xblock = CHOLMOD(realloc) (nnew, 2*sizeof (double), *Xblock, &x,
-                    Common) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    *Xblock = CHOLMOD(realloc) (nnew, sizeof (double), *Xblock, &x,
-                    Common) ;
-	    *Zblock = CHOLMOD(realloc) (nnew, sizeof (double), *Zblock, &z,
-                    Common) ;
-	    break ;
-    }
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* one or more realloc's failed.  Resize all back down to nold. */
-
-	if (nold == 0)
-	{
-
-	    if (nint > 0)
-	    {
-		*Iblock = CHOLMOD(free) (i, sizeof (Int), *Iblock, Common) ;
-	    }
-	    if (nint > 1)
-	    {
-		*Jblock = CHOLMOD(free) (j, sizeof (Int), *Jblock, Common) ;
-	    }
-
-	    switch (xtype)
-	    {
-		case CHOLMOD_REAL:
-		    *Xblock = CHOLMOD(free) (x, sizeof (double), *Xblock,
-                            Common) ;
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    *Xblock = CHOLMOD(free) (x, 2*sizeof (double), *Xblock,
-                            Common) ;
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    *Xblock = CHOLMOD(free) (x, sizeof (double), *Xblock,
-                            Common) ;
-		    *Zblock = CHOLMOD(free) (x, sizeof (double), *Zblock,
-                            Common) ;
-		    break ;
-	    }
-
-	}
-	else
-	{
-	    if (nint > 0)
-	    {
-		*Iblock = CHOLMOD(realloc) (nold, sizeof (Int), *Iblock, &i,
-                            Common) ;
-	    }
-	    if (nint > 1)
-	    {
-		*Jblock = CHOLMOD(realloc) (nold, sizeof (Int), *Jblock, &j,
-                            Common) ;
-	    }
-
-	    switch (xtype)
-	    {
-		case CHOLMOD_REAL:
-		    *Xblock = CHOLMOD(realloc) (nold, sizeof (double),
-                            *Xblock, &x, Common) ;
-		    break ;
-
-		case CHOLMOD_COMPLEX:
-		    *Xblock = CHOLMOD(realloc) (nold, 2*sizeof (double),
-                            *Xblock, &x, Common) ;
-		    break ;
-
-		case CHOLMOD_ZOMPLEX:
-		    *Xblock = CHOLMOD(realloc) (nold, sizeof (double),
-                            *Xblock, &x, Common) ;
-		    *Zblock = CHOLMOD(realloc) (nold, sizeof (double),
-                            *Zblock, &z, Common) ;
-		    break ;
-	    }
-
-	}
-
-	return (FALSE) ;
-    }
-
-    if (nold == 0)
-    {
-	/* New space was allocated.  Clear the first entry so that valgrind
-	 * doesn't complain about its access in change_complexity
-	 * (Core/cholmod_complex.c). */
-	xx = *Xblock ;
-	zz = *Zblock ;
-	switch (xtype)
-	{
-	    case CHOLMOD_REAL:
-		xx [0] = 0 ;
-		break ;
-
-	    case CHOLMOD_COMPLEX:
-		xx [0] = 0 ;
-		xx [1] = 0 ;
-		break ;
-
-	    case CHOLMOD_ZOMPLEX:
-		xx [0] = 0 ;
-		zz [0] = 0 ;
-		break ;
-	}
-    }
-
-    /* all realloc's succeeded, change size to reflect realloc'ed size. */
-    *nold_p = nnew ;
-    return (TRUE) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_sparse.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_sparse.c
deleted file mode 100644
index 557dbc1..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_sparse.c
+++ /dev/null
@@ -1,651 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_sparse ================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Core utility routines for the cholmod_sparse object:
- *
- * A sparse matrix is held in compressed column form.  In the basic type
- * ("packed", which corresponds to a MATLAB sparse matrix), an n-by-n matrix
- * with nz entries is held in three arrays: p of size n+1, i of size nz, and x
- * of size nz.  Row indices of column j are held in i [p [j] ... p [j+1]-1] and
- * in the same locations in x.  There may be no duplicate entries in a column.
- * Row indices in each column may be sorted or unsorted (CHOLMOD keeps track).
- *
- * Primary routines:
- * -----------------
- * cholmod_allocate_sparse	allocate a sparse matrix
- * cholmod_free_sparse		free a sparse matrix
- *
- * Secondary routines:
- * -------------------
- * cholmod_reallocate_sparse	change the size (# entries) of sparse matrix
- * cholmod_nnz			number of nonzeros in a sparse matrix
- * cholmod_speye		sparse identity matrix
- * cholmod_spzeros		sparse zero matrix
- * cholmod_copy_sparse		create a copy of a sparse matrix
- *
- * All xtypes are supported (pattern, real, complex, and zomplex)
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-
-/* ========================================================================== */
-/* === cholmod_allocate_sparse ============================================== */
-/* ========================================================================== */
-
-/* Allocate space for a matrix.  A->i and A->x are not initialized.  A->p
- * (and A->nz if A is not packed) are set to zero, so a matrix containing no
- * entries (all zero) is returned.  See also cholmod_spzeros.
- *
- * workspace: none
- */
-
-cholmod_sparse *CHOLMOD(allocate_sparse)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of A */
-    size_t ncol,	/* # of columns of A */
-    size_t nzmax,	/* max # of nonzeros of A */
-    int sorted,		/* TRUE if columns of A sorted, FALSE otherwise */
-    int packed,		/* TRUE if A will be packed, FALSE otherwise */
-    int stype,		/* stype of A */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *A ;
-    Int *Ap, *Anz ;
-    size_t nzmax0 ;
-    Int j ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    if (stype != 0 && nrow != ncol)
-    {
-	ERROR (CHOLMOD_INVALID, "rectangular matrix with stype != 0 invalid") ;
-	return (NULL) ;
-    }
-    if (xtype < CHOLMOD_PATTERN || xtype > CHOLMOD_ZOMPLEX)
-    {
-	ERROR (CHOLMOD_INVALID, "xtype invalid") ;
-	return (NULL) ;
-    }
-    /* ensure the dimensions do not cause integer overflow */
-    (void) CHOLMOD(add_size_t) (ncol, 2, &ok) ;
-    if (!ok || nrow > Int_max || ncol > Int_max || nzmax > Int_max)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate header */
-    /* ---------------------------------------------------------------------- */
-
-    A = CHOLMOD(malloc) (sizeof (cholmod_sparse), 1, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-    PRINT1 (("cholmod_allocate_sparse %d-by-%d nzmax %d sorted %d packed %d"
-		" xtype %d\n", nrow, ncol, nzmax, sorted, packed, xtype)) ;
-
-    nzmax = MAX (1, nzmax) ;
-
-    A->nrow = nrow ;
-    A->ncol = ncol ;
-    A->nzmax = nzmax ;
-    A->packed = packed ;    /* default is packed (A->nz not present) */
-    A->stype = stype ;
-    A->itype = ITYPE ;
-    A->xtype = xtype ;
-    A->dtype = DTYPE ;
-
-    A->nz = NULL ;
-    A->p = NULL ;
-    A->i = NULL ;
-    A->x = NULL ;
-    A->z = NULL ;
-
-    /* A 1-by-m matrix always has sorted columns */
-    A->sorted = (nrow <= 1) ? TRUE : sorted ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the matrix itself */
-    /* ---------------------------------------------------------------------- */
-
-    /* allocate O(ncol) space */
-    A->p = CHOLMOD(malloc) (((size_t) ncol)+1, sizeof (Int), Common) ;
-    if (!packed)
-    {
-	A->nz = CHOLMOD(malloc) (ncol, sizeof (Int), Common) ;
-    }
-
-    /* allocate O(nz) space */
-    nzmax0 = 0 ;
-    CHOLMOD(realloc_multiple) (nzmax, 1, xtype, &(A->i), NULL, &(A->x), &(A->z),
-	    &nzmax0, Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free_sparse) (&A, Common) ;
-	return (NULL) ;	    /* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* initialize A->p and A->nz so that A is an empty matrix */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    for (j = 0 ; j <= (Int) ncol ; j++)
-    {
-	Ap [j] = 0 ;
-    }
-    if (!packed)
-    {
-	Anz = A->nz ;
-	for (j = 0 ; j < (Int) ncol ; j++)
-	{
-	    Anz [j] = 0 ;
-	}
-    }
-    return (A) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_free_sparse ================================================== */
-/* ========================================================================== */
-
-/* free a sparse matrix
- *
- * workspace: none
- */
-
-int CHOLMOD(free_sparse)
-(
-    /* ---- in/out --- */
-    cholmod_sparse **AHandle,	/* matrix to deallocate, NULL on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int n, nz ;
-    cholmod_sparse *A ;
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-
-    if (AHandle == NULL)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-    A = *AHandle ;
-    if (A == NULL)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-    n = A->ncol ;
-    nz = A->nzmax ;
-    A->p  = CHOLMOD(free) (n+1, sizeof (Int), A->p,  Common) ;
-    A->i  = CHOLMOD(free) (nz,  sizeof (Int), A->i,  Common) ;
-    A->nz = CHOLMOD(free) (n,   sizeof (Int), A->nz, Common) ;
-
-    switch (A->xtype)
-    {
-	case CHOLMOD_REAL:
-	    A->x = CHOLMOD(free) (nz, sizeof (double), A->x,  Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    A->x = CHOLMOD(free) (nz, 2*sizeof (double), A->x,  Common) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    A->x = CHOLMOD(free) (nz, sizeof (double), A->x,  Common) ;
-	    A->z = CHOLMOD(free) (nz, sizeof (double), A->z,  Common) ;
-	    break ;
-    }
-
-    *AHandle = CHOLMOD(free) (1, sizeof (cholmod_sparse), (*AHandle), Common) ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_reallocate_sparse ============================================ */
-/* ========================================================================== */
-
-/* Change the size of A->i, A->x, and A->z, or allocate them if their current
- * size is zero.  A->x and A->z are not modified if A->xtype is CHOLMOD_PATTERN.
- * A->z is not modified unless A->xtype is CHOLMOD_ZOMPLEX.
- * 
- * workspace: none
- */
-
-int CHOLMOD(reallocate_sparse)
-(
-    /* ---- input ---- */
-    size_t nznew,	/* new # of entries in A */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix to reallocate */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    PRINT1 (("realloc matrix %d to %d, xtype: %d\n",
-		A->nzmax, nznew, A->xtype)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* resize the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(realloc_multiple) (MAX (1,nznew), 1, A->xtype, &(A->i), NULL,
-	    &(A->x), &(A->z), &(A->nzmax), Common) ;
-
-    return (Common->status == CHOLMOD_OK) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_speye ======================================================== */
-/* ========================================================================== */
-
-/* Return a sparse identity matrix. */
-
-cholmod_sparse *CHOLMOD(speye)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of A */
-    size_t ncol,	/* # of columns of A */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Az ;
-    cholmod_sparse *A ;
-    Int *Ap, *Ai ;
-    Int j, n ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    n = MIN (nrow, ncol) ;
-    A = CHOLMOD(allocate_sparse) (nrow, ncol, n, TRUE, TRUE, 0, xtype,
-	    Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory or inputs invalid */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* create the identity matrix */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Az = A->z ;
-
-    for (j = 0 ; j < n ; j++)
-    {
-	Ap [j] = j ;
-    }
-    for (j = n ; j <= ((Int) ncol) ; j++)
-    {
-	Ap [j] = n ;
-    }
-    for (j = 0 ; j < n ; j++)
-    {
-	Ai [j] = j ;
-    }
-
-    switch (xtype)
-    {
-	case CHOLMOD_REAL:
-	    for (j = 0 ; j < n ; j++)
-	    {
-		Ax [j] = 1 ;
-	    }
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    for (j = 0 ; j < n ; j++)
-	    {
-		Ax [2*j  ] = 1 ;
-		Ax [2*j+1] = 0 ;
-	    }
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    for (j = 0 ; j < n ; j++)
-	    {
-		Ax [j] = 1 ;
-	    }
-	    for (j = 0 ; j < n ; j++)
-	    {
-		Az [j] = 0 ;
-	    }
-	    break ;
-    }
-
-    return (A) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_spzeros ====================================================== */
-/* ========================================================================== */
-
-/* Return a sparse zero matrix. */
-
-cholmod_sparse *CHOLMOD(spzeros)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of A */
-    size_t ncol,	/* # of columns of A */
-    size_t nzmax,	/* max # of nonzeros of A */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    return (CHOLMOD(allocate_sparse) (nrow, ncol, nzmax, TRUE, TRUE, 0, xtype,
-	    Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_nnz ========================================================== */
-/* ========================================================================== */
-
-/* Return the number of entries in a sparse matrix.
- *
- * workspace: none
- * integer overflow cannot occur, since the matrix is already allocated.
- */
-
-SuiteSparse_long CHOLMOD(nnz)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Ap, *Anz ;
-    size_t nz ;
-    Int j, ncol ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (EMPTY) ;
-    RETURN_IF_NULL (A, EMPTY) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, EMPTY) ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* return nnz (A) */
-    /* ---------------------------------------------------------------------- */
-
-    ncol = A->ncol ;
-    if (A->packed)
-    {
-	Ap = A->p ;
-	RETURN_IF_NULL (Ap, EMPTY) ;
-	nz = Ap [ncol] ;
-    }
-    else
-    {
-	Anz = A->nz ;
-	RETURN_IF_NULL (Anz, EMPTY) ;
-	nz = 0 ;
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    nz += MAX (0, Anz [j]) ;
-	}
-    }
-    return (nz) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_copy_sparse ================================================== */
-/* ========================================================================== */
-
-/* C = A.  Create an exact copy of a sparse matrix, with one exception.
- * Entries in unused space are not copied (they might not be initialized,
- * and copying them would cause program checkers such as purify and
- * valgrind to complain).  The xtype of the resulting matrix C is the same as
- * the xtype of the input matrix A.
- *
- * See also Core/cholmod_copy, which copies a matrix with possible changes
- * in stype, presence of diagonal entries, pattern vs. numerical values,
- * real and/or imaginary parts, and so on.
- */
-
-cholmod_sparse *CHOLMOD(copy_sparse)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Cx, *Az, *Cz ;
-    Int *Ap, *Ai, *Anz, *Cp, *Ci, *Cnz ;
-    cholmod_sparse *C ;
-    Int p, pend, j, ncol, packed, nzmax, nz, xtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, NULL) ;
-    if (A->stype != 0 && A->nrow != A->ncol)
-    {
-	ERROR (CHOLMOD_INVALID, "rectangular matrix with stype != 0 invalid") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-    ASSERT (CHOLMOD(dump_sparse) (A, "A original", Common) >= 0) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    ncol = A->ncol ;
-    nzmax = A->nzmax ;
-    packed = A->packed ;
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Az = A->z ;
-    Anz = A->nz ;
-    xtype = A->xtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the copy */
-    /* ---------------------------------------------------------------------- */
-
-    C = CHOLMOD(allocate_sparse) (A->nrow, A->ncol, A->nzmax, A->sorted,
-	    A->packed, A->stype, A->xtype, Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-    Cz = C->z ;
-    Cnz = C->nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* copy the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    for (j = 0 ; j <= ncol ; j++)
-    {
-	Cp [j] = Ap [j] ;
-    }
-
-    if (packed)
-    {
-	nz = Ap [ncol] ;
-	for (p = 0 ; p < nz ; p++)
-	{
-	    Ci [p] = Ai [p] ;
-	}
-
-	switch (xtype)
-	{
-	    case CHOLMOD_REAL:
-		for (p = 0 ; p < nz ; p++)
-		{
-		    Cx [p] = Ax [p] ;
-		}
-		break ;
-
-	    case CHOLMOD_COMPLEX:
-		for (p = 0 ; p < 2*nz ; p++)
-		{
-		    Cx [p] = Ax [p] ;
-		}
-		break ;
-
-	    case CHOLMOD_ZOMPLEX:
-		for (p = 0 ; p < nz ; p++)
-		{
-		    Cx [p] = Ax [p] ;
-		    Cz [p] = Az [p] ;
-		}
-		break ;
-	}
-
-    }
-    else
-    {
-
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    Cnz [j] = Anz [j] ;
-	}
-
-	switch (xtype)
-	{
-	    case CHOLMOD_PATTERN:
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    p = Ap [j] ;
-		    pend = p + Anz [j] ;
-		    for ( ; p < pend ; p++)
-		    {
-			Ci [p] = Ai [p] ;
-		    }
-		}
-		break ;
-
-	    case CHOLMOD_REAL:
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    p = Ap [j] ;
-		    pend = p + Anz [j] ;
-		    for ( ; p < pend ; p++)
-		    {
-			Ci [p] = Ai [p] ;
-			Cx [p] = Ax [p] ;
-		    }
-		}
-		break ;
-
-	    case CHOLMOD_COMPLEX:
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    p = Ap [j] ;
-		    pend = p + Anz [j] ;
-		    for ( ; p < pend ; p++)
-		    {
-			Ci [p] = Ai [p] ;
-			Cx [2*p  ] = Ax [2*p  ] ;
-			Cx [2*p+1] = Ax [2*p+1] ;
-		    }
-		}
-		break ;
-
-	    case CHOLMOD_ZOMPLEX:
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    p = Ap [j] ;
-		    pend = p + Anz [j] ;
-		    for ( ; p < pend ; p++)
-		    {
-			Ci [p] = Ai [p] ;
-			Cx [p] = Ax [p] ;
-			Cz [p] = Az [p] ;
-		    }
-		}
-		break ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the result */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_sparse) (C, "C copy", Common) >= 0) ;
-    return (C) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_transpose.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_transpose.c
deleted file mode 100644
index 51a7035..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_transpose.c
+++ /dev/null
@@ -1,1138 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_transpose =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Core utility routines for the cholmod_sparse object to
- * compute the transpose or permuted transpose of a matrix:
- *
- * Primary routines:
- * -----------------
- * cholmod_transpose		transpose sparse matrix
- * cholmod_ptranspose		transpose and permute sparse matrix
- * cholmod_sort			sort row indices in each column of sparse matrix
- *
- * Secondary routines:
- * -------------------
- * cholmod_transpose_unsym	transpose unsymmetric sparse matrix
- * cholmod_transpose_sym	transpose symmetric sparse matrix
- *
- * All xtypes (pattern, real, complex, and zomplex) are supported.
- *
- * ---------------------------------------
- * Unsymmetric case: A->stype is zero.
- * ---------------------------------------
- *
- * Computes F = A', F = A (:,f)' or F = A (p,f)', except that the indexing by
- * f does not work the same as the MATLAB notation (see below).  A->stype
- * is zero, which denotes that both the upper and lower triangular parts of
- * A are present (and used).  A may in fact be symmetric in pattern and/or
- * value; A->stype just denotes which part of A are stored.  A may be
- * rectangular.
- *
- * p is a permutation of 0:m-1, and f is a subset of 0:n-1, where A is m-by-n.
- * There can be no duplicate entries in p or f.
- *
- * The set f is held in fset and fsize.
- *	fset = NULL means ":" in MATLAB. fsize is ignored.
- *	fset != NULL means f = fset [0..fsize-1].
- *	fset != NULL and fsize = 0 means f is the empty set.
- *
- * Columns not in the set f are considered to be zero.  That is,
- * if A is 5-by-10 then F = A (:,[3 4])' is not 2-by-5, but 10-by-5, and rows
- * 3 and 4 of F are equal to columns 3 and 4 of A (the other rows of F are
- * zero).  More precisely, in MATLAB notation:
- *
- *	[m n] = size (A) ;
- *	F = A ;
- *	notf = ones (1,n) ;
- *	notf (f) = 0 ;
- *	F (:, find (notf)) = 0
- *	F = F'
- *
- * If you want the MATLAB equivalent F=A(p,f) operation, use cholmod_submatrix
- * instead (which does not compute the transpose).
- *
- * F->nzmax must be large enough to hold the matrix F.  It is not modified.
- * If F->nz is present then F->nz [j] = # of entries in column j of F.
- *
- * A can be sorted or unsorted, with packed or unpacked columns.
- *
- * If f is present and not sorted in ascending order, then F is unsorted
- * (that is, it may contain columns whose row indices do not appear in
- * ascending order).  Otherwise, F is sorted (the row indices in each
- * column of F appear in strictly ascending order).
- *
- * F is returned in packed or unpacked form, depending on F->packed on input.
- * If F->packed is false, then F is returned in unpacked form (F->nz must be
- * present).  Each row i of F is large enough to hold all the entries in row i
- * of A, even if f is provided.  That is, F->i and
- * F->x [F->p [i] .. F->p [i] + F->nz [i] - 1] contain all entries in A (i,f),
- * but F->p [i+1] - F->p [i] is equal to the number of nonzeros in A (i,:),
- * not just A (i,f).
- *
- * The cholmod_transpose_unsym routine is the only operation in CHOLMOD that
- * can produce an unpacked matrix.
- *
- * ---------------------------------------
- * Symmetric case: A->stype is nonzero.
- * ---------------------------------------
- *
- * Computes F = A' or F = A(p,p)', the transpose or permuted transpose, where
- * A->stype is nonzero.
- *
- * If A->stype > 0, then A is a symmetric matrix where just the upper part
- * of the matrix is stored.  Entries in the lower triangular part may be
- * present, but are ignored.  A must be square.  If F=A', then F is returned
- * sorted; otherwise F is unsorted for the F=A(p,p)' case.
- *
- * There can be no duplicate entries in p.
- * The fset and fsize parameters are not used.
- *
- * Three kinds of transposes are available, depending on the "values" parameter:
- * 0: do not transpose the numerical values; create a CHOLMOD_PATTERN matrix
- * 1: array transpose
- * 2: complex conjugate transpose (same as 2 if input is real or pattern)
- *
- * -----------------------------------------------------------------------------
- *
- * For cholmod_transpose_unsym and cholmod_transpose_sym, the output matrix
- * F must already be pre-allocated by the caller, with the correct dimensions.
- * If F is not valid or has the wrong dimensions, it is not modified.
- * Otherwise, if F is too small, the transpose is not computed; the contents
- * of F->p contain the column pointers of the resulting matrix, where
- * F->p [F->ncol] > F->nzmax.  In this case, the remaining contents of F are
- * not modified.  F can still be properly free'd with cholmod_free_sparse.
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-
-/* ========================================================================== */
-/* === TEMPLATE ============================================================= */
-/* ========================================================================== */
-
-#define PATTERN
-#include "t_cholmod_transpose.c"
-#define REAL
-#include "t_cholmod_transpose.c"
-#define COMPLEX
-#include "t_cholmod_transpose.c"
-#define COMPLEX
-#define NCONJUGATE
-#include "t_cholmod_transpose.c"
-#define ZOMPLEX
-#include "t_cholmod_transpose.c"
-#define ZOMPLEX
-#define NCONJUGATE
-#include "t_cholmod_transpose.c"
-
-
-/* ========================================================================== */
-/* === cholmod_transpose_unsym ============================================== */
-/* ========================================================================== */
-
-/* Compute F = A', A (:,f)', or A (p,f)', where A is unsymmetric and F is
- * already allocated.  See cholmod_transpose for a simpler routine.
- *
- * workspace:
- * Iwork (MAX (nrow,ncol)) if fset is present
- * Iwork (nrow) if fset is NULL
- *
- * The xtype of A and F must match, unless values is zero or F->xtype is
- * CHOLMOD_PATTERN (in which case only the pattern of A is transpose into F).
- */
-
-int CHOLMOD(transpose_unsym)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    int values,		/* 2: complex conj. transpose, 1: array transpose,
-			   0: do not transpose the numerical values */
-    Int *Perm,		/* size nrow, if present (can be NULL) */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- output --- */
-    cholmod_sparse *F,	/* F = A', A(:,f)', or A(p,f)' */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Fp, *Fnz, *Ap, *Ai, *Anz, *Wi ;
-    Int nrow, ncol, permute, use_fset, Apacked, Fpacked, p, pend,
-	i, j, k, Fsorted, nf, jj, jlast ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (F, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (F, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (A->nrow != F->ncol || A->ncol != F->nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "F has the wrong dimensions") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nf = fsize ;
-    use_fset = (fset != NULL) ;
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-
-    Ap = A->p ;		/* size A->ncol+1, column pointers of A */
-    Ai = A->i ;		/* size nz = Ap [A->ncol], row indices of A */
-    Anz = A->nz ;
-    Apacked = A->packed ;
-    ASSERT (IMPLIES (!Apacked, Anz != NULL)) ;
-
-    permute = (Perm != NULL) ;
-
-    Fp = F->p ;		/* size A->nrow+1, row pointers of F */
-    Fnz = F->nz ;
-    Fpacked = F->packed ;
-    ASSERT (IMPLIES (!Fpacked, Fnz != NULL)) ;
-
-    nf = (use_fset) ? nf : ncol ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* s = nrow + ((fset != NULL) ? ncol : 0) */
-    s = CHOLMOD(add_size_t) (nrow, ((fset != NULL) ? ncol : 0), &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (0, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;	/* out of memory */
-    }
-
-    Wi = Common->Iwork ;	/* size nrow (i/l/l) */
-
-    /* ---------------------------------------------------------------------- */
-    /* check Perm and fset */
-    /* ---------------------------------------------------------------------- */
-
-    if (permute)
-    {
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    Wi [i] = 1 ;
-	}
-	for (k = 0 ; k < nrow ; k++)
-	{
-	    i = Perm [k] ;
-	    if (i < 0 || i > nrow || Wi [i] == 0)
-	    {
-		ERROR (CHOLMOD_INVALID, "invalid permutation") ;
-		return (FALSE) ;
-	    }
-	    Wi [i] = 0 ;
-	}
-    }
-
-    if (use_fset)
-    {
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    Wi [j] = 1 ;
-	}
-	for (k = 0 ; k < nf ; k++)
-	{
-	    j = fset [k] ;
-	    if (j < 0 || j > ncol || Wi [j] == 0)
-	    {
-		ERROR (CHOLMOD_INVALID, "invalid fset") ;
-		return (FALSE) ;
-	    }
-	    Wi [j] = 0 ;
-	}
-    }
-
-    /* Perm and fset are now valid */
-    ASSERT (CHOLMOD(dump_perm) (Perm, nrow, nrow, "Perm", Common)) ;
-    ASSERT (CHOLMOD(dump_perm) (fset, nf, ncol, "fset", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* count the entries in each row of A or A(:,f) */
-    /* ---------------------------------------------------------------------- */
-
-    for (i = 0 ; i < nrow ; i++)
-    {
-	Wi [i] = 0 ;
-    }
-
-    jlast = EMPTY ;
-    Fsorted = TRUE ;
-
-    if (use_fset)
-    {
-	/* count entries in each row of A(:,f) */
-	for (jj = 0 ; jj < nf ; jj++)
-	{
-	    j = fset [jj] ;
-	    if (j <= jlast)
-	    {
-		Fsorted = FALSE ;
-	    }
-	    p = Ap [j] ;
-	    pend = (Apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		Wi [Ai [p]]++ ;
-	    }
-	    jlast = j ;
-	}
-
-	/* save the nz counts if F is unpacked, and recount all of A */
-	if (!Fpacked)
-	{
-	    if (permute)
-	    {
-		for (i = 0 ; i < nrow ; i++)
-		{
-		    Fnz [i] = Wi [Perm [i]] ;
-		}
-	    }
-	    else
-	    {
-		for (i = 0 ; i < nrow ; i++)
-		{
-		    Fnz [i] = Wi [i] ;
-		}
-	    }
-	    for (i = 0 ; i < nrow ; i++)
-	    {
-		Wi [i] = 0 ;
-	    }
-
-	    /* count entries in each row of A */
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		p = Ap [j] ;
-		pend = (Apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-		for ( ; p < pend ; p++)
-		{
-		    Wi [Ai [p]]++ ;
-		}
-	    }
-	}
-
-    }
-    else
-    {
-
-	/* count entries in each row of A */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (Apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		Wi [Ai [p]]++ ;
-	    }
-	}
-
-	/* save the nz counts if F is unpacked */
-	if (!Fpacked)
-	{
-	    if (permute)
-	    {
-		for (i = 0 ; i < nrow ; i++)
-		{
-		    Fnz [i] = Wi [Perm [i]] ;
-		}
-	    }
-	    else
-	    {
-		for (i = 0 ; i < nrow ; i++)
-		{
-		    Fnz [i] = Wi [i] ;
-		}
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the row pointers */
-    /* ---------------------------------------------------------------------- */
-
-    p = 0 ;
-    if (permute)
-    {
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    Fp [i] = p ;
-	    p += Wi [Perm [i]] ;
-	}
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    Wi [Perm [i]] = Fp [i] ;
-	}
-    }
-    else
-    {
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    Fp [i] = p ;
-	    p += Wi [i] ;
-	}
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    Wi [i] = Fp [i] ;
-	}
-    }
-    Fp [nrow] = p ;
-
-    if (p > (Int) (F->nzmax))
-    {
-	ERROR (CHOLMOD_INVALID, "F is too small") ;
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* transpose matrix, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    ok = FALSE ;
-    if (values == 0 || F->xtype == CHOLMOD_PATTERN)
-    {
-	ok = p_cholmod_transpose_unsym (A, Perm, fset, nf, F, Common) ;
-    }
-    else if (F->xtype == CHOLMOD_REAL)
-    {
-	ok = r_cholmod_transpose_unsym (A, Perm, fset, nf, F, Common) ;
-    }
-    else if (F->xtype == CHOLMOD_COMPLEX)
-    {
-	if (values == 1)
-	{
-	    /* array transpose */
-	    ok = ct_cholmod_transpose_unsym (A, Perm, fset, nf, F, Common) ;
-	}
-	else
-	{
-	    /* complex conjugate transpose */
-	    ok = c_cholmod_transpose_unsym (A, Perm, fset, nf, F, Common) ;
-	}
-    }
-    else if (F->xtype == CHOLMOD_ZOMPLEX)
-    {
-	if (values == 1)
-	{
-	    /* array transpose */
-	    ok = zt_cholmod_transpose_unsym (A, Perm, fset, nf, F, Common) ;
-	}
-	else
-	{
-	    /* complex conjugate transpose */
-	    ok = z_cholmod_transpose_unsym (A, Perm, fset, nf, F, Common) ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* finalize result F */
-    /* ---------------------------------------------------------------------- */
-
-    if (ok)
-    {
-	F->sorted = Fsorted ;
-    }
-    ASSERT (CHOLMOD(dump_sparse) (F, "output F unsym", Common) >= 0) ;
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_transpose_sym ================================================ */
-/* ========================================================================== */
-
-/* Compute F = A' or A (p,p)', where A is symmetric and F is already allocated.
- * See cholmod_transpose for a simpler routine.
- *
- * workspace:  Iwork (nrow) if Perm NULL, Iwork (2*nrow) if Perm non-NULL.
- */
-
-int CHOLMOD(transpose_sym)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    int values,		/* 2: complex conj. transpose, 1: array transpose,
-			   0: do not transpose the numerical values */
-    Int *Perm,		/* size nrow, if present (can be NULL) */
-    /* ---- output --- */
-    cholmod_sparse *F,	/* F = A' or A(p,p)' */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Ap, *Anz, *Ai, *Fp, *Wi, *Pinv, *Iwork ;
-    Int p, pend, packed, upper, permute, jold, n, i, j, k, iold ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (F, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (F, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    if (A->nrow != A->ncol || A->stype == 0)
-    {
-	/* this routine handles square symmetric matrices only */
-	ERROR (CHOLMOD_INVALID, "matrix must be symmetric") ;
-	return (FALSE) ;
-    }
-    if (A->nrow != F->ncol || A->ncol != F->nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "F has the wrong dimensions") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    permute = (Perm != NULL) ;
-    n = A->nrow ;
-    Ap = A->p ;		/* size A->ncol+1, column pointers of A */
-    Ai = A->i ;		/* size nz = Ap [A->ncol], row indices of A */
-    Anz = A->nz ;
-    packed = A->packed ;
-    ASSERT (IMPLIES (!packed, Anz != NULL)) ;
-    upper = (A->stype > 0) ;
-
-    Fp = F->p ;		/* size A->nrow+1, row pointers of F */
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* s = (Perm != NULL) ? 2*n : n */
-    s = CHOLMOD(add_size_t) (n, ((Perm != NULL) ? n : 0), &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (0, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;	/* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Iwork = Common->Iwork ;
-    Wi   = Iwork ;	    /* size n (i/l/l) */
-    Pinv = Iwork + n ;	    /* size n (i/i/l) , unused if Perm NULL */
-
-    /* ---------------------------------------------------------------------- */
-    /* check Perm and construct inverse permutation */
-    /* ---------------------------------------------------------------------- */
-
-    if (permute)
-    {
-	for (i = 0 ; i < n ; i++)
-	{
-	    Pinv [i] = EMPTY ;
-	}
-	for (k = 0 ; k < n ; k++)
-	{
-	    i = Perm [k] ;
-	    if (i < 0 || i > n || Pinv [i] != EMPTY)
-	    {
-		ERROR (CHOLMOD_INVALID, "invalid permutation") ;
-		return (FALSE) ;
-	    }
-	    Pinv [i] = k ;
-	}
-    }
-
-    /* Perm is now valid */
-    ASSERT (CHOLMOD(dump_perm) (Perm, n, n, "Perm", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* count the entries in each row of F */
-    /* ---------------------------------------------------------------------- */
-
-    for (i = 0 ; i < n ; i++)
-    {
-	Wi [i] = 0 ;
-    }
-
-    if (packed)
-    {
-	if (permute)
-	{
-	    if (upper)
-	    {
-		/* packed, permuted, upper */
-		for (j = 0 ; j < n ; j++)
-		{
-		    jold = Perm [j] ;
-		    pend = Ap [jold+1] ;
-		    for (p = Ap [jold] ; p < pend ; p++)
-		    {
-			iold = Ai [p] ;
-			if (iold <= jold)
-			{
-			    i = Pinv [iold] ;
-			    Wi [MIN (i, j)]++ ;
-			}
-		    }
-		}
-	    }
-	    else
-	    {
-		/* packed, permuted, lower */
-		for (j = 0 ; j < n ; j++)
-		{
-		    jold = Perm [j] ;
-		    pend = Ap [jold+1] ;
-		    for (p = Ap [jold] ; p < pend ; p++)
-		    {
-			iold = Ai [p] ;
-			if (iold >= jold)
-			{
-			    i = Pinv [iold] ;
-			    Wi [MAX (i, j)]++ ;
-			}
-		    }
-		}
-	    }
-	}
-	else
-	{
-	    if (upper)
-	    {
-		/* packed, unpermuted, upper */
-		for (j = 0 ; j < n ; j++)
-		{
-		    pend = Ap [j+1] ;
-		    for (p = Ap [j] ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			if (i <= j)
-			{
-			    Wi [i]++ ;
-			}
-		    }
-		}
-	    }
-	    else
-	    {
-		/* packed, unpermuted, lower */
-		for (j = 0 ; j < n ; j++)
-		{
-		    pend = Ap [j+1] ;
-		    for (p = Ap [j] ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			if (i >= j)
-			{
-			    Wi [i]++ ;
-			}
-		    }
-		}
-	    }
-	}
-    }
-    else
-    {
-	if (permute)
-	{
-	    if (upper)
-	    {
-		/* unpacked, permuted, upper */
-		for (j = 0 ; j < n ; j++)
-		{
-		    jold = Perm [j] ;
-		    p = Ap [jold] ;
-		    pend = p + Anz [jold] ;
-		    for ( ; p < pend ; p++)
-		    {
-			iold = Ai [p] ;
-			if (iold <= jold)
-			{
-			    i = Pinv [iold] ;
-			    Wi [MIN (i, j)]++ ;
-			}
-		    }
-		}
-	    }
-	    else
-	    {
-		/* unpacked, permuted, lower */
-		for (j = 0 ; j < n ; j++)
-		{
-		    jold = Perm [j] ;
-		    p = Ap [jold] ;
-		    pend = p + Anz [jold] ;
-		    for ( ; p < pend ; p++)
-		    {
-			iold = Ai [p] ;
-			if (iold >= jold)
-			{
-			    i = Pinv [iold] ;
-			    Wi [MAX (i, j)]++ ;
-			}
-		    }
-		}
-	    }
-	}
-	else
-	{
-	    if (upper)
-	    {
-		/* unpacked, unpermuted, upper */
-		for (j = 0 ; j < n ; j++)
-		{
-		    p = Ap [j] ;
-		    pend = p + Anz [j] ;
-		    for ( ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			if (i <= j)
-			{
-			    Wi [i]++ ;
-			}
-		    }
-		}
-	    }
-	    else
-	    {
-		/* unpacked, unpermuted, lower */
-		for (j = 0 ; j < n ; j++)
-		{
-		    p = Ap [j] ;
-		    pend = p + Anz [j] ;
-		    for ( ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			if (i >= j)
-			{
-			    Wi [i]++ ;
-			}
-		    }
-		}
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the row pointers */
-    /* ---------------------------------------------------------------------- */
-
-    p = 0 ;
-    for (i = 0 ; i < n ; i++)
-    {
-	Fp [i] = p ;
-	p += Wi [i] ;
-    }
-    Fp [n] = p ;
-    for (i = 0 ; i < n ; i++)
-    {
-	Wi [i] = Fp [i] ;
-    }
-
-    if (p > (Int) (F->nzmax))
-    {
-	ERROR (CHOLMOD_INVALID, "F is too small") ;
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* transpose matrix, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    ok = FALSE ;
-    if (values == 0 || F->xtype == CHOLMOD_PATTERN)
-    {
-	PRINT2 (("\n:::: p_transpose_sym Perm %p\n", Perm)) ;
-	ok = p_cholmod_transpose_sym (A, Perm, F, Common) ;
-    }
-    else if (F->xtype == CHOLMOD_REAL)
-    {
-	PRINT2 (("\n:::: r_transpose_sym Perm %p\n", Perm)) ;
-	ok = r_cholmod_transpose_sym (A, Perm, F, Common) ;
-    }
-    else if (F->xtype == CHOLMOD_COMPLEX)
-    {
-	if (values == 1)
-	{
-	    /* array transpose */
-	    PRINT2 (("\n:::: ct_transpose_sym Perm %p\n", Perm)) ;
-	    ok = ct_cholmod_transpose_sym (A, Perm, F, Common) ;
-	}
-	else
-	{
-	    /* complex conjugate transpose */
-	    PRINT2 (("\n:::: c_transpose_sym Perm %p\n", Perm)) ;
-	    ok = c_cholmod_transpose_sym (A, Perm, F, Common) ;
-	}
-    }
-    else if (F->xtype == CHOLMOD_ZOMPLEX)
-    {
-	if (values == 1)
-	{
-	    /* array transpose */
-	    PRINT2 (("\n:::: zt_transpose_sym Perm %p\n", Perm)) ;
-	    ok = zt_cholmod_transpose_sym (A, Perm, F, Common) ;
-	}
-	else
-	{
-	    /* complex conjugate transpose */
-	    PRINT2 (("\n:::: z_transpose_sym Perm %p\n", Perm)) ;
-	    ok = z_cholmod_transpose_sym (A, Perm, F, Common) ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* finalize result F */
-    /* ---------------------------------------------------------------------- */
-
-    /* F is sorted if there is no permutation vector */
-    if (ok)
-    {
-	F->sorted = !permute ;
-	F->packed = TRUE ;
-	F->stype = - SIGN (A->stype) ;	/* flip the stype */
-	ASSERT (CHOLMOD(dump_sparse) (F, "output F sym", Common) >= 0) ;
-    }
-    return (ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_transpose ==================================================== */
-/* ========================================================================== */
-
-/* Returns A'.  See also cholmod_ptranspose below. */
-
-cholmod_sparse *CHOLMOD(transpose)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    int values,		/* 2: complex conj. transpose, 1: array transpose,
-			   0: do not transpose the numerical values
-			   (returns its result as CHOLMOD_PATTERN) */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    return (CHOLMOD(ptranspose) (A, values, NULL, NULL, 0, Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_ptranspose =================================================== */
-/* ========================================================================== */
-
-/* Return A' or A(p,p)' if A is symmetric.  Return A', A(:,f)', or A(p,f)' if
- * A is unsymmetric.
- *
- * workspace:
- * Iwork (MAX (nrow,ncol)) if unsymmetric and fset is non-NULL
- * Iwork (nrow) if unsymmetric and fset is NULL
- * Iwork (2*nrow) if symmetric and Perm is non-NULL.
- * Iwork (nrow) if symmetric and Perm is NULL.
- *
- * A simple worst-case upper bound on the workspace is nrow+ncol.
- */
-
-cholmod_sparse *CHOLMOD(ptranspose)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    int values,		/* 2: complex conj. transpose, 1: array transpose,
-			   0: do not transpose the numerical values */
-    Int *Perm,		/* if non-NULL, F = A(p,f) or A(p,p) */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Ap, *Anz ;
-    cholmod_sparse *F ;
-    Int nrow, ncol, use_fset, j, jj, fnz, packed, stype, nf, xtype ;
-    size_t ineed ;
-    int ok = TRUE ;
-
-    nf = fsize ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, NULL) ;
-    stype = A->stype ;
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-
-    if (stype != 0)
-    {
-	use_fset = FALSE ;
-	if (Perm != NULL)
-	{
-	    ineed = CHOLMOD(mult_size_t) (A->nrow, 2, &ok) ;
-	}
-	else
-	{
-	    ineed = A->nrow ;
-	}
-    }
-    else
-    {
-	use_fset = (fset != NULL) ;
-	if (use_fset)
-	{
-	    ineed = MAX (A->nrow, A->ncol) ;
-	}
-	else
-	{
-	    ineed = A->nrow ;
-	}
-    }
-
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (NULL) ;
-    }
-
-    CHOLMOD(allocate_work) (0, ineed, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    Anz = A->nz ;
-    packed = A->packed ;
-    ASSERT (IMPLIES (!packed, Anz != NULL)) ;
-    xtype = values ? A->xtype : CHOLMOD_PATTERN ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate F */
-    /* ---------------------------------------------------------------------- */
-
-    /* determine # of nonzeros in F */
-    if (stype != 0)
-    {
-	/* F=A' or F=A(p,p)', fset is ignored */
-	fnz = CHOLMOD(nnz) (A, Common) ;
-    }
-    else
-    {
-	nf = (use_fset) ? nf : ncol ;
-	if (use_fset)
-	{
-	    fnz = 0 ;
-	    /* F=A(:,f)' or F=A(p,f)' */
-	    for (jj = 0 ; jj < nf ; jj++)
-	    {
-		/* The fset is not yet checked; it will be thoroughly checked
-		 * in cholmod_transpose_unsym.  For now, just make sure we don't
-		 * access Ap and Anz out of bounds. */
-		j = fset [jj] ;
-		if (j >= 0 && j < ncol)
-		{
-		    fnz += packed ? (Ap [j+1] - Ap [j]) : MAX (0, Anz [j]) ;
-		}
-	    }
-	}
-	else
-	{
-	    /* F=A' or F=A(p,:)' */
-	    fnz = CHOLMOD(nnz) (A, Common) ;
-	}
-    }
-
-    /* F is ncol-by-nrow, fnz nonzeros, sorted unless f is present and unsorted,
-     * packed, of opposite stype as A, and with/without numerical values */
-    F = CHOLMOD(allocate_sparse) (ncol, nrow, fnz, TRUE, TRUE, -SIGN(stype),
-	    xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* transpose and optionally permute the matrix A */
-    /* ---------------------------------------------------------------------- */
-
-    if (stype != 0)
-    {
-	/* F = A (p,p)', using upper or lower triangular part of A only */
-	ok = CHOLMOD(transpose_sym) (A, values, Perm, F, Common) ;
-    }
-    else
-    {
-	/* F = A (p,f)' */
-	ok = CHOLMOD(transpose_unsym) (A, values, Perm, fset, nf, F, Common) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the matrix F, or NULL if an error occured */
-    /* ---------------------------------------------------------------------- */
-
-    if (!ok)
-    {
-	CHOLMOD(free_sparse) (&F, Common) ;
-    }
-    return (F) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_sort ========================================================= */
-/* ========================================================================== */
-
-/* Sort the columns of A, in place.  Returns A in packed form, even if it
- * starts as unpacked.  Removes entries in the ignored part of a symmetric
- * matrix.
- *
- * workspace: Iwork (max (nrow,ncol)).  Allocates additional workspace for a
- * temporary copy of A'.
- */
-
-int CHOLMOD(sort)
-(
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix to sort */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int *Ap ;
-    cholmod_sparse *F ;
-    Int anz, ncol, nrow, stype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    nrow = A->nrow ;
-    if (nrow <= 1)
-    {
-	/* a 1-by-n sparse matrix must be sorted */
-	A->sorted = TRUE ;
-	return (TRUE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    ncol = A->ncol ;
-    CHOLMOD(allocate_work) (0, MAX (nrow, ncol), 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;	/* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    anz = CHOLMOD(nnz) (A, Common) ;
-    stype = A->stype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* sort the columns of the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    /* allocate workspace for transpose: ncol-by-nrow, same # of nonzeros as A,
-     * sorted, packed, same stype as A, and of the same numeric type as A. */
-    F = CHOLMOD(allocate_sparse) (ncol, nrow, anz, TRUE, TRUE, stype,
-	    A->xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;	/* out of memory */
-    }
-
-    if (stype != 0)
-    {
-	/* F = A', upper or lower triangular part only */
-	CHOLMOD(transpose_sym) (A, 1, NULL, F, Common) ;
-	A->packed = TRUE ;
-	/* A = F' */
-	CHOLMOD(transpose_sym) (F, 1, NULL, A, Common) ;
-    }
-    else
-    {
-	/* F = A' */
-	CHOLMOD(transpose_unsym) (A, 1, NULL, NULL, 0, F, Common) ;
-	A->packed = TRUE ;
-	/* A = F' */
-	CHOLMOD(transpose_unsym) (F, 1, NULL, NULL, 0, A, Common) ;
-    }
-
-    ASSERT (A->sorted && A->packed) ;
-    ASSERT (CHOLMOD(dump_sparse) (A, "Asorted", Common) >= 0) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* reduce A in size, if needed.  This must succeed. */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    anz = Ap [ncol] ;
-    ASSERT ((size_t) anz <= A->nzmax) ;
-    CHOLMOD(reallocate_sparse) (anz, A, Common) ;
-    ASSERT (Common->status >= CHOLMOD_OK) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* free workspace */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(free_sparse) (&F, Common) ;
-    return (TRUE) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_triplet.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_triplet.c
deleted file mode 100644
index a5f39b2..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_triplet.c
+++ /dev/null
@@ -1,772 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_triplet ================================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Core utility routines for the cholmod_triplet object:
- *
- * A sparse matrix held in triplet form is the simplest one for a user to
- * create.  It consists of a list of nz entries in arbitrary order, held in
- * three arrays: i, j, and x, each of length nk.  The kth entry is in row i[k],
- * column j[k], with value x[k].  There may be duplicate values; if A(i,j)
- * appears more than once, its value is the sum of the entries with those row
- * and column indices.
- *
- * Primary routines:
- * -----------------
- * cholmod_allocate_triplet	allocate a triplet matrix
- * cholmod_free_triplet		free a triplet matrix
- *
- * Secondary routines:
- * -------------------
- * cholmod_reallocate_triplet	reallocate a triplet matrix
- * cholmod_sparse_to_triplet	create a triplet matrix copy of a sparse matrix
- * cholmod_triplet_to_sparse	create a sparse matrix copy of a triplet matrix
- * cholmod_copy_triplet		create a copy of a triplet matrix
- *
- * The relationship between an m-by-n cholmod_sparse matrix A and a
- * cholmod_triplet matrix (i, j, and x) is identical to how they are used in
- * the MATLAB "sparse" and "find" functions:
- *
- *	[i j x] = find (A)
- *	[m n] = size (A)
- *	A = sparse (i,j,x,m,n)
- *
- * with the exception that the cholmod_sparse matrix may be "unpacked", may
- * have either sorted or unsorted columns (depending on the option selected),
- * and may be symmetric with just the upper or lower triangular part stored.
- * Likewise, the cholmod_triplet matrix may contain just the entries in the
- * upper or lower triangular part of a symmetric matrix.
- *
- * MATLAB sparse matrices are always "packed", always have sorted columns,
- * and always store both parts of a symmetric matrix.  In some cases, MATLAB
- * behaves like CHOLMOD by ignoring entries in the upper or lower triangular
- * part of a matrix that is otherwise assumed to be symmetric (such as the
- * input to chol).  In CHOLMOD, that option is a characteristic of the object.
- * In MATLAB, that option is based on how a matrix is used as the input to
- * a function.
- *
- * The triplet matrix is provided to give the user a simple way of constructing
- * a sparse matrix.  There are very few operations supported for triplet
- * matrices.  The assumption is that they will be converted to cholmod_sparse
- * matrix form first.
- *
- * Adding two triplet matrices simply involves concatenating the contents of
- * the three arrays (i, j, and x).   To permute a triplet matrix, just replace
- * the row and column indices with their permuted values.  For example, if
- * P is a permutation vector, then P [k] = j means row/column j is the kth
- * row/column in C=P*A*P'.  In MATLAB notation, C=A(p,p).  If Pinv is an array
- * of size n and T is the triplet form of A, then:
- *
- *	Ti = T->i ;
- *	Tj = T->j ;
- *	for (k = 0 ; k < n  ; k++) Pinv [P [k]] = k ;
- *	for (k = 0 ; k < nz ; k++) Ti [k] = Pinv [Ti [k]] ;
- *	for (k = 0 ; k < nz ; k++) Tj [k] = Pinv [Tj [k]] ;
- *
- * overwrites T with the triplet form of C=P*A*P'.  The conversion
- *
- *	C = cholmod_triplet_to_sparse (T, 0, &Common) ;
- *
- * will then return the matrix C = P*A*P'.
- *
- * Note that T->stype > 0 means that entries in the lower triangular part of
- * T are transposed into the upper triangular part when T is converted to
- * sparse matrix (cholmod_sparse) form with cholmod_triplet_to_sparse.  The
- * opposite is true for T->stype < 0.
- *
- * Since the triplet matrix T is so simple to generate, it's quite easy
- * to remove entries that you do not want, prior to converting T to the
- * cholmod_sparse form.  So if you include these entries in T, CHOLMOD
- * assumes that there must be a reason (such as the one above).  Thus,
- * no entry in a triplet matrix is ever ignored.
- *
- * Other operations, such as extacting a submatrix, horizontal and vertical
- * concatenation, multiply a triplet matrix times a dense matrix, are also
- * simple.  Multiplying two triplet matrices is not trivial; the simplest
- * method is to convert them to cholmod_sparse matrices first.
- *
- * Supports all xtypes (pattern, real, complex, and zomplex).
- */
- 
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-
-/* ========================================================================== */
-/* === TEMPLATE ============================================================= */
-/* ========================================================================== */
-
-#define PATTERN
-#include "t_cholmod_triplet.c"
-#define REAL
-#include "t_cholmod_triplet.c"
-#define COMPLEX
-#include "t_cholmod_triplet.c"
-#define ZOMPLEX
-#include "t_cholmod_triplet.c"
-
-
-/* ========================================================================== */
-/* === cholmod_allocate_triplet ============================================= */
-/* ========================================================================== */
-
-/* allocate space for a triplet matrix
- *
- * workspace: none
- */
-
-cholmod_triplet *CHOLMOD(allocate_triplet)
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of T */
-    size_t ncol,	/* # of columns of T */
-    size_t nzmax,	/* max # of nonzeros of T */
-    int stype,		/* stype of T */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_triplet *T ;
-    size_t nzmax0 ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    if (xtype < CHOLMOD_PATTERN || xtype > CHOLMOD_ZOMPLEX)
-    {
-	ERROR (CHOLMOD_INVALID, "xtype invalid") ;
-	return (NULL) ;
-    }
-    /* ensure the dimensions do not cause integer overflow */
-    (void) CHOLMOD(add_size_t) (ncol, 2, &ok) ;
-    if (!ok || nrow > Int_max || ncol > Int_max || nzmax > Int_max)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (NULL) ;
-    }
-
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate header */
-    /* ---------------------------------------------------------------------- */
-
-    T = CHOLMOD(malloc) (sizeof (cholmod_triplet), 1, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    PRINT1 (("cholmod_allocate_triplet %d-by-%d nzmax %d xtype %d\n",
-		nrow, ncol, nzmax, xtype)) ;
-
-    nzmax = MAX (1, nzmax) ;
-
-    T->nrow = nrow ;
-    T->ncol = ncol ;
-    T->nzmax = nzmax ;
-    T->nnz = 0 ;
-    T->stype = stype ;
-    T->itype = ITYPE ;
-    T->xtype = xtype ;
-    T->dtype = DTYPE ;
-
-    T->j = NULL ;
-    T->i = NULL ;
-    T->x = NULL ;
-    T->z = NULL ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the matrix itself */
-    /* ---------------------------------------------------------------------- */
-
-    nzmax0 = 0 ;
-    CHOLMOD(realloc_multiple) (nzmax, 2, xtype, &(T->i), &(T->j),
-		&(T->x), &(T->z), &nzmax0, Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free_triplet) (&T, Common) ;
-	return (NULL) ;	    /* out of memory */
-    }
-
-    return (T) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_free_triplet ================================================= */
-/* ========================================================================== */
-
-/* free a triplet matrix
- *
- * workspace: none
- */
-
-int CHOLMOD(free_triplet)
-(
-    /* ---- in/out --- */
-    cholmod_triplet **THandle,    /* matrix to deallocate, NULL on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    Int nz ;
-    cholmod_triplet *T ;
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-
-    if (THandle == NULL)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-    T = *THandle ;
-    if (T == NULL)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-    nz = T->nzmax ;
-    T->j = CHOLMOD(free) (nz, sizeof (Int), T->j, Common) ;
-    T->i = CHOLMOD(free) (nz, sizeof (Int), T->i, Common) ;
-    if (T->xtype == CHOLMOD_REAL)
-    {
-	T->x = CHOLMOD(free) (nz, sizeof (double), T->x, Common) ;
-    }
-    else if (T->xtype == CHOLMOD_COMPLEX)
-    {
-	T->x = CHOLMOD(free) (nz, 2*sizeof (double), T->x, Common) ;
-    }
-    else if (T->xtype == CHOLMOD_ZOMPLEX)
-    {
-	T->x = CHOLMOD(free) (nz, sizeof (double), T->x, Common) ;
-	T->z = CHOLMOD(free) (nz, sizeof (double), T->z, Common) ;
-    }
-    *THandle = CHOLMOD(free) (1, sizeof (cholmod_triplet), (*THandle), Common) ;
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_reallocate_triplet =========================================== */
-/* ========================================================================== */
-
-/* Change the size of T->i, T->j, and T->x, or allocate them if their current
- * size is zero.  T->x is not modified if T->xtype is CHOLMOD_PATTERN.
- *
- * workspace: none
- */
-
-int CHOLMOD(reallocate_triplet)
-(
-    /* ---- input ---- */
-    size_t nznew,	/* new # of entries in T */
-    /* ---- in/out --- */
-    cholmod_triplet *T,	/* triplet matrix to modify */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (T, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (T, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    PRINT1 (("realloc triplet %d to %d, xtype: %d\n",
-		T->nzmax, nznew, T->xtype)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* resize the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(realloc_multiple) (MAX (1,nznew), 2, T->xtype, &(T->i), &(T->j),
-	    &(T->x), &(T->z), &(T->nzmax), Common) ;
-
-    return (Common->status == CHOLMOD_OK) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_triplet_to_sparse ============================================ */
-/* ========================================================================== */
-
-/* Convert a set of triplets into a cholmod_sparse matrix.  In MATLAB notation,
- * for unsymmetric matrices:
- *
- *	A = sparse (Ti, Tj, Tx, nrow, ncol, nzmax) ;
- *
- * For the symmetric upper case:
- *
- *	A = sparse (min(Ti,Tj), max(Ti,Tj), Tx, nrow, ncol, nzmax) ;
- *
- * For the symmetric lower case:
- *
- *	A = sparse (max(Ti,Tj), min(Ti,Tj), Tx, nrow, ncol, nzmax) ;
- *
- * If Tx is NULL, then A->x is not allocated, and only the pattern of A is
- * computed.  A is returned in packed form, and can be of any stype
- * (upper/lower/unsymmetric).  It has enough space to hold the values in T,
- * or nzmax, whichever is larger.
- *
- * workspace: Iwork (max (nrow,ncol))
- *	allocates a temporary copy of its output matrix.
- *
- * The resulting sparse matrix has the same xtype as the input triplet matrix.
- */
-
-cholmod_sparse *CHOLMOD(triplet_to_sparse)
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* matrix to copy */
-    size_t nzmax,	/* allocate at least this much space in output matrix */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_sparse *R, *A = NULL ;
-    Int *Wj, *Rp, *Ri, *Rnz, *Ti, *Tj ;
-    Int i, j, p, k, stype, nrow, ncol, nz, ok ;
-    size_t anz = 0 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (T, NULL) ;
-    Ti = T->i ;
-    Tj = T->j ;
-    RETURN_IF_NULL (Ti, NULL) ;
-    RETURN_IF_NULL (Tj, NULL) ;
-    RETURN_IF_XTYPE_INVALID (T, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, NULL) ;
-    stype = SIGN (T->stype) ;
-    if (stype && T->nrow != T->ncol)
-    {
-	/* inputs invalid */
-	ERROR (CHOLMOD_INVALID, "matrix invalid") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-    DEBUG (CHOLMOD(dump_triplet) (T, "T", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = T->nrow ;
-    ncol = T->ncol ;
-    nz = T->nnz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(allocate_work) (0, MAX (nrow, ncol), 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate temporary matrix R */
-    /* ---------------------------------------------------------------------- */
-
-    R = CHOLMOD(allocate_sparse) (ncol, nrow, nz, FALSE, FALSE, -stype,
-	    T->xtype, Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    Rp = R->p ;
-    Ri = R->i ;
-    Rnz = R->nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* count the entries in each row of A (also counting duplicates) */
-    /* ---------------------------------------------------------------------- */
-
-    for (i = 0 ; i < nrow ; i++)
-    {
-	Rnz [i] = 0 ;	
-    }
-
-    if (stype > 0)
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    i = Ti [k] ;
-	    j = Tj [k] ;
-	    if (i < 0 || i >= nrow || j < 0 || j >= ncol)
-	    {
-		ERROR (CHOLMOD_INVALID, "index out of range") ;
-		break ;
-	    }
-	    /* A will be symmetric with just the upper triangular part stored.
-	     * Create a matrix R that is lower triangular.  Entries in the
-	     * upper part of R are transposed to the lower part. */
-	    Rnz [MIN (i,j)]++ ;
-	}
-    }
-    else if (stype < 0)
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    i = Ti [k] ;
-	    j = Tj [k] ;
-	    if (i < 0 || i >= nrow || j < 0 || j >= ncol)
-	    {
-		ERROR (CHOLMOD_INVALID, "index out of range") ;
-		break ;
-	    }
-	    /* A will be symmetric with just the lower triangular part stored.
-	     * Create a matrix R that is upper triangular.  Entries in the
-	     * lower part of R are transposed to the upper part. */
-	    Rnz [MAX (i,j)]++ ;
-	}
-    }
-    else
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    i = Ti [k] ;
-	    j = Tj [k] ;
-	    if (i < 0 || i >= nrow || j < 0 || j >= ncol)
-	    {
-		ERROR (CHOLMOD_INVALID, "index out of range") ;
-		break ;
-	    }
-	    /* constructing an unsymmetric matrix */
-	    Rnz [i]++ ;
-	}
-    }
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* triplet matrix is invalid */
-	CHOLMOD(free_sparse) (&R, Common) ;
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* construct the row pointers */
-    /* ---------------------------------------------------------------------- */
-
-    p = 0 ;
-    for (i = 0 ; i < nrow ; i++)
-    {
-	Rp [i] = p ;
-	p += Rnz [i] ;
-    }
-    Rp [nrow] = p ;
-
-    /* use Wj (i/l/l) as temporary row pointers */
-    Wj = Common->Iwork ;	/* size MAX (nrow,ncol) FUTURE WORK: (i/l/l) */
-    for (i = 0 ; i < nrow ; i++)
-    {
-	Wj [i] = Rp [i] ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* construct triplet matrix, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (T->xtype)
-    {
-	case CHOLMOD_PATTERN:
-	    anz = p_cholmod_triplet_to_sparse (T, R, Common) ;
-	    break ;
-
-	case CHOLMOD_REAL:
-	    anz = r_cholmod_triplet_to_sparse (T, R, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    anz = c_cholmod_triplet_to_sparse (T, R, Common) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    anz = z_cholmod_triplet_to_sparse (T, R, Common) ;
-	    break ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* A = R' (array transpose, not complex conjugate transpose) */
-    /* ---------------------------------------------------------------------- */
-
-    /* workspace: Iwork (R->nrow), which is A->ncol */
-
-    ASSERT (CHOLMOD(dump_sparse) (R, "R", Common) >= 0) ;
-
-    A = CHOLMOD(allocate_sparse) (nrow, ncol, MAX (anz, nzmax), TRUE, TRUE,
-	stype, T->xtype, Common) ;
-
-    if (stype)
-    {
-	ok = CHOLMOD(transpose_sym) (R, 1, NULL, A, Common) ;
-    }
-    else
-    {
-	ok = CHOLMOD(transpose_unsym) (R, 1, NULL, NULL, 0, A, Common) ; 
-    }
-
-    CHOLMOD(free_sparse) (&R, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	CHOLMOD(free_sparse) (&A, Common) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_sparse) (A, "A = triplet(T) result", Common) >= 0) ;
-    return (A) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_sparse_to_triplet ============================================ */
-/* ========================================================================== */
-
-/* Converts a sparse column-oriented matrix to triplet form.
- * The resulting triplet matrix has the same xtype as the sparse matrix.
- *
- * workspace: none
- */
-
-cholmod_triplet *CHOLMOD(sparse_to_triplet)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Az, *Tx, *Tz ;
-    Int *Ap, *Ai, *Ti, *Tj, *Anz ;
-    cholmod_triplet *T ;
-    Int i, xtype, p, pend, k, j, nrow, ncol, nz, stype, packed, up, lo,
-	both ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, NULL) ;
-    stype = SIGN (A->stype) ;
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-    if (stype && nrow != ncol)
-    {
-	/* inputs invalid */
-	ERROR (CHOLMOD_INVALID, "matrix invalid") ;
-	return (NULL) ;
-    }
-    Ax = A->x ;
-    Az = A->z ;
-    xtype = A->xtype ;
-    Common->status = CHOLMOD_OK ;
-
-    ASSERT (CHOLMOD(dump_sparse) (A, "A", Common) >= 0) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate triplet matrix */
-    /* ---------------------------------------------------------------------- */
-
-    nz = CHOLMOD(nnz) (A, Common) ;
-    T = CHOLMOD(allocate_triplet) (nrow, ncol, nz, A->stype, A->xtype, Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* convert to a sparse matrix */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Anz = A->nz ;
-    packed = A->packed ;
-
-    Ti = T->i ;
-    Tj = T->j ;
-    Tx = T->x ;
-    Tz = T->z ;
-    T->stype = A->stype ;
-
-    both = (A->stype == 0) ;
-    up = (A->stype > 0) ;
-    lo = (A->stype < 0) ;
-
-    k = 0 ;
-
-    for (j = 0 ; j < ncol ; j++)
-    {
-	p = Ap [j] ;
-	pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	for ( ; p < pend ; p++)
-	{
-	    i = Ai [p] ;
-	    if (both || (up && i <= j) || (lo && i >= j))
-	    {
-		Ti [k] = Ai [p] ;
-		Tj [k] = j ;
-
-		if (xtype == CHOLMOD_REAL)
-		{
-		    Tx [k] = Ax [p] ;
-		}
-		else if (xtype == CHOLMOD_COMPLEX)
-		{
-		    Tx [2*k  ] = Ax [2*p  ] ;
-		    Tx [2*k+1] = Ax [2*p+1] ;
-		}
-		else if (xtype == CHOLMOD_ZOMPLEX)
-		{
-		    Tx [k] = Ax [p] ;
-		    Tz [k] = Az [p] ;
-		}
-
-		k++ ;
-		ASSERT (k <= nz) ;
-	    }
-	}
-    }
-
-    T->nnz = k ;
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_triplet) (T, "T", Common)) ;
-    return (T) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_copy_triplet ================================================= */
-/* ========================================================================== */
-
-/* Create an exact copy of a triplet matrix, except that entries in unused
- * space are not copied (they might not be initialized, and copying them would
- * cause program checkers such as purify and valgrind to complain).
- * The output triplet matrix has the same xtype as the input triplet matrix.
- */
-
-cholmod_triplet *CHOLMOD(copy_triplet)
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Tx, *Tz, *Cx, *Cz ;
-    Int *Ci, *Cj, *Ti, *Tj ;
-    cholmod_triplet *C ;
-    Int xtype, k, nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (T, NULL) ;
-    RETURN_IF_XTYPE_INVALID (T, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, NULL) ;
-    nz = T->nnz ;
-    Ti = T->i ;
-    Tj = T->j ;
-    Tx = T->x ;
-    Tz = T->z ;
-    xtype = T->xtype ;
-    RETURN_IF_NULL (Ti, NULL) ;
-    RETURN_IF_NULL (Tj, NULL) ;
-    Common->status = CHOLMOD_OK ;
-    DEBUG (CHOLMOD(dump_triplet) (T, "T input", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate copy */
-    /* ---------------------------------------------------------------------- */
-
-    C = CHOLMOD(allocate_triplet) (T->nrow, T->ncol, T->nzmax, T->stype,
-	    xtype, Common) ;
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* copy the triplet matrix */
-    /* ---------------------------------------------------------------------- */
-
-    Ci = C->i ;
-    Cj = C->j ;
-    Cx = C->x ;
-    Cz = C->z ;
-    C->nnz = nz ;
-
-    for (k = 0 ; k < nz ; k++)
-    {
-	Ci [k] = Ti [k] ;
-    }
-    for (k = 0 ; k < nz ; k++)
-    {
-	Cj [k] = Tj [k] ;
-    }
-
-    if (xtype == CHOLMOD_REAL)
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    Cx [k] = Tx [k] ;
-	}
-    }
-    else if (xtype == CHOLMOD_COMPLEX)
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    Cx [2*k  ] = Tx [2*k  ] ;
-	    Cx [2*k+1] = Tx [2*k+1] ;
-	}
-    }
-    else if (xtype == CHOLMOD_ZOMPLEX)
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    Cx [k] = Tx [k] ;
-	    Cz [k] = Tz [k] ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the result */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_triplet) (C, "C triplet copy", Common)) ;
-    return (C) ;
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_version.c b/src/C/SuiteSparse/CHOLMOD/Core/cholmod_version.c
deleted file mode 100644
index 0cc034e..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/cholmod_version.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ========================================================================== */
-/* === Core/cholmod_version ================================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2013,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Return the current version of CHOLMOD.  Unlike all other functions in
-   CHOLMOD, this function does not require the CHOLMOD Common. */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-
-int CHOLMOD(version)        /* returns CHOLMOD_VERSION */
-(
-    /* output, contents not defined on input.  Not used if NULL.
-        version [0] = CHOLMOD_MAIN_VERSION ;
-        version [1] = CHOLMOD_SUB_VERSION ;
-        version [2] = CHOLMOD_SUBSUB_VERSION ;
-    */
-    int version [3]
-)
-{
-    if (version != NULL)
-    {
-        version [0] = CHOLMOD_MAIN_VERSION ;
-        version [1] = CHOLMOD_SUB_VERSION ;
-        version [2] = CHOLMOD_SUBSUB_VERSION ;
-    }
-    return (CHOLMOD_VERSION) ;
-}
-
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/lesser.txt b/src/C/SuiteSparse/CHOLMOD/Core/lesser.txt
deleted file mode 100644
index 8add30a..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/lesser.txt
+++ /dev/null
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-

-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-

-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-

-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-

-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-

-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-

-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-

-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-

-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_change_factor.c b/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_change_factor.c
deleted file mode 100644
index dd49b44..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_change_factor.c
+++ /dev/null
@@ -1,660 +0,0 @@
-/* ========================================================================== */
-/* === Core/t_cholmod_change_factor ========================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_change_factor.  All xtypes supported. */
-
-#include "cholmod_template.h"
-
-/* ========================================================================== */
-/* === t_change_simplicial_numeric ========================================== */
-/* ========================================================================== */
-
-static void TEMPLATE (change_simplicial_numeric)
-(
-    cholmod_factor *L,
-    Int to_ll,
-    Int to_packed,
-    Int *newLi,
-    double *newLx,
-    double *newLz,
-    Int lnz,
-    Int grow,
-    double grow1,
-    Int grow2,
-    Int make_ll,
-    Int make_monotonic,
-    Int make_ldl,
-    cholmod_common *Common
-)
-{
-    double xlen, dj [1], ljj [1], lj2 [1] ;
-    double *Lx, *Lz ;
-    Int *Lp, *Li, *Lnz ;
-    Int n, j, len, pnew, pold, k, p, pend ;
-
-    n = L->n ;
-    Lp = L->p ;
-    Li = L->i ;
-    Lx = L->x ;
-    Lz = L->z ;
-    Lnz = L->nz ;
-
-    if (make_ll)
-    {
-	L->minor = n ;
-    }
-
-    if (make_monotonic)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* reorder the columns to make them monotonic */
-	/* ------------------------------------------------------------------ */
-
-	pnew = 0 ;
-	for (j = 0 ; j < n ; j++)
-	{
-	    /* copy and pack column j */
-	    len = Lnz [j] ;
-	    PRINT2 (("j: "ID" Lnz[j] "ID" len "ID" p "ID"\n",
-			j, Lnz [j], len, pnew)) ;
-	    pold = Lp [j] ;
-	    ASSERT (Li [pold] == j) ;
-
-	    if (make_ll)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* copy and convert LDL' to LL' */
-		/* ---------------------------------------------------------- */
-
-		/* dj = Lx [pold] ; */
-		ASSIGN_REAL (dj,0, Lx,pold) ;
-
-		if (IS_LE_ZERO (dj [0]))
-		{
-		    /* Conversion has failed; matrix is not positive definite.
-		     * Do not modify the column so that the LDL' factorization
-		     * can be restored if desired, by converting back to LDL'.
-		     * Continue the conversion, but flag the error. */
-		    if (L->minor == (size_t) n)
-		    {
-			ERROR (CHOLMOD_NOT_POSDEF, "L not positive definite") ;
-			L->minor = j ;
-		    }
-		    for (k = 0 ; k < len ; k++)
-		    {
-			newLi [pnew + k] = Li [pold + k] ;
-			/* newLx [pnew + k] = Lx [pold + k] ; */
-			ASSIGN (newLx, newLz, pnew+k, Lx, Lz, pold+k) ;
-		    }
-		}
-		else
-		{
-		    ljj [0] = sqrt (dj [0]) ;
-		    newLi [pnew] = j ;
-		    /* newLx [pnew] = ljj ; */
-		    ASSIGN_REAL (newLx, pnew, ljj, 0) ;
-		    CLEAR_IMAG (newLx, newLz, pnew) ;
-
-		    for (k = 1 ; k < len ; k++)
-		    {
-			newLi [pnew + k] = Li [pold + k] ;
-			/* newLx [pnew + k] = Lx [pold + k] * ljj ; */
-			MULT_REAL (newLx, newLz, pnew+k, Lx, Lz, pold+k, ljj,0);
-		    }
-		}
-
-	    }
-	    else if (make_ldl)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* copy and convert LL' to LDL' */
-		/* ---------------------------------------------------------- */
-
-		/* ljj = Lx [pold] ; */
-		ASSIGN_REAL (ljj, 0, Lx, pold) ;
-
-		if (ljj [0] <= 0)
-		{
-		    /* matrix is not positive-definite; copy column as-is */
-		    for (k = 0 ; k < len ; k++)
-		    {
-			newLi [pnew + k] = Li [pold + k] ;
-			/* newLx [pnew + k] = Lx [pold + k] ; */
-			ASSIGN (newLx, newLz, pnew+k, Lx, Lz, pold+k) ;
-		    }
-		}
-		else
-		{
-		    newLi [pnew] = j ;
-		    /* newLx [pnew] = ljj*ljj ; */
-		    lj2 [0] = ljj [0] * ljj [0] ;
-		    ASSIGN_REAL (newLx, pnew, lj2, 0) ;
-		    CLEAR_IMAG (newLx, newLz, pnew) ;
-
-		    for (k = 1 ; k < len ; k++)
-		    {
-			newLi [pnew + k] = Li [pold + k] ;
-			/* newLx [pnew + k] = Lx [pold + k] / ljj ; */
-			DIV_REAL (newLx, newLz, pnew+k, Lx, Lz, pold+k, ljj,0) ;
-		    }
-		}
-
-	    }
-	    else
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* copy and leave LL' or LDL' as-is */
-		/* ---------------------------------------------------------- */
-
-		for (k = 0 ; k < len ; k++)
-		{
-		    newLi [pnew + k] = Li [pold + k] ;
-		    /* newLx [pnew + k] = Lx [pold + k] ; */
-		    ASSIGN (newLx, newLz, pnew+k, Lx, Lz, pold+k) ;
-		}
-	    }
-
-	    Lp [j] = pnew ;
-
-	    /* compute len in double to avoid integer overflow */
-	    if (grow)
-	    {
-		xlen = (double) len ;
-		xlen = grow1 * xlen + grow2 ;
-		xlen = MIN (xlen, n-j) ;
-		len = (Int) xlen ;
-	    }
-	    ASSERT (len >= Lnz [j] && len <= n-j) ;
-	    pnew += len ;
-	    ASSERT (pnew > 0) ;	    /* integer overflow case already covered */
-	}
-	Lp [n] = pnew ;
-	PRINT1 (("final pnew = "ID", lnz "ID" lnzmax %g\n",
-		    pnew, lnz, (double) L->nzmax)) ;
-	ASSERT (pnew <= lnz) ;
-
-	/* free the old L->i and L->x and replace with the new ones */
-	CHOLMOD(free) (L->nzmax, sizeof (Int), L->i, Common) ;
-
-#ifdef REAL
-	CHOLMOD(free) (L->nzmax, sizeof (double), L->x, Common) ;
-#elif defined (COMPLEX)
-	CHOLMOD(free) (L->nzmax, 2*sizeof (double), L->x, Common) ;
-#else
-	CHOLMOD(free) (L->nzmax, sizeof (double), L->x, Common) ;
-	CHOLMOD(free) (L->nzmax, sizeof (double), L->z, Common) ;
-#endif
-
-	L->i = newLi ;
-	L->x = newLx ;
-	L->z = newLz ;
-	L->nzmax = lnz ;
-
-	/* reconstruct the link list */
-	natural_list (L) ;
-
-    }
-    else if (to_packed)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* already monotonic, just pack the columns of L */
-	/* ------------------------------------------------------------------ */
-
-	pnew = 0 ;
-
-	if (make_ll)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* pack and convert LDL' to LL' */
-	    /* -------------------------------------------------------------- */
-
-	    for (j = 0 ; j < n ; j++)
-	    {
-		/* pack column j */
-		pold = Lp [j] ;
-		len = Lnz [j] ;
-		ASSERT (len > 0) ;
-		ASSERT (Li [pold] == j) ;
-		PRINT2 (("col "ID" pnew "ID" pold "ID"\n", j, pnew, pold)) ;
-
-		/* dj = Lx [pold] ; */
-		ASSIGN_REAL (dj,0, Lx,pold) ;
-
-		if (IS_LE_ZERO (dj [0]))
-		{
-		    /* Conversion has failed; matrix is not positive definite.
-		     * Do not modify the column so that the LDL' factorization
-		     * can be restored if desired, by converting back to LDL'.
-		     * Continue the conversion, but flag the error. */
-		    if (L->minor == (size_t) n)
-		    {
-			ERROR (CHOLMOD_NOT_POSDEF, "L not positive definite") ;
-			L->minor = j ;
-		    }
-		    for (k = 0 ; k < len ; k++)
-		    {
-			Li [pnew + k] = Li [pold + k] ;
-			/* Lx [pnew + k] = Lx [pold + k] ; */
-			ASSIGN (Lx, Lz, pnew+k, Lx, Lz, pold+k) ;
-		    }
-		}
-		else
-		{
-		    ljj [0] = sqrt (dj [0]) ;
-		    Li [pnew] = j ;
-
-		    /* Lx [pnew] = ljj ; */
-		    ASSIGN_REAL (Lx, pnew, ljj, 0) ;
-		    CLEAR_IMAG (Lx, Lz, pnew) ;
-
-		    for (k = 1 ; k < len ; k++)
-		    {
-			Li [pnew + k] = Li [pold + k] ;
-			/* Lx [pnew + k] = Lx [pold + k] * ljj ; */
-			MULT_REAL (Lx, Lz, pnew+k, Lx, Lz, pold+k, ljj,0) ;
-		    }
-		}
-		Lp [j] = pnew ;
-		pnew += len ;
-	    }
-
-	}
-	else if (make_ldl)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* pack and convert LL' to LDL' */
-	    /* -------------------------------------------------------------- */
-
-	    for (j = 0 ; j < n ; j++)
-	    {
-		/* pack column j */
-		pold = Lp [j] ;
-		len = Lnz [j] ;
-
-		/* ljj = Lx [pold] ; */
-		ASSIGN_REAL (ljj, 0, Lx, pold) ;
-
-		ASSERT (len > 0) ;
-		PRINT2 (("col "ID" pnew "ID" pold "ID"\n", j, pnew, pold)) ;
-		if (ljj [0] <= 0)
-		{
-		    /* matrix is not positive-definite; pack column as-is */
-		    for (k = 0 ; k < len ; k++)
-		    {
-			Li [pnew + k] = Li [pold + k] ;
-			/* Lx [pnew + k] = Lx [pold + k] ; */
-			ASSIGN (Lx, Lz, pnew+k, Lx, Lz, pold+k) ;
-		    }
-		}
-		else
-		{
-		    Li [pnew] = Li [pold] ;
-
-		    /* Lx [pnew] = ljj*ljj ; */
-		    lj2 [0] = ljj [0] * ljj [0] ;
-		    ASSIGN_REAL (Lx, pnew, lj2, 0) ;
-		    CLEAR_IMAG (Lx, Lz, pnew) ;
-
-		    for (k = 1 ; k < len ; k++)
-		    {
-			Li [pnew + k] = Li [pold + k] ;
-			/* Lx [pnew + k] = Lx [pold + k] / ljj ; */
-			DIV_REAL (Lx, Lz, pnew+k, Lx, Lz, pold+k, ljj,0) ;
-		    }
-		}
-		Lp [j] = pnew ;
-		pnew += len ;
-	    }
-
-	}
-	else
-	{
-
-	    /* ---------------------------------------------------------- */
-	    /* pack and leave LL' or LDL' as-is */
-	    /* ---------------------------------------------------------- */
-
-	    for (j = 0 ; j < n ; j++)
-	    {
-		/* pack column j */
-		pold = Lp [j] ;
-		len = Lnz [j] ;
-		ASSERT (len > 0) ;
-		PRINT2 (("col "ID" pnew "ID" pold "ID"\n", j, pnew, pold)) ;
-		if (pnew < pold)
-		{
-		    PRINT2 (("    pack this column\n")) ;
-		    for (k = 0 ; k < len ; k++)
-		    {
-			Li [pnew + k] = Li [pold + k] ;
-			/* Lx [pnew + k] = Lx [pold + k] ; */
-			ASSIGN (Lx, Lz, pnew+k, Lx, Lz, pold+k) ;
-		    }
-		    Lp [j] = pnew ;
-		}
-		pnew += len ;
-	    }
-	}
-
-	Lp [n] = pnew ;
-	PRINT2 (("Lp [n] = "ID"\n", pnew)) ;
-
-    }
-    else if (make_ll)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* convert LDL' to LL', but do so in-place */
-	/* ------------------------------------------------------------------ */
-
-	for (j = 0 ; j < n ; j++)
-	{
-	    p = Lp [j] ;
-	    pend = p + Lnz [j] ;
-
-	    /* dj = Lx [p] ; */
-	    ASSIGN_REAL (dj,0, Lx,p) ;
-
-	    if (IS_LE_ZERO (dj [0]))
-	    {
-		/* Conversion has failed; matrix is not positive definite.
-		 * Do not modify the column so that the LDL' factorization
-		 * can be restored if desired, by converting back to LDL'.
-		 * Continue the conversion, but flag the error. */
-		if (L->minor == (size_t) n)
-		{
-		    ERROR (CHOLMOD_NOT_POSDEF, "L not positive definite") ;
-		    L->minor = j ;
-		}
-	    }
-	    else
-	    {
-		ljj [0] = sqrt (dj [0]) ;
-		/* Lx [p] = ljj ; */
-		ASSIGN_REAL (Lx,p, ljj,0) ;
-		CLEAR_IMAG (Lx, Lz, p) ;
-
-		for (p++ ; p < pend ; p++)
-		{
-		    /* Lx [p] *= ljj ; */
-		    MULT_REAL (Lx,Lz,p, Lx,Lz,p, ljj,0) ;
-		}
-	    }
-	}
-
-    }
-    else if (make_ldl)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* convert LL' to LDL', but do so in-place */
-	/* ------------------------------------------------------------------ */
-
-	for (j = 0 ; j < n ; j++)
-	{
-	    p = Lp [j] ;
-	    pend = p + Lnz [j] ;
-
-	    /* ljj = Lx [p] ; */
-	    ASSIGN_REAL (ljj, 0, Lx, p) ;
-
-	    if (ljj [0] > 0)
-	    {
-		/* Lx [p] = ljj*ljj ; */
-		lj2 [0] = ljj [0] * ljj [0] ;
-		ASSIGN_REAL (Lx, p, lj2, 0) ;
-		CLEAR_IMAG (Lx, Lz, p) ;
-
-		for (p++ ; p < pend ; p++)
-		{
-		    /* Lx [p] /= ljj ; */
-		    DIV_REAL (Lx,Lz,p, Lx,Lz,p, ljj,0) ;
-		}
-	    }
-	}
-    }
-
-    L->is_ll = to_ll ;
-
-    DEBUG (CHOLMOD(dump_factor) (L, "done change simplicial numeric", Common)) ;
-}
-
-
-/* ========================================================================== */
-/* === t_ll_super_to_simplicial_numeric ===================================== */
-/* ========================================================================== */
-
-/* A supernodal L can only be real or complex, not zomplex */
-
-#ifndef ZOMPLEX
-
-static void TEMPLATE (ll_super_to_simplicial_numeric)
-(
-    cholmod_factor *L,
-    Int to_packed,
-    Int to_ll,
-    cholmod_common *Common
-)
-{
-    double ljj [1], lj2 [1] ;
-    double *Lx ;
-    Int *Ls, *Lpi, *Lpx, *Super, *Lp, *Li, *Lnz ;
-    Int n, lnz, s, nsuper, p, psi, psx, psend, nsrow, nscol, ii, jj, j, k1, k2,
-	q ;
-
-    L->is_ll = to_ll ;
-
-    Lp = L->p ;
-    Li = L->i ;
-    Lx = L->x ;
-    Lnz = L->nz ;
-    lnz = L->nzmax ;
-
-    n = L->n ;
-    nsuper = L->nsuper ;
-    Lpi = L->pi ;
-    Lpx = L->px ;
-    Ls = L->s ;
-    Super = L->super ;
-
-    p = 0 ;
-
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	k1 = Super [s] ;
-	k2 = Super [s+1] ;
-	psi = Lpi [s] ;
-	psend = Lpi [s+1] ;
-	psx = Lpx [s] ;
-	nsrow = psend - psi ;
-	nscol = k2 - k1 ;
-
-	for (jj = 0 ; jj < nscol ; jj++)
-	{
-	    /* column j of L starts here */
-	    j = jj + k1 ;
-
-	    if (to_ll)
-	    {
-		if (to_packed)
-		{
-
-		    /* ------------------------------------------------------ */
-		    /* convert to LL' packed */
-		    /* ------------------------------------------------------ */
-
-		    Lp [j] = p ;
-		    PRINT2 (("Col j "ID" p "ID"\n", j, p)) ;
-		    for (ii = jj ; ii < nsrow ; ii++)
-		    {
-			/* get L(i,j) from supernode and store in column j */
-			ASSERT (p < (Int) (L->xsize) && p <= psx+ii+jj*nsrow) ;
-			Li [p] = Ls [psi + ii] ;
-			/* Lx [p] = Lx [psx + ii + jj*nsrow] ; */
-			q = psx + ii + jj*nsrow ;
-			ASSIGN (Lx,-,p, Lx,-,q) ;
-			PRINT2 (("  i "ID" ", Li [p])) ;
-			XPRINT2 (Lx,-,q) ;
-			PRINT2 (("\n")) ;
-			p++ ;
-		    }
-		    Lnz [j] = p - Lp [j] ;
-
-		}
-		else
-		{
-
-		    /* ------------------------------------------------------ */
-		    /* convert to LL' unpacked */
-		    /* ------------------------------------------------------ */
-
-		    p = psx + jj + jj*nsrow ;
-		    Lp [j] = p ;
-		    Li [p] = j ;
-		    Lnz [j] = nsrow - jj ;
-		    p++ ;
-		    for (ii = jj + 1 ; ii < nsrow ; ii++)
-		    {
-			/* get L(i,j) from supernode and store in column j */
-			Li [psx + ii + jj*nsrow] = Ls [psi + ii] ;
-		    }
-
-		}
-	    }
-	    else
-	    {
-		if (to_packed)
-		{
-
-		    /* ------------------------------------------------------ */
-		    /* convert to LDL' packed */
-		    /* ------------------------------------------------------ */
-
-		    Lp [j] = p ;
-		    PRINT2 (("Col j "ID" p "ID"\n", Lp [j], p)) ;
-		    /* ljj = Lx [psx + jj + jj*nsrow] ; */
-		    ASSIGN_REAL (ljj, 0, Lx, psx + jj + jj*nsrow) ;
-
-		    if (ljj [0] <= 0)
-		    {
-			/* the matrix is not positive definite; do not divide */
-			/* Lx [p] = ljj ; */
-			ASSIGN_REAL (Lx, p, ljj, 0) ;
-			CLEAR_IMAG (Lx, Lz, p) ;
-			ljj [0] = 1 ;
-		    }
-		    else
-		    {
-			lj2 [0] = ljj [0] * ljj [0] ;
-			/* Lx [p] = ljj*ljj ; */
-			ASSIGN_REAL (Lx, p, lj2, 0) ;
-			CLEAR_IMAG (Lx, Lz, p) ;
-		    }
-		    Li [p] = j ;
-		    p++ ;
-		    for (ii = jj + 1 ; ii < nsrow ; ii++)
-		    {
-			/* get L(i,j) from supernode and store in column j */
-			ASSERT (p < (Int) (L->xsize) && p <= psx+ii+jj*nsrow) ;
-			Li [p] = Ls [psi + ii] ;
-
-			/* Lx [p] = Lx [psx + ii + jj*nsrow] / ljj ; */
-			q = psx + ii + jj*nsrow ;
-			DIV_REAL (Lx, Lz, p, Lx, Lz, q, ljj,0) ;
-
-			PRINT2 (("  i "ID" %g\n", Li [p], Lx [p])) ;
-			p++ ;
-		    }
-		    Lnz [j] = p - Lp [j] ;
-
-		}
-		else
-		{
-
-		    /* ------------------------------------------------------ */
-		    /* convert to LDL' unpacked */
-		    /* ------------------------------------------------------ */
-
-		    p = psx + jj + jj*nsrow ;
-		    Lp [j] = p ;
-
-		    /* ljj = Lx [p] ; */
-		    ASSIGN_REAL (ljj,0, Lx,p) ;
-
-		    if (ljj [0] <= 0)
-		    {
-			/* the matrix is not positive definite; do not divide */
-			/* Lx [p] = ljj ; */
-			ASSIGN_REAL (Lx, p, ljj, 0) ;
-			CLEAR_IMAG (Lx, Lz, p) ;
-			ljj [0] = 1 ;
-		    }
-		    else
-		    {
-			lj2 [0] = ljj [0] * ljj [0] ;
-			/* Lx [p] = ljj*ljj ; */
-			ASSIGN_REAL (Lx, p, lj2, 0) ;
-			CLEAR_IMAG (Lx, Lz, p) ;
-		    }
-		    Li [p] = j ;
-		    Lnz [j] = nsrow - jj ;
-		    p++ ;
-		    for (ii = jj + 1 ; ii < nsrow ; ii++)
-		    {
-			/* get L(i,j) from supernode and store in column j */
-			Li [psx + ii + jj*nsrow] = Ls [psi + ii] ;
-
-			/* Lx [psx + ii + jj*nsrow] /= ljj ; */
-			q = psx + ii + jj*nsrow ;
-			DIV_REAL (Lx, Lz, q, Lx, Lz, q, ljj,0) ;
-		    }
-		}
-	    }
-	}
-    }
-
-    if (to_packed)
-    {
-	Lp [n] = p ;
-	PRINT1 (("Final Lp "ID" n "ID" lnz "ID"\n", p, n, lnz)) ;
-	ASSERT (Lp [n] == lnz) ;
-	ASSERT (lnz <= (Int) (L->xsize)) ;
-	/* reduce size of L->x to match L->i.  This cannot fail. */
-	L->x = CHOLMOD(realloc) (lnz, 
-#ifdef COMPLEX
-		2 *
-#endif
-		sizeof (double), L->x, &(L->xsize), Common) ;
-	ASSERT (lnz == (Int) (L->xsize)) ;
-	Common->status = CHOLMOD_OK ;
-    }
-    else
-    {
-	Lp [n] = Lpx [nsuper] ;
-	ASSERT (MAX (1,Lp [n]) == (Int) (L->xsize)) ;
-	ASSERT (MAX (1,Lp [n]) == (Int) (L->nzmax)) ;
-    }
-}
-
-#endif
-
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_dense.c b/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_dense.c
deleted file mode 100644
index 6f3f270..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_dense.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/* ========================================================================== */
-/* === Core/t_cholmod_dense ================================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_dense.  All xtypes supported, except that there
- * are no dense matrices with an xtype of pattern. */
-
-#include "cholmod_template.h"
-
-/* ========================================================================== */
-/* === t_cholmod_sparse_to_dense ============================================ */
-/* ========================================================================== */
-
-static cholmod_dense *TEMPLATE (cholmod_sparse_to_dense)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Xx, *Az, *Xz ;
-    Int *Ap, *Ai, *Anz ;
-    cholmod_dense *X ;
-    Int i, j, p, pend, nrow, ncol, packed ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-    packed = A->packed ;
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Az = A->z ;
-    Anz = A->nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate result */
-    /* ---------------------------------------------------------------------- */
-
-    X = CHOLMOD(zeros) (nrow, ncol, XTYPE2, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-    Xx = X->x ;
-    Xz = X->z ;
-
-    /* ---------------------------------------------------------------------- */
-    /* copy into dense matrix */
-    /* ---------------------------------------------------------------------- */
-
-    if (A->stype < 0)
-    {
-	/* A is symmetric with lower stored, but both parts of X are present */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		if (i >= j)
-		{
-		    ASSIGN2 (Xx, Xz, i+j*nrow, Ax, Az, p) ;
-		    ASSIGN2_CONJ (Xx, Xz, j+i*nrow, Ax, Az, p) ;
-		}
-	    }
-	}
-    }
-    else if (A->stype > 0)
-    {
-	/* A is symmetric with upper stored, but both parts of X are present */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		if (i <= j)
-		{
-		    ASSIGN2 (Xx, Xz, i+j*nrow, Ax, Az, p) ;
-		    ASSIGN2_CONJ (Xx, Xz, j+i*nrow, Ax, Az, p) ;
-		}
-	    }
-	}
-    }
-    else
-    {
-	/* both parts of A and X are present */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		ASSIGN2 (Xx, Xz, i+j*nrow, Ax, Az, p) ;
-	    }
-	}
-    }
-
-    return (X) ;
-}
-
-
-#ifndef PATTERN
-
-/* There are no dense matrices of xtype CHOLMOD_PATTERN */
-
-/* ========================================================================== */
-/* === t_cholmod_dense_to_sparse ============================================ */
-/* ========================================================================== */
-
-static cholmod_sparse *TEMPLATE (cholmod_dense_to_sparse)
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to copy */
-    int values,		/* TRUE if values to be copied, FALSE otherwise */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Xx, *Cx, *Xz, *Cz ;
-    Int *Ci, *Cp ;
-    cholmod_sparse *C ;
-    Int i, j, p, d, nrow, ncol, nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = X->nrow ;
-    ncol = X->ncol ;
-    d = X->d ;
-    Xx = X->x ;
-    Xz = X->z ;
-
-    /* ---------------------------------------------------------------------- */
-    /* count the number of nonzeros in the result */
-    /* ---------------------------------------------------------------------- */
-
-    nz = 0 ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    if (ENTRY_IS_NONZERO (Xx, Xz, i+j*d))
-	    {
-		nz++ ;
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate the result C */
-    /* ---------------------------------------------------------------------- */
-
-    C = CHOLMOD(allocate_sparse) (nrow, ncol, nz, TRUE, TRUE, 0,
-	    values ? XTYPE : CHOLMOD_PATTERN, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (NULL) ;	    /* out of memory */
-    }
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-    Cz = C->z ;
-
-    /* ---------------------------------------------------------------------- */
-    /* copy the dense matrix X into the sparse matrix C */
-    /* ---------------------------------------------------------------------- */
-
-    p = 0 ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	Cp [j] = p ;
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    if (ENTRY_IS_NONZERO (Xx, Xz, i+j*d))
-	    {
-		Ci [p] = i ;
-		if (values)
-		{
-		    ASSIGN (Cx, Cz, p, Xx, Xz, i+j*d) ;
-		}
-		p++ ;
-	    }
-	}
-    }
-    ASSERT (p == nz) ;
-    Cp [ncol] = nz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_sparse) (C, "C", Common) >= 0) ;
-    return (C) ;
-}
-
-
-/* ========================================================================== */
-/* === t_cholmod_copy_dense2 ================================================ */
-/* ========================================================================== */
-
-/* Y = X, where X and Y are both already allocated.  */
-
-static int TEMPLATE (cholmod_copy_dense2)
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to copy */
-    /* ---- output --- */
-    cholmod_dense *Y	/* copy of matrix X */
-)
-{
-    double *Xx, *Xz, *Yx, *Yz ;
-    Int i, j, nrow, ncol, dy, dx ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Xx = X->x ;
-    Xz = X->z ;
-    Yx = Y->x ;
-    Yz = Y->z ;
-    dx = X->d ;
-    dy = Y->d ;
-    nrow = X->nrow ;
-    ncol = X->ncol ;
-
-    /* ---------------------------------------------------------------------- */
-    /* copy */
-    /* ---------------------------------------------------------------------- */
-
-    CLEAR (Yx, Yz, 0) ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    ASSIGN (Yx, Yz, i+j*dy, Xx, Xz, i+j*dx) ;
-	}
-    }
-    return (TRUE) ;
-}
-
-#endif
-
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_transpose.c b/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_transpose.c
deleted file mode 100644
index a5dd849..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_transpose.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/* ========================================================================== */
-/* === Core/t_cholmod_transpose ============================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_transpose.  All xtypes are supported.  For
- * complex matrices, either the array tranpose or complex conjugate transpose
- * can be computed. */
-
-#include "cholmod_template.h"
-
-/* ========================================================================== */
-/* === t_cholmod_transpose_unsym ============================================ */
-/* ========================================================================== */
-
-/* Compute F = A', A (:,f)', or A (p,f)', where A is unsymmetric and F is
- * already allocated.  The complex case performs either the array transpose
- * or complex conjugate transpose.
- *
- * workspace:
- * Iwork (MAX (nrow,ncol)) if fset is present
- * Iwork (nrow) if fset is NULL
- */
-
-static int TEMPLATE (cholmod_transpose_unsym)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    Int *Perm,		/* size nrow, if present (can be NULL) */
-    Int *fset,		/* subset of 0:(A->ncol)-1 */
-    Int nf,		/* size of fset */
-    /* ---- output --- */
-    cholmod_sparse *F,	/* F = A', A(:,f)', or A(p,f)' */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Az, *Fx, *Fz ;
-    Int *Ap, *Anz, *Ai, *Fp, *Fnz, *Fj, *Wi, *Iwork ;
-    Int j, p, pend, nrow, ncol, Apacked, use_fset, fp, Fpacked, jj, permute ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    /* ensure the xtype of A and F match (ignored if this is pattern version) */
-    if (!XTYPE_OK (A->xtype))
-    {
-	ERROR (CHOLMOD_INVALID, "real/complex mismatch") ;
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    use_fset = (fset != NULL) ;
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-
-    Ap = A->p ;		/* size A->ncol+1, column pointers of A */
-    Ai = A->i ;		/* size nz = Ap [A->ncol], row indices of A */
-    Ax = A->x ;		/* size nz, real values of A */
-    Az = A->z ;		/* size nz, imag values of A */
-    Anz = A->nz ;
-    Apacked = A->packed ;
-    ASSERT (IMPLIES (!Apacked, Anz != NULL)) ;
-
-    permute = (Perm != NULL) ;
-
-    Fp = F->p ;		/* size A->nrow+1, row pointers of F */
-    Fj = F->i ;		/* size nz, column indices of F */
-    Fx = F->x ;		/* size nz, real values of F */
-    Fz = F->z ;		/* size nz, imag values of F */
-    Fnz = F->nz ;
-    Fpacked = F->packed ;
-    ASSERT (IMPLIES (!Fpacked, Fnz != NULL)) ;
-
-    nf = (use_fset) ? nf : ncol ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Iwork = Common->Iwork ;
-    Wi = Iwork ;		/* size nrow (i/l/l) */
-
-    /* ---------------------------------------------------------------------- */
-    /* construct the transpose */
-    /* ---------------------------------------------------------------------- */
-
-    for (jj = 0 ; jj < nf ; jj++)
-    {
-	j = (use_fset) ? (fset [jj]) : jj ;
-	p = Ap [j] ;
-	pend = (Apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-	for ( ; p < pend ; p++)
-	{
-	    fp = Wi [Ai [p]]++ ;
-	    Fj [fp] = j ;
-#ifdef NCONJUGATE
-	    ASSIGN (Fx, Fz, fp, Ax, Az, p) ;
-#else
-	    ASSIGN_CONJ (Fx, Fz, fp, Ax, Az, p) ;
-#endif
-	}
-    }
-
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === t_cholmod_transpose_sym ============================================== */
-/* ========================================================================== */
-
-/* Compute F = A' or A (p,p)', where A is symmetric and F is already allocated.
- * The complex case performs either the array transpose or complex conjugate
- * transpose.
- *
- * workspace:  Iwork (nrow) if Perm NULL, Iwork (2*nrow) if Perm non-NULL.
- */
-
-static int TEMPLATE (cholmod_transpose_sym)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    Int *Perm,		/* size n, if present (can be NULL) */
-    /* ---- output --- */
-    cholmod_sparse *F,	/* F = A' or A(p,p)' */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Az, *Fx, *Fz ;
-    Int *Ap, *Anz, *Ai, *Fp, *Fj, *Wi, *Pinv, *Iwork ;
-    Int p, pend, packed, fp, upper, permute, jold, n, i, j, iold ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    /* ensure the xtype of A and F match (ignored if this is pattern version) */
-    if (!XTYPE_OK (A->xtype))
-    {
-	ERROR (CHOLMOD_INVALID, "real/complex mismatch") ;
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    permute = (Perm != NULL) ;
-    n = A->nrow ;
-    Ap = A->p ;		/* size A->ncol+1, column pointers of A */
-    Ai = A->i ;		/* size nz = Ap [A->ncol], row indices of A */
-    Ax = A->x ;		/* size nz, real values of A */
-    Az = A->z ;		/* size nz, imag values of A */
-    Anz = A->nz ;
-    packed = A->packed ;
-    ASSERT (IMPLIES (!packed, Anz != NULL)) ;
-    upper = (A->stype > 0) ;
-
-    Fp = F->p ;		/* size A->nrow+1, row pointers of F */
-    Fj = F->i ;		/* size nz, column indices of F */
-    Fx = F->x ;		/* size nz, real values of F */
-    Fz = F->z ;		/* size nz, imag values of F */
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Iwork = Common->Iwork ;
-    Wi = Iwork ;	/* size n (i/l/l) */
-    Pinv = Iwork + n ;	/* size n (i/i/l) , unused if Perm NULL */
-
-    /* ---------------------------------------------------------------------- */
-    /* construct the transpose */
-    /* ---------------------------------------------------------------------- */
-
-    if (permute)
-    {
-	if (upper)
-	{
-	    /* permuted, upper */
-	    for (j = 0 ; j < n ; j++)
-	    {
-		jold = Perm [j] ;
-		p = Ap [jold] ;
-		pend = (packed) ? Ap [jold+1] : p + Anz [jold] ;
-		for ( ; p < pend ; p++)
-		{
-		    iold = Ai [p] ;
-		    if (iold <= jold)
-		    {
-			i = Pinv [iold] ;
-			if (i < j)
-			{
-			    fp = Wi [i]++ ;
-			    Fj [fp] = j ;
-#ifdef NCONJUGATE
-			    ASSIGN (Fx, Fz, fp, Ax, Az, p) ;
-#else
-			    ASSIGN_CONJ (Fx, Fz, fp, Ax, Az, p) ;
-#endif
-			}
-			else
-			{
-			    fp = Wi [j]++ ;
-			    Fj [fp] = i ;
-			    ASSIGN (Fx, Fz, fp, Ax, Az, p) ;
-			}
-		    }
-		}
-	    }
-	}
-	else
-	{
-	    /* permuted, lower */
-	    for (j = 0 ; j < n ; j++)
-	    {
-		jold = Perm [j] ;
-		p = Ap [jold] ;
-		pend = (packed) ? Ap [jold+1] : p + Anz [jold] ;
-		for ( ; p < pend ; p++)
-		{
-		    iold = Ai [p] ;
-		    if (iold >= jold)
-		    {
-			i = Pinv [iold] ;
-			if (i > j)
-			{
-			    fp = Wi [i]++ ;
-			    Fj [fp] = j ;
-#ifdef NCONJUGATE
-			    ASSIGN (Fx, Fz, fp, Ax, Az, p) ;
-#else
-			    ASSIGN_CONJ (Fx, Fz, fp, Ax, Az, p) ;
-#endif
-			}
-			else
-			{
-			    fp = Wi [j]++ ;
-			    Fj [fp] = i ;
-			    ASSIGN (Fx, Fz, fp, Ax, Az, p) ;
-			}
-		    }
-		}
-	    }
-	}
-    }
-    else
-    {
-	if (upper)
-	{
-	    /* unpermuted, upper */
-	    for (j = 0 ; j < n ; j++)
-	    {
-		p = Ap [j] ;
-		pend = (packed) ? Ap [j+1] : p + Anz [j] ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i <= j)
-		    {
-			fp = Wi [i]++ ;
-			Fj [fp] = j ;
-#ifdef NCONJUGATE
-			ASSIGN (Fx, Fz, fp, Ax, Az, p) ;
-#else
-			ASSIGN_CONJ (Fx, Fz, fp, Ax, Az, p) ;
-#endif
-		    }
-		}
-	    }
-	}
-	else
-	{
-	    /* unpermuted, lower */
-	    for (j = 0 ; j < n ; j++)
-	    {
-		p = Ap [j] ;
-		pend = (packed) ? Ap [j+1] : p + Anz [j] ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i >= j)
-		    {
-			fp = Wi [i]++ ;
-			Fj [fp] = j ;
-#ifdef NCONJUGATE
-			ASSIGN (Fx, Fz, fp, Ax, Az, p) ;
-#else
-			ASSIGN_CONJ (Fx, Fz, fp, Ax, Az, p) ;
-#endif
-		    }
-		}
-	    }
-	}
-    }
-
-    return (TRUE) ;
-}
-
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
-#undef NCONJUGATE
diff --git a/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_triplet.c b/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_triplet.c
deleted file mode 100644
index d2b1c82..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Core/t_cholmod_triplet.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/* ========================================================================== */
-/* === Core/t_cholmod_triplet =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Core Module.  Copyright (C) 2005-2006,
- * Univ. of Florida.  Author: Timothy A. Davis
- * The CHOLMOD/Core Module is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_triplet.  All xtypes supported */
-
-#include "cholmod_template.h"
-
-/* ========================================================================== */
-/* === t_cholmod_triplet_to_sparse ========================================== */
-/* ========================================================================== */
-
-static size_t TEMPLATE (cholmod_triplet_to_sparse)
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* matrix to copy */
-    /* ---- in/out --- */
-    cholmod_sparse *R,	/* output matrix */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Rx, *Rz, *Tx, *Tz ;
-    Int *Wj, *Rp, *Ri, *Rnz, *Ti, *Tj  ;
-    Int i, j, p, p1, p2, pdest, pj, k, stype, nrow, ncol, nz ;
-    size_t anz ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    /* Wj contains a copy of Rp on input [ */
-    Wj = Common->Iwork ;	/* size MAX (nrow,ncol). (i/l/l) */
-
-    Rp = R->p ;
-    Ri = R->i ;
-    Rnz = R->nz ;
-    Rx = R->x ;
-    Rz = R->z ;
-
-    Ti = T->i ;
-    Tj = T->j ;
-    Tx = T->x ;
-    Tz = T->z ;
-    nz = T->nnz ;
-    nrow = T->nrow ;
-    ncol = T->ncol ;
-    stype = SIGN (T->stype) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* construct the row form */
-    /* ---------------------------------------------------------------------- */
-
-    /* if Ti is jumbled, this part dominates the run time */
-
-    if (stype > 0)
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    i = Ti [k] ;
-	    j = Tj [k] ;
-	    if (i < j)
-	    {
-		/* place triplet (j,i,x) in column i of R */
-		p = Wj [i]++ ;
-		Ri [p] = j ;
-	    }
-	    else
-	    {
-		/* place triplet (i,j,x) in column j of R */
-		p = Wj [j]++ ;
-		Ri [p] = i ;
-	    }
-	    ASSIGN (Rx, Rz, p, Tx, Tz, k) ;
-	}
-    }
-    else if (stype < 0)
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    i = Ti [k] ;
-	    j = Tj [k] ;
-	    if (i > j)
-	    {
-		/* place triplet (j,i,x) in column i of R */
-		p = Wj [i]++ ;
-		Ri [p] = j ;
-	    }
-	    else
-	    {
-		/* place triplet (i,j,x) in column j of R */
-		p = Wj [j]++ ;
-		Ri [p] = i ;
-	    }
-	    ASSIGN (Rx, Rz, p, Tx, Tz, k) ;
-	}
-    }
-    else
-    {
-	for (k = 0 ; k < nz ; k++)
-	{
-	    /* place triplet (i,j,x) in column i of R */
-	    p = Wj [Ti [k]]++ ;
-	    Ri [p] = Tj [k] ;
-	    ASSIGN (Rx, Rz, p, Tx, Tz, k) ;
-	}
-    }
-
-    /* done using Wj (i/l/l) as temporary row pointers ] */
-
-    /* ---------------------------------------------------------------------- */
-    /* sum up duplicates */
-    /* ---------------------------------------------------------------------- */
-
-    /* use Wj (i/l/l) of size ncol to keep track of duplicates in each row [ */
-    for (j = 0 ; j < ncol ; j++)
-    {
-	Wj [j] = EMPTY ;
-    }
-
-    anz = 0 ;
-    for (i = 0 ; i < nrow ; i++)
-    {
-	p1 = Rp [i] ;
-	p2 = Rp [i+1] ;
-	pdest = p1 ;
-	/* at this point Wj [j] < p1 holds true for all columns j, because
-	 * Ri/Rx is stored in row oriented manner */
-	for (p = p1 ; p < p2 ; p++)
-	{
-	    j = Ri [p] ;
-	    pj = Wj [j] ;
-	    if (pj >= p1)
-	    {
-		/* this column index j is already in row i at position pj;
-		 * sum up the duplicate entry */
-		/* Rx [pj] += Rx [p] ; */
-		ASSEMBLE (Rx, Rz, pj, Rx, Rz, p) ;
-	    }
-	    else
-	    {
-		/* keep the entry and keep track in Wj [j] for case above */
-		Wj [j] = pdest ;
-		if (pdest != p)
-		{
-		    Ri [pdest] = j ;
-		    ASSIGN (Rx, Rz, pdest, Rx, Rz, p) ;
-		}
-		pdest++ ;
-	    }
-	}
-	Rnz [i] = pdest - p1 ;
-	anz += (pdest - p1) ;
-    }
-    /* done using Wj to keep track of duplicate entries in each row ] */
-
-    /* ---------------------------------------------------------------------- */
-    /* return number of entries after summing up duplicates */
-    /* ---------------------------------------------------------------------- */
-
-    return (anz) ;
-}
-
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/ChangeLog b/src/C/SuiteSparse/CHOLMOD/Doc/ChangeLog
deleted file mode 100644
index bbdb6a8..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/ChangeLog
+++ /dev/null
@@ -1,327 +0,0 @@
-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'
-        (option == 0).
-
-Jan 7, 2015: version 3.0.4
-
-    * serious bug fix to supernodal factorization.  The bug was introduced in
-	CHOLMOD v3.0.0 when the GPU acceleration was given a major update.
-	The bug can cause a segfault, whether or not the GPU is used.
-
-Oct 23, 2014: version 3.0.3
-
-    * minor fix for CHOLMOD/Supernodal/cholmod_super_symbolic.c (was using a
-      non-ANSI C method to declare and initialize a variable).
-    * added additional paper in CHOLMOD/Doc
-
-Oct 10, 2014: version 3.0.2
-
-    * changes to accomodate GPU-accelerated SPQR
-    * added CHOLMOD/Include/cholmod_function.h for backward compatibility
-        for function pointers (moved from Common to SuiteSparse_config,
-        as of v2.2.0)
-
-July 18, 2014: version 3.0.1
-
-    * minor correction to 3.0.0 Beta build process, to compile SPQR when
-        CHOLMOD is compiled on the GPU
-    * added cholmod_rowfac_mask2 function for LPDASA
-    * to test the GPU, use 'make big' in CHOLMOD/Demo.  You will need to first
-        download the GHS_psdef/audikw_1.mtx from the UF collection:
-        http://www.cise.ufl.edu/research/sparse/matrices/GHS_psdef/audikw_1.html
-
-March 26, 2014: version 3.0.0 (beta)
-
-    * major update to GPU acceleration.  Released at NVIDIA GTC 2014.
-
-July 31, 2013: version 2.2.0
-
-    * modified the CHOLMOD Common so that it is the same size regardless
-        of whether or not the GPU is used.
-    * changed malloc, printf, hypot, and divcomplex pointers to use
-        SuiteSparse_config.  Removed CHOLMOD Common-> function pointers.
-
-Apr 25, 2013: version 2.1.2
-
-    * minor update for CHOLMOD/Cholesky/*solve*.c:
-        version 2.1.0 broke the Microsoft Visual C/C++ compiler
-
-Apr 16, 2013: version 2.1.1
-
-    * bug fix to Lib/Makefile and Demo/Makefile, to handle -DNCAMD correctly.
-    * changes to Supernodal/t_cholmod_gpu.c: to fix a GPU memory leak,
-        to fix the statistics on TRSM timing, and to reduce CPU-GPU memory
-        traffic.
-    * added cholmod_version function.
-
-Mar 27, 2013: version 2.1.0
-
-    * added the -DNCAMD option.  Formerly, the -DNPARTITION option disabled
-        both METIS and the interface to CAMD, CCOLAMD, and CSYMAMD.
-        Now, -DNPARTITION controls just whether or not the interface to
-        METIS is compiled.  The new -DNCAMD option controls whether or not
-        the interfaces to CAMD, CCOLAMD, and CSYMAMD are compiled.
-        Both features remain in the Partition Module, as in prior versions.
-    * added cholmod_lsolve_pattern and modified cholmod_row_lsubtree,
-        to compute nonzero pattern of L\b where b is sparse
-    * added cholmod_solve2 and cholmod_ensure_dense, so that repeated
-        forward/backsolves can be done without the need to malloc/free,
-        memory on each solve.  Also provides the option for solving for
-        a subset of the solution vector x (via the Bset and Xset
-        parameters to cholmod_solve2).  The last option required an IPerm
-        member to be added to the Cholesky factorization object.  It is only
-        allocated and used if cholmod_solve2 solves with Bset.
-
-Jun 20, 2012: verison 2.0.1
-
-    * minor update for Windows (removed filesep, compiler port fix)
-    * minor changes to format of User Guide
-    * bug fix for GPU code (singular case)
-
-Jun 1, 2012: version 2.0.0
-
-    * changed from UFconfig to SuiteSparse_config
-    * added interface to CUDA BLAS
-
-Dec 7, 2011: version 1.7.4
-
-    * fixed the Makefile to better align with CFLAGS and other standards
-    * Makefile now detects whether or not METIS is present, and
-        sets -DNPARTITION if it is not
-
-Jan 25, 2011: version 1.7.3
-
-    * minor fix to "make install"
-    * minor change to Core/cholmod_memory.c, rename "I" which conflicts with
-        a predefined token in some compilers
-
-Nov 30, 2009: version 1.7.2
-
-    * added "make install" and "make uninstall"
-    * fixed interface to 64-bit BLAS for MATLAB 7.8
-
-Sept 30, 2008, version 1.7.1
-
-    * bug fix to cholmod_symmetry; it reported incorrectly if the matrix
-        had a zero-free diagonal or not.  No effect on the use of CHOLMOD in
-        MATLAB.  No effect on the mwrite function, either, which uses
-        cholmod_symmetry.  Note that the number of nonzeros on the diagonal was
-        (and still is) correctly computed.  Only effect is on the
-        UF_Index.cholcand statistic reported in the UFget index, and on the web
-        pages, for the UF Sparse Matrix Collection (the UF_Index.cholcand
-        field).  This affects the output of spsym.
-
-Sept 20, 2008, version 1.7.0
-
-    * update for SuiteSparseQR:
-
-	- add SuiteSparseQR knobs and stats to CHOLMOD Common
-	- SuiteSparseQR uses CHOLMOD for its multifrontal symbolic analysis
-	- changed (char *) input parameters to (const char *), to avoid
-	    spurious compiler warnings when C++ calls C.
-	- minor change to the AMD backup strategy in cholmod_analyze, to better
-	    suit SuiteSparseQR
-	- modified cholmod_analyze and cholmod_super_symbolic,
-	    to add "for_cholesky" parameter; new function cholmod_analyze_p2.
-	    This parameter is false for SuiteSparseQR.
-	- minor correction to comments in cholmod_postorder.c
-	- performance enhancement to supernodal symbolic analysis, when
-	    A or AA' is fairly dense
-
-Nov 1, 2007, version 1.6.0
-
-    * minor lint cleanup (no bugs)
-
-    * new CHOLMOD_CLEAR_FLAG macro, which speeds up the calls to
-	cholmod_clear_flag, avoiding the function call if not needed.  Note
-	that this leads to untested lines in the Tcov test, but the lines of
-	the macro are tested in several places, just not everywhere it appers.
-
-    * port to MATLAB 7.5 (mex -lmwblas option now required for Linux)
-
-    * minor bug fix to cholmod_add.c to avoid potential Int overflow
-
-    * extra option added to cholmod2 mexFunction
-
-    * sparse2 mexFunction modified to ensure nnz(A) == nzmax(A) always holds
-	(It didn't in v1.5.0 if numerically zero entries were dropped in A).
-
-    * correction to Help comments for spsym function
-
-    * bug fix to cholmod_symmetry.c: determination of Hermitian vs non-Hermitian
-	matrices was incorrect if the diagonal was imaginary.
-
-    * performance fix for cholmod_nesdis.c and nesdis mexFunction
-
-May 31, 2007, version 1.5.0
-
-    * 64-bit MATLAB interface
-    
-    * MATLAB interface back-ported to MATLAB 6.1.
-
-    * bug fix: solving Dx=b using a supernodal factorization, in
-	cholmod_l_solve, when sizeof(UF_long) > sizeof(BLAS integer)
-
-    * changes to Makefiles to reflect directory changes in COLAMD and CCOLAMD
-	v2.7.0 directory structure (CHOLMOD v1.5 requires v2.7.0 of those
-	two packages)
-
-    * update to Modify/cholmod_updown.c, to allow input vector R to be packed
-	or unpacked.
-
-    * bug fix to Tcov/huge.c test code, for 64-bit case (this has no effect
-	on the CHOLMOD library itself, just the test code)
-
-Dec 12, 2006, version 1.4.0
-
-    * added support for large files (larger than 2GB)
-
-    * minor MATLAB cleanup
-
-    * renamed MATLAB function from cholmod to cholmod2, to avoid filename clash
-	with itself (the built-in version of cholmod).
-
-Dec 2, 2006, version 1.3.0
-
-    * Major modification to cholmod_read.c; now fully supports all forms of the
-	Matrix Market format.  Added cholmod_read_dense and cholmod_read_matrix
-	functions to cholmod_read.c.  Major changes to mread MATLAB function.
-	Added Common->prefer_binary option for cholmod_read.
-
-    * Added cholmod_write.c (cholmod_write_sparse and cholmod_write_dense
-	functions).  Added mwrite MATLAB function.
-
-    * Added 2nd output argument to sparse2 (Z, binary pattern of explicit
-	zero entries).
-
-    * Added the function cholmod_symmetry to the MatrixOps module.
-	Added spsym MATLAB function.
-
-    * 2nd argument to cholmod_triplet_to_sparse changed from int to size_t.
-
-    * minor correction to cholmod_analyze_ordering, cholmod_dense.c
-
-    * minor change to cholmod_rowfac.c, cholmod_solve.c, ...
-	to allow for easier testing.
-
-Sept 28, 2006, version 1.2.1
-
-    * bug fix to cholmod_matlab.c, when working with sparse INT64 matrices
-	in the "sparse2" function
-
-Aug 31, 2006, version 1.2
-
-    * Common->default_nesdis parameter and Common->called_nd statistic added.
-	Otherwise, no change to user interface.  v1.2 is fully upward
-	compatible with v1.1 (even binary compatible).
-
-    * non-supernodal Lx=b and L'x=b solves simplified, slight increase in
-	performance.
-
-    * update/downdate performance improved.
-
-    * ordering options and output statistics added to MATLAB/cholmod
-	mexFunction.
-
-July 27, 2006, version 1.1.1
-
-    * bug fix for cholmod_rowfac_mask, for the complex case.  Has no
-	effect on MATLAB.
-
-June 27, 2006:
-
-    * trivial changes to nested dissection code, and cholmod_read.c (for
-	debugging, and to add explicit typecasts so compilers don't complain).
-
-May, 2006:
-
-    * Added new routines for LPDASA: cholmod_rowfac_mask, cholmod_updown_mask.
-	Added cholmod_collapse_septree.  Added nd_oksep, nd_components
-	parameters to Common.
-
-Apr 30, 2006: version 1.1
-
-    * added interface to CAMD.  cholmod_nested_dissection can now call
-	CCOLAMD, CSYMAMD, and CAMD.  Common->nd_camd usage extended.
-	New argument added to nesdis mexFunction.  New cholmod_camd function
-	added.  No other changes to CHOLMOD user interface.
-
-    * more careful integer overflow checks.  Added non-user-callable functions
-	to add and multiply size_t integers, with overflow checks.
-
-    * added Common->no_workspace_reallocate
-
-    * flop count is now correct for A*A' case (Common->rowfacfl).
-
-Jan 18, 2006: version 1.0.2
-
-    * bug fix: MATLAB interface incorrect for full logical matrices.
-
-    * Tcov tests modified to generate fewer intentional nan's, to make it
-	easier to look for errors in BLAS libraries that incorrectly
-	generate nan's.
-
-Dec 16, 2005: version 1.0.1
-
-    * bug fix: cholmod_amd allocated too small of a workspace when ordering A*A'
-
-Dec 8, 2005: version 1.0
-
-    * no real changes.  Version 1.0 is the same as version 0.8.  Version 1.0 is
-	simply the formal stable release.
-
-    * known issue:  the floating point operation count, Common->rowfacfl, is
-	statistic is incorrect when factorizing A*A'.  This will be fixed in
-	version 1.1.
-
-Nov 15, 2005: version 0.8
-
-    * bug fix in t_cholmod_super_numeric, for [R,p]=chol(A) usage.
-
-    * Common->quick_return_if_not_posdef added.
-
-    * Added cholmod_row_lsubtree (required for LPDASA)
-
-    * bug fix: cholmod_rcond returned sqrt(1/cond) for an LL' factorization;
-	1/cond is required.
-
-    * new statistics added: flop counts for cholmod_rowfac, # of factor column
-	reallocations, # of factor reallocations due to column reallocations,
-	and # of times the (non-default) bounds on diag(L) are hit.
-
-    * factor column reallocation skipped if space already big enough.
-
-    * bug fix: cholmod_copy_factor did not copy L->is_monotonic.
-
-    * bug fix: cholmod_change_factor (diagonal entry was wrong in one case)
-
-    * rcond added to cholmod mexFunction ([x,rcond] = cholmod(A,b)).
-
-    * cholmod_rowadd, cholmod_rowdel modified.  rowdel no longer removes
-	entries from the matrix; it sets them to zero instead.
-
-Oct 10, 2005: version 0.7
-
-    * minor changes:  minor change to Check/cholmod_check.c (coerce
-	sizeof(...) to (int) when printing. Less strict check on A->p for
-	unpacked matrices) , removed a few unused variables in
-	Check/cholmod_read.c and Demo/cholmod*demo.c, changed "exit(0)" to
-	"return(0)" in Demo/cholmod_simple.c.  Changed Makefile so that "." is
-	not assumed to be on the $path.  Added Cygwin to architecture detection
-	in Include/cholmod_blas.h.  Added cparent and cmember to nesdis.m.
-	Space for future expansion added to cholmod_common.
-
-    * removed "rowmark" from the Modify module, which affects how partial
-	updates to Lx=b solves are done during update/downdate.  Should only
-	affect LPDASA.
-
-    * added CHOLMOD_SUBSUB_VERSION
-
-Aug 31, 2005:  version 0.6 released.
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/Makefile b/src/C/SuiteSparse/CHOLMOD/Doc/Makefile
deleted file mode 100644
index d215949..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/Makefile
+++ /dev/null
@@ -1,233 +0,0 @@
-default: all
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-all: UserGuide.pdf purge
-
-I = \
-	../Include/cholmod.h \
-	../Include/cholmod_blas.h \
-	../Include/cholmod_check.h \
-	../Include/cholmod_cholesky.h \
-	../Include/cholmod_complexity.h \
-	../Include/cholmod_config.h \
-	../Include/cholmod_core.h \
-	../Include/cholmod_internal.h \
-	../Include/cholmod_matrixops.h \
-	../Include/cholmod_modify.h \
-	../Include/cholmod_partition.h \
-	../Include/cholmod_supernodal.h \
-	../Include/cholmod_template.h
-
-C = ../Demo/cholmod_simple.c
-
-M = \
-	../MATLAB/analyze.m \
-	../MATLAB/bisect.m \
-	../MATLAB/chol2.m \
-	../MATLAB/cholmod2.m \
-	../MATLAB/cholmod_demo.m \
-	../MATLAB/cholmod_make.m \
-	../MATLAB/etree2.m \
-	../MATLAB/graph_demo.m \
-	../MATLAB/lchol.m \
-	../MATLAB/ldlchol.m \
-	../MATLAB/ldl_normest.m \
-	../MATLAB/ldlsolve.m \
-	../MATLAB/ldlsplit.m \
-	../MATLAB/ldlupdate.m \
-	../MATLAB/ldlrowmod.m \
-	../MATLAB/metis.m \
-	../MATLAB/nesdis.m \
-	../MATLAB/resymbol.m \
-	../MATLAB/sdmult.m \
-	../MATLAB/sparse2.m \
-	../MATLAB/spsym.m \
-	../MATLAB/mread.m \
-	../MATLAB/mwrite.m \
-	../MATLAB/symbfact2.m
-
-UserGuide.pdf: UserGuide.tex UserGuide.bib $(I) $(C) $(M) Makefile getproto rule.awk header.tex footer.tex getmproto mfooter.tex mheader.tex mfile.awk
-	./getmproto ../MATLAB/analyze.m > _analyze_m.tex
-	./getmproto ../MATLAB/bisect.m > _bisect_m.tex
-	./getmproto ../MATLAB/chol2.m > _chol2_m.tex
-	./getmproto ../MATLAB/cholmod2.m > _cholmod2_m.tex
-	./getmproto ../MATLAB/cholmod_demo.m > _cholmod_demo_m.tex
-	./getmproto ../MATLAB/cholmod_make.m > _cholmod_make_m.tex
-	./getmproto ../MATLAB/etree2.m > _etree2_m.tex
-	./getmproto ../MATLAB/graph_demo.m > _graph_demo_m.tex
-	./getmproto ../MATLAB/lchol.m > _lchol_m.tex
-	./getmproto ../MATLAB/ldlchol.m > _ldlchol_m.tex
-	./getmproto ../MATLAB/ldl_normest.m > _ldl_normest_m.tex
-	./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
-	./getmproto ../MATLAB/mwrite.m > _mwrite_m.tex
-	./getmproto ../MATLAB/nesdis.m > _nesdis_m.tex
-	./getmproto ../MATLAB/resymbol.m > _resymbol_m.tex
-	./getmproto ../MATLAB/sdmult.m > _sdmult_m.tex
-	./getmproto ../MATLAB/sparse2.m > _sparse2_m.tex
-	./getmproto ../MATLAB/symbfact2.m > _symbfact2_m.tex
-	./getproto '/include/, /^}/' ../Demo/cholmod_simple.c > _simple.tex
-	./getproto '/typedef struct cholmod_common/, /^}/' ../Include/cholmod_core.h > _common.tex
-	./getproto '/int cholmod_start/, /\*\) ;/' ../Include/cholmod_core.h > _start.tex
-	./getproto '/int cholmod_finish/, /\*\) ;/' ../Include/cholmod_core.h > _finish.tex
-	./getproto '/int cholmod_defaults/, /\*\) ;/' ../Include/cholmod_core.h > _defaults.tex
-	./getproto '/size_t cholmod_maxrank/, /\*\) ;/' ../Include/cholmod_core.h > _maxrank.tex
-	./getproto '/int cholmod_allocate_work/, /\*\) ;/' ../Include/cholmod_core.h > _allocate_work.tex
-	./getproto '/int cholmod_free_work/, /\*\) ;/' ../Include/cholmod_core.h > _free_work.tex
-	./getproto '/long cholmod_clear_flag/, /\*\) ;/' ../Include/cholmod_core.h > _clear_flag.tex
-	./getproto '/int cholmod_error/, /\*\) ;/' ../Include/cholmod_core.h > _error.tex
-	./getproto '/double cholmod_dbound/, /\*\) ;/' ../Include/cholmod_core.h > _dbound.tex
-	./getproto '/double cholmod_hypot/, /double\) ;/' ../Include/cholmod_core.h > _hypot.tex
-	./getproto '/int cholmod_divcomplex/, /\*\) ;/' ../Include/cholmod_core.h > _divcomplex.tex
-	./getproto '/typedef struct cholmod_sparse/, /^}/' ../Include/cholmod_core.h > _sparse.tex
-	./getproto '/cholmod_sparse \*cholmod_allocate_sparse/, /\*\) ;/' ../Include/cholmod_core.h > _allocate_sparse.tex
-	./getproto '/int cholmod_free_sparse/, /\*\) ;/' ../Include/cholmod_core.h > _free_sparse.tex
-	./getproto '/int cholmod_reallocate_sparse/, /\*\) ;/' ../Include/cholmod_core.h > _reallocate_sparse.tex
-	./getproto '/long cholmod_nnz/, /\*\) ;/' ../Include/cholmod_core.h > _nnz.tex
-	./getproto '/cholmod_sparse \*cholmod_speye/, /\*\) ;/' ../Include/cholmod_core.h > _speye.tex
-	./getproto '/cholmod_sparse \*cholmod_spzeros/, /\*\) ;/' ../Include/cholmod_core.h > _spzeros.tex
-	./getproto '/cholmod_sparse \*cholmod_transpose/, /\*\) ;/' ../Include/cholmod_core.h > _transpose.tex
-	./getproto '/int cholmod_transpose_unsym/, /\*\) ;/' ../Include/cholmod_core.h > _transpose_unsym.tex
-	./getproto '/int cholmod_transpose_sym/, /\*\) ;/' ../Include/cholmod_core.h > _transpose_sym.tex
-	./getproto '/cholmod_sparse \*cholmod_ptranspose/, /\*\) ;/' ../Include/cholmod_core.h > _ptranspose.tex
-	./getproto '/int cholmod_sort/, /\*\) ;/' ../Include/cholmod_core.h > _sort.tex
-	./getproto '/cholmod_sparse \*cholmod_band/, /\*\) ;/' ../Include/cholmod_core.h > _band.tex
-	./getproto '/int cholmod_band_inplace/, /\*\) ;/' ../Include/cholmod_core.h > _band_inplace.tex
-	./getproto '/cholmod_sparse \*cholmod_aat/, /\*\) ;/' ../Include/cholmod_core.h > _aat.tex
-	./getproto '/cholmod_sparse \*cholmod_copy_sparse/, /\*\) ;/' ../Include/cholmod_core.h > _copy_sparse.tex
-	./getproto '/cholmod_sparse \*cholmod_copy /, /\*\) ;/' ../Include/cholmod_core.h > _copy.tex
-	./getproto '/cholmod_sparse \*cholmod_add/, /\*\) ;/' ../Include/cholmod_core.h > _add.tex
-	./getproto '/int cholmod_sparse_xtype/, /\*\) ;/' ../Include/cholmod_core.h > _sparse_xtype.tex 
-	./getproto '/typedef struct cholmod_factor/, /^}/' ../Include/cholmod_core.h > _factor.tex 
-	./getproto '/cholmod_factor \*cholmod_allocate_factor/, /\*\) ;/' ../Include/cholmod_core.h > _allocate_factor.tex 
-	./getproto '/int cholmod_free_factor/, /\*\) ;/' ../Include/cholmod_core.h > _free_factor.tex 
-	./getproto '/int cholmod_reallocate_factor/, /\*\) ;/' ../Include/cholmod_core.h > _reallocate_factor.tex 
-	./getproto '/int cholmod_change_factor/, /\*\) ;/' ../Include/cholmod_core.h > _change_factor.tex 
-	./getproto '/int cholmod_pack_factor/, /\*\) ;/' ../Include/cholmod_core.h > _pack_factor.tex 
-	./getproto '/int cholmod_reallocate_column/, /\*\) ;/' ../Include/cholmod_core.h > _reallocate_column.tex 
-	./getproto '/cholmod_sparse \*cholmod_factor_to_sparse/, /\*\) ;/' ../Include/cholmod_core.h > _factor_to_sparse.tex 
-	./getproto '/cholmod_factor \*cholmod_copy_factor/, /\*\) ;/' ../Include/cholmod_core.h > _copy_factor.tex 
-	./getproto '/int cholmod_factor_xtype/, /\*\) ;/' ../Include/cholmod_core.h > _factor_xtype.tex 
-	./getproto '/typedef struct cholmod_dense/, /^}/' ../Include/cholmod_core.h > _dense.tex 
-	./getproto '/cholmod_dense \*cholmod_allocate_dense/, /\*\) ;/' ../Include/cholmod_core.h > _allocate_dense.tex 
-	./getproto '/cholmod_dense \*cholmod_ensure_dense/, /\*\) ;/' ../Include/cholmod_core.h > _ensure_dense.tex 
-	./getproto '/cholmod_dense \*cholmod_zeros/, /\*\) ;/' ../Include/cholmod_core.h > _zeros.tex 
-	./getproto '/cholmod_dense \*cholmod_ones/, /\*\) ;/' ../Include/cholmod_core.h > _ones.tex 
-	./getproto '/cholmod_dense \*cholmod_eye/, /\*\) ;/' ../Include/cholmod_core.h > _eye.tex 
-	./getproto '/int cholmod_free_dense/, /\*\) ;/' ../Include/cholmod_core.h > _free_dense.tex 
-	./getproto '/cholmod_dense \*cholmod_sparse_to_dense/, /\*\) ;/' ../Include/cholmod_core.h > _sparse_to_dense.tex 
-	./getproto '/cholmod_sparse \*cholmod_dense_to_sparse/, /\*\) ;/' ../Include/cholmod_core.h > _dense_to_sparse.tex 
-	./getproto '/cholmod_dense \*cholmod_copy_dense/, /\*\) ;/' ../Include/cholmod_core.h > _copy_dense.tex 
-	./getproto '/int cholmod_copy_dense2/, /\*\) ;/' ../Include/cholmod_core.h > _copy_dense2.tex 
-	./getproto '/int cholmod_dense_xtype/, /\*\) ;/' ../Include/cholmod_core.h > _dense_xtype.tex 
-	./getproto '/typedef struct cholmod_triplet/, /^}/' ../Include/cholmod_core.h > _triplet.tex 
-	./getproto '/cholmod_triplet \*cholmod_allocate_triplet/, /\*\) ;/' ../Include/cholmod_core.h > _allocate_triplet.tex 
-	./getproto '/int cholmod_free_triplet/, /\*\) ;/' ../Include/cholmod_core.h > _free_triplet.tex 
-	./getproto '/int cholmod_reallocate_triplet/, /\*\) ;/' ../Include/cholmod_core.h > _reallocate_triplet.tex 
-	./getproto '/cholmod_triplet \*cholmod_sparse_to_triplet/, /\*\) ;/' ../Include/cholmod_core.h > _sparse_to_triplet.tex 
-	./getproto '/cholmod_sparse \*cholmod_triplet_to_sparse/, /\*\) ;/' ../Include/cholmod_core.h > _triplet_to_sparse.tex 
-	./getproto '/cholmod_triplet \*cholmod_copy_triplet/, /\*\) ;/' ../Include/cholmod_core.h > _copy_triplet.tex 
-	./getproto '/int cholmod_triplet_xtype/, /\*\) ;/' ../Include/cholmod_core.h > _triplet_xtype.tex 
-	./getproto '/void \*cholmod_malloc/, /\*\) ;/' ../Include/cholmod_core.h > _malloc.tex 
-	./getproto '/void \*cholmod_calloc/, /\*\) ;/' ../Include/cholmod_core.h > _calloc.tex 
-	./getproto '/void \*cholmod_free/, /\*\) ;/' ../Include/cholmod_core.h > _free.tex 
-	./getproto '/void \*cholmod_realloc/, /\*\) ;/' ../Include/cholmod_core.h > _realloc.tex 
-	./getproto '/int cholmod_realloc_multiple/, /\*\) ;/' ../Include/cholmod_core.h > _realloc_multiple.tex 
-	./getproto '/int cholmod_version/, /l_version/' ../Include/cholmod_core.h > _version.tex 
-	./getproto '/itype defines the/, /define CHOLMOD_SUPERNODAL/' ../Include/cholmod_core.h > _defn.tex 
-	./getproto '/int cholmod_check_common/, /\*\) ;/' ../Include/cholmod_check.h > _check_common.tex 
-	./getproto '/int cholmod_print_common/, /\*\) ;/' ../Include/cholmod_check.h > _print_common.tex 
-	./getproto '/int cholmod_check_sparse/, /\*\) ;/' ../Include/cholmod_check.h > _check_sparse.tex 
-	./getproto '/int cholmod_print_sparse/, /\*\) ;/' ../Include/cholmod_check.h > _print_sparse.tex 
-	./getproto '/int cholmod_check_dense/, /\*\) ;/' ../Include/cholmod_check.h > _check_dense.tex 
-	./getproto '/int cholmod_print_dense/, /\*\) ;/' ../Include/cholmod_check.h > _print_dense.tex 
-	./getproto '/int cholmod_check_factor/, /\*\) ;/' ../Include/cholmod_check.h > _check_factor.tex 
-	./getproto '/int cholmod_print_factor/, /\*\) ;/' ../Include/cholmod_check.h > _print_factor.tex 
-	./getproto '/int cholmod_check_triplet/, /\*\) ;/' ../Include/cholmod_check.h > _check_triplet.tex 
-	./getproto '/int cholmod_print_triplet/, /\*\) ;/' ../Include/cholmod_check.h > _print_triplet.tex 
-	./getproto '/int cholmod_check_subset/, /\*\) ;/' ../Include/cholmod_check.h > _check_subset.tex 
-	./getproto '/int cholmod_print_subset/, /\*\) ;/' ../Include/cholmod_check.h > _print_subset.tex 
-	./getproto '/int cholmod_check_perm/, /\*\) ;/' ../Include/cholmod_check.h > _check_perm.tex
-	./getproto '/int cholmod_print_perm/, /\*\) ;/' ../Include/cholmod_check.h > _print_perm.tex
-	./getproto '/int cholmod_check_parent/, /\*\) ;/' ../Include/cholmod_check.h > _check_parent.tex
-	./getproto '/int cholmod_print_parent/, /\*\) ;/' ../Include/cholmod_check.h > _print_parent.tex
-	./getproto '/cholmod_triplet \*cholmod_read_triplet/, /\*\) ;/' ../Include/cholmod_check.h > _read_triplet.tex
-	./getproto '/cholmod_sparse \*cholmod_read_sparse/, /\*\) ;/' ../Include/cholmod_check.h > _read_sparse.tex
-	./getproto '/cholmod_dense \*cholmod_read_dense/, /\*\) ;/' ../Include/cholmod_check.h > _read_dense.tex
-	./getproto '/void \*cholmod_read_matrix/, /\*\) ;/' ../Include/cholmod_check.h > _read_matrix.tex
-	./getproto '/int cholmod_write_sparse/, /\*\) ;/' ../Include/cholmod_check.h > _write_sparse.tex
-	./getproto '/int cholmod_write_dense/, /\*\) ;/' ../Include/cholmod_check.h > _write_dense.tex
-	./getproto '/cholmod_factor \*cholmod_analyze /, /\*\) ;/' ../Include/cholmod_cholesky.h > _analyze.tex
-	./getproto '/cholmod_factor \*cholmod_analyze_p/, /\*\) ;/' ../Include/cholmod_cholesky.h > _analyze_p.tex
-	./getproto '/int cholmod_factorize /, /\*\) ;/' ../Include/cholmod_cholesky.h > _factorize.tex
-	./getproto '/int cholmod_factorize_p/, /\*\) ;/' ../Include/cholmod_cholesky.h > _factorize_p.tex
-	./getproto '/cholmod_dense \*cholmod_solve/, /\*\) ;/' ../Include/cholmod_cholesky.h > _solve.tex 
-	./getproto '/int cholmod_solve2/, /\*\) ;/' ../Include/cholmod_cholesky.h > _solve2.tex 
-	./getproto '/cholmod_sparse \*cholmod_spsolve/, /\*\) ;/' ../Include/cholmod_cholesky.h > _spsolve.tex 
-	./getproto '/int cholmod_etree/, /\*\) ;/' ../Include/cholmod_cholesky.h > _etree.tex 
-	./getproto '/int cholmod_rowcolcounts/, /\*\) ;/' ../Include/cholmod_cholesky.h > _rowcolcounts.tex 
-	./getproto '/int cholmod_analyze_ordering/, /\*\) ;/' ../Include/cholmod_cholesky.h > _analyze_ordering.tex 
-	./getproto '/int cholmod_amd/, /\*\) ;/' ../Include/cholmod_cholesky.h > _amd.tex 
-	./getproto '/int cholmod_colamd/, /\*\) ;/' ../Include/cholmod_cholesky.h > _colamd.tex 
-	./getproto '/int cholmod_rowfac/, /\*\) ;/' ../Include/cholmod_cholesky.h > _rowfac.tex 
-	./getproto '/int cholmod_rowfac_mask/, /\*\) ;/' ../Include/cholmod_cholesky.h > _rowfac_mask.tex 
-	./getproto '/int cholmod_row_subtree/, /\*\) ;/' ../Include/cholmod_cholesky.h > _row_subtree.tex 
-	./getproto '/int cholmod_row_lsubtree/, /\*\) ;/' ../Include/cholmod_cholesky.h > _row_lsubtree.tex 
-	./getproto '/int cholmod_lsolve_pattern/, /\*\) ;/' ../Include/cholmod_cholesky.h > _lsolve_pattern.tex 
-	./getproto '/int cholmod_resymbol /, /\*\) ;/' ../Include/cholmod_cholesky.h > _resymbol.tex
-	./getproto '/int cholmod_resymbol_noperm/, /\*\) ;/' ../Include/cholmod_cholesky.h > _resymbol_noperm.tex 
-	./getproto '/double cholmod_rcond/, /\*\) ;/' ../Include/cholmod_cholesky.h > _rcond.tex
-	./getproto '/long cholmod_postorder/, /\*\) ;/' ../Include/cholmod_cholesky.h > _postorder.tex
-	./getproto '/int cholmod_updown /, /\*\) ;/' ../Include/cholmod_modify.h > _updown.tex
-	./getproto '/int cholmod_updown_solve/, /\*\) ;/' ../Include/cholmod_modify.h > _updown_solve.tex
-	./getproto '/int cholmod_updown_mark/, /\*\) ;/' ../Include/cholmod_modify.h > _updown_mark.tex
-	./getproto '/int cholmod_updown_mask/, /\*\) ;/' ../Include/cholmod_modify.h > _updown_mask.tex
-	./getproto '/int cholmod_rowadd /, /\*\) ;/' ../Include/cholmod_modify.h > _rowadd.tex
-	./getproto '/int cholmod_rowadd_solve/, /\*\) ;/' ../Include/cholmod_modify.h > _rowadd_solve.tex
-	./getproto '/int cholmod_rowadd_mark/, /\*\) ;/' ../Include/cholmod_modify.h > _rowadd_mark.tex
-	./getproto '/int cholmod_rowdel /, /\*\) ;/' ../Include/cholmod_modify.h > _rowdel.tex
-	./getproto '/int cholmod_rowdel_solve/, /\*\) ;/' ../Include/cholmod_modify.h > _rowdel_solve.tex
-	./getproto '/int cholmod_rowdel_mark/, /\*\) ;/' ../Include/cholmod_modify.h > _rowdel_mark.tex
-	./getproto '/int cholmod_drop/, /\*\) ;/' ../Include/cholmod_matrixops.h > _drop.tex
-	./getproto '/double cholmod_norm_dense/, /\*\) ;/' ../Include/cholmod_matrixops.h > _norm_dense.tex
-	./getproto '/double cholmod_norm_sparse/, /\*\) ;/' ../Include/cholmod_matrixops.h > _norm_sparse.tex
-	./getproto '/cholmod_sparse \*cholmod_horzcat/, /\*\) ;/' ../Include/cholmod_matrixops.h > _horzcat.tex
-	./getproto '/define CHOLMOD_SCALAR/, /\*\) ;/' ../Include/cholmod_matrixops.h > _scale.tex
-	./getproto '/int cholmod_sdmult/, /\*\) ;/' ../Include/cholmod_matrixops.h > _sdmult.tex
-	./getproto '/cholmod_sparse \*cholmod_ssmult/, /\*\) ;/' ../Include/cholmod_matrixops.h > _ssmult.tex
-	./getproto '/cholmod_sparse \*cholmod_submatrix/, /\*\) ;/' ../Include/cholmod_matrixops.h > _submatrix.tex
-	./getproto '/cholmod_sparse \*cholmod_vertcat/, /\*\) ;/' ../Include/cholmod_matrixops.h > _vertcat.tex
-	./getproto '/int cholmod_symmetry/, /\*\) ;/' ../Include/cholmod_matrixops.h > _symmetry.tex
-	./getproto '/int cholmod_super_symbolic/, /\*\) ;/' ../Include/cholmod_supernodal.h > _super_symbolic.tex
-	./getproto '/int cholmod_super_numeric/, /\*\) ;/' ../Include/cholmod_supernodal.h > _super_numeric.tex
-	./getproto '/int cholmod_super_lsolve/, /\*\) ;/' ../Include/cholmod_supernodal.h > _super_lsolve.tex
-	./getproto '/int cholmod_super_ltsolve/, /\*\) ;/' ../Include/cholmod_supernodal.h > _super_ltsolve.tex
-	./getproto '/long cholmod_nested_dissection/, /\*\) ;/' ../Include/cholmod_partition.h > _nested_dissection.tex
-	./getproto '/int cholmod_metis/, /\*\) ;/' ../Include/cholmod_partition.h > _metis.tex
-	./getproto '/int cholmod_ccolamd/, /\*\) ;/' ../Include/cholmod_partition.h > _ccolamd.tex
-	./getproto '/int cholmod_camd/, /\*\) ;/' ../Include/cholmod_partition.h > _camd.tex
-	./getproto '/int cholmod_csymamd/, /\*\) ;/' ../Include/cholmod_partition.h > _csymamd.tex
-	./getproto '/int cholmod_csymamd/, /\*\) ;/' ../Include/cholmod_partition.h > _csymamd.tex
-	./getproto '/long cholmod_bisect/, /\*\) ;/' ../Include/cholmod_partition.h > _bisect.tex
-	./getproto '/long cholmod_metis_bisector/, /\*\) ;/' ../Include/cholmod_partition.h > _metis_bisector.tex
-	./getproto '/long cholmod_collapse_septree/, /\*\) ;/' ../Include/cholmod_partition.h > _collapse_septree.tex
-	pdflatex UserGuide
-	bibtex UserGuide
-	pdflatex UserGuide
-	pdflatex UserGuide
-
-distclean: purge
-
-purge: clean
-	- $(RM) _temp.awk _*.tex *.dvi *.aux *.log *.lof *.lot *.toc *.bak 
-	- $(RM) *.bbl *.blg
-	- $(RM) -r *.dSYM
-
-clean:
-	- $(RM) -r $(CLEAN)
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/UserGuide.bib b/src/C/SuiteSparse/CHOLMOD/Doc/UserGuide.bib
deleted file mode 100644
index c804ad2..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/UserGuide.bib
+++ /dev/null
@@ -1,196 +0,0 @@
- at string{SIMAX       = "{SIAM} J. Matrix Anal. Applic."}
- at string{TOMS        = "{ACM} Trans. Math. Softw."}
- at string{SIAMJSC     = "{SIAM} J. Sci. Comput."}
-
- at article{DavisHager06,
-	author={Davis, T. A. and Hager, W. W.},
-	title={Dynamic supernodes in sparse {Cholesky} update/downdate and triangular
-	    solves},
-	journal=TOMS,
-	year={submitted in 2006}
-	}
-
- at article{ChenDavisHagerRajamanickam06,
-	author={Chen, Y. and Davis, T. A. and Hager, W. W. and Rajamanickam, S.},
-	title={Algorithm 8xx: {CHOLMOD}, supernodal sparse {Cholesky} factorization and
-	    update/downdate},
-	journal=TOMS,
-	year={submitted in 2006}
-	}
-
- at 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}
-	}
-
- at article{DavisHager01,
-	author={Davis, T. A. and Hager, W. W.},
-	title={Multiple-Rank Modifications of a Sparse {C}holesky Factorization},
-	journal=SIMAX,
-	year={2001}
-	,volume={22}
-	,number={4}
-	,pages={997--1013}
-	}
-
- at article{DavisHager05,
-	author={Davis, T. A. and Hager, W. W.},
-	title={Row modifications of a sparse {Cholesky} factorization},
-	journal=SIMAX,
-	year={2005}
-	,volume={26}
-	,number={3}
-	,pages={621--639}
-	}
-
- at 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}
-	}
-
- at article{Davis05,
-	author={Davis, T. A.},
-	title={Algorithm 849: A concise sparse {Cholesky} algorithm},
-	journal=TOMS,
-	year={2005},volume={31},number={4},pages={587--591}}
-
- at 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}}
-
- at 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}}
-
- at article{NgPeyton91b,
-	author={Ng, E. and Peyton, B.},
-	title={Block sparse {C}holesky algorithms on advanced uniprocessor computers},
-	journal=SIAMJSC,
-	year={1993}
-	,volume={14}
-	,pages={1034--1056}
-	}
-
- at article{Liu86c,
-	author={Liu, J. W. H.},
-	title={A Compact Row Storage Scheme for {C}holesky Factors Using Elimination Trees},
-	journal=TOMS,
-	year={1986},
-	volume={12},
-	number={2},
-	pages={127--148},
-	}
-
- at article{Liu90a,
-	author={Liu, J. W. H.},
-	title={The Role of Elimination Trees in Sparse Factorization},
-	journal=SIMAX,
-	year={1990}
-	,volume={11}
-	,number={1}
-	,pages={134--172}
-	}
-
- at 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}
-	}
-
- at article{GilbertLiNgPeyton01,
-	author={Gilbert, J. R. and Li, X. S. and Ng, E. G. and Peyton, B. W.},
-	title={Computing row and column counts for sparse {QR} and {LU} factorization},
-	journal={{BIT}},
-	year={2001}
-	,volume={41}
-	,number={4}
-	,pages={693--710}
-	}
-
- at book{LAPACK,
-	author={Anderson, E. and Bai, Z. and Bischof, C. and Blackford, S.  and Demmel, J. and Dongarra, J. and {Du Croz}, J. and Greenbaum, A.  and Hammarling, S. and McKenny, A. and Sorensen, D.},
-	title={{LAPACK} Users' Guide, 3rd ed.},
-	publisher={{SIAM}},
-	year={1999}
-	}
-
- at 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}
-	}
-
-
- at article{KarypisKumar98,
-	author={Karypis, G. and Kumar, V.},
-	title={A fast and high quality multilevel scheme for partitioning irregular graphs},
-	journal=SIAMJSC,
-	year=1998
-	,volume={20}
-	,number={1}
-	,pages={359--392}
-	}
-
- at 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}
-	}
-
- at 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}}
-
-
- at article{GouldHuScott05,
-	author={Gould, N. I. M. and Hu, Y. and Scott, J. A.},
-	title={A numerical evaluation of sparse direct solvers for the solution of large sparse, symmetric linear systems of equations},
-	journal=TOMS,
-	year={to appear}
-	}
-
- at techreport{GouldHuScott05b,
-	author={Gould, N. I. M. and Hu, Y. and Scott, J. A.},
-	title={Complete results from a numerical evaluation of sparse direct solvers for the solution of large sparse, symmetric linear systems of equations},
-	institution={CCLRC, Rutherford Appleton Laboratory},
-	number={Internal report 2005-1 (revision 1)},
-	year={2005},
-	howpublished={www.numerical.rl.ac.uk/reports/reports.shtml}
-	}
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/UserGuide.tex b/src/C/SuiteSparse/CHOLMOD/Doc/UserGuide.tex
deleted file mode 100644
index 44c62ff..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/UserGuide.tex
+++ /dev/null
@@ -1,3655 +0,0 @@
-%-------------------------------------------------------------------------------
-% The CHOLMOD/Doc/UserGuide.tex file.
-%-------------------------------------------------------------------------------
-
-\documentclass[11pt]{article}
-
-\newcommand{\m}[1]{{\bf{#1}}}       % for matrices and vectors
-\newcommand{\tr}{^{\sf T}}          % transpose
-\newcommand{\new}[1]{\overline{#1}}
-
-\topmargin 0in
-\textheight 8.5in
-\oddsidemargin 0pt
-\evensidemargin 0pt
-\textwidth 6.5in
-
-\begin{document}
-
-\author{Timothy A. Davis \\
-DrTimothyAldenDavis at gmail.com, http://www.suitesparse.com }
-\title{User Guide for CHOLMOD: a sparse Cholesky factorization and
-modification package}
-
-\date{VERSION 3.0.6, July 14, 2015}
-\maketitle
-
-%-------------------------------------------------------------------------------
-\begin{abstract}
-    CHOLMOD\footnote{CHOLMOD is short for CHOLesky MODification,
-    since a key feature of the package is its ability to update/downdate
-    a sparse Cholesky factorization}
-    is a set of routines for factorizing sparse symmetric positive
-    definite matrices of the form $\m{A}$ or $\m{AA}\tr$, updating/downdating
-    a sparse Cholesky factorization, solving linear systems, updating/downdating
-    the solution to the triangular system $\m{Lx}=\m{b}$, and many other sparse
-    matrix functions for both symmetric and unsymmetric matrices.
-    Its supernodal Cholesky factorization
-    relies on LAPACK and the Level-3 BLAS, and obtains a substantial fraction
-    of the peak performance of the BLAS.  Both real and complex matrices
-    are supported.  
-    It also includes a non-supernodal $\m{LDL}^T$ factorization method
-    that can factorize symmetric indefinite matrices if all of their
-    leading submatrices are well-conditioned ($\m{D}$ is diagonal).
-    CHOLMOD is written in ANSI/ISO C, with both
-    C and MATLAB interfaces.  This code works on Microsoft Windows and many versions
-    of Unix and Linux.
-\end{abstract}
-%-------------------------------------------------------------------------------
-
-CHOLMOD Copyright\copyright 2005-2015 by Timothy A. Davis.  Portions are also
-copyrighted by William W. Hager (the {\tt Modify} Module),
-and the University of Florida (the {\tt Partition} and {\tt Core} Modules).
-All Rights Reserved.  Some of CHOLMOD's Modules are distributed under the GNU
-General Public License, and others under the GNU Lesser General Public License.
-Refer to each Module for details.
-CHOLMOD is also available under other licenses that permit its use in
-proprietary applications; contact the authors for details.
-See http://www.suitesparse.com for the code and all documentation,
-including this User Guide.
-
-\newpage
-\tableofcontents
-
-%-------------------------------------------------------------------------------
-\newpage \section{Overview}
-%-------------------------------------------------------------------------------
-
-CHOLMOD is a set of ANSI C routines for solving systems of linear
-equations, $\m{Ax}=\m{b}$, when $\m{A}$ is sparse and symmetric positive definite,
-and $\m{x}$ and $\m{b}$ can be either sparse or dense.\footnote{Some support
-is provided for symmetric indefinite matrices.}
-Complex matrices are supported, in two different formats.
-CHOLMOD includes high-performance left-looking supernodal factorization
-and solve methods \cite{NgPeyton91b},
-based on LAPACK \cite{LAPACK} and the BLAS \cite{ACM679a}.
-After a matrix is factorized, its factors can be updated or downdated using
-the techniques described by Davis and Hager
-in \cite{DavisHager99,DavisHager01,DavisHager05}.
-Many additional sparse matrix operations are provided, for both
-symmetric and unsymmetric matrices (square or rectangular), including
-sparse matrix multiply, add, transpose, permutation, scaling,
-norm, concatenation, sub-matrix access, and converting to alternate data structures.
-Interfaces to many ordering methods are provided, including minimum degree
-(AMD \cite{AmestoyDavisDuff96,AmestoyDavisDuff03},
-COLAMD \cite{DavisGilbertLarimoreNg00_algo,DavisGilbertLarimoreNg00}),
-constrained minimum degree (CSYMAMD, CCOLAMD, CAMD), and
-graph-partitioning-based nested dissection (METIS \cite{KarypisKumar98}).
-Most of its operations are available within MATLAB via mexFunction interfaces.
-
-    CHOLMOD also includes a non-supernodal $\m{LDL}^T$ factorization method
-    that can factorize symmetric indefinite matrices if all of their
-    leading submatrices are well-conditioned ($\m{D}$ is diagonal).
-
-A pair of articles on CHOLMOD has been submitted to the ACM Transactions
-on Mathematical Software:
-\cite{ChenDavisHagerRajamanickam06,DavisHager06}.
-
-CHOLMOD 1.0 replaces {\tt chol} (the sparse case), {\tt symbfact}, and {\tt etree}
-in MATLAB 7.2 (R2006a), and is used for {\tt x=A}$\backslash${\tt b}
-when {\tt A} is symmetric positive definite \cite{GilbertMolerSchreiber}.
-It will replace {\tt sparse} in a future version of MATLAB.
-
-The C-callable CHOLMOD library consists of 133 user-callable routines and one
-include file.  Each routine comes in two versions, one for {\tt int} integers
-and another for {\tt long}.  Many of the routines can support either real or
-complex matrices, simply by passing a matrix of the appropriate type.
-
-Nick Gould, Yifan Hu, and Jennifer Scott have independently tested CHOLMOD's
-performance, comparing it with nearly a dozen or so other solvers
-\cite{GouldHuScott05,GouldHuScott05b}.  Its performance was quite competitive.
-
-%-------------------------------------------------------------------------------
-\newpage \section{Primary routines and data structures}
-%-------------------------------------------------------------------------------
-
-Five primary CHOLMOD routines are required to factorize $\m{A}$ or $\m{AA}\tr$
-and solve the related system $\m{Ax}=\m{b}$ or $\m{AA}\tr\m{x}=\m{b}$,
-for either the real or complex cases:
-\begin{enumerate}
-\item {\tt cholmod\_start}:
-    This must be the first call to CHOLMOD.
-
-\item {\tt cholmod\_analyze}:
-    Finds a fill-reducing ordering, and performs the symbolic factorization,
-    either simplicial (non-supernodal) or supernodal.
-
-\item {\tt cholmod\_factorize}:
-    Numerical factorization, either simplicial or supernodal, $\m{LL}\tr$ or $\m{LDL}\tr$
-    using either the symbolic factorization from {\tt cholmod\_analyze} or the numerical
-    factorization from a prior call to {\tt cholmod\_factorize}.
-
-\item {\tt cholmod\_solve}:
-    Solves $\m{Ax}=\m{b}$, or many other related systems, where $\m{x}$ and
-    $\m{b}$ are dense matrices.  The {\tt cholmod\_spsolve} routine handles
-    the sparse case.  Any mixture of real and complex $\m{A}$ and $\m{b}$ are
-    allowed.
-
-\item {\tt cholmod\_finish}:
-    This must be the last call to CHOLMOD.
-\end{enumerate}
-
-Additional routines are also required to create and destroy
-the matrices $\m{A}$, $\m{x}$, $\m{b}$, and the $\m{LL}\tr$ or $\m{LDL}\tr$ factorization.
-CHOLMOD has five kinds of data structures, referred to as objects and implemented
-as pointers to {\tt struct}'s:
-
-\begin{enumerate}
-\item {\tt cholmod\_common}:  parameter settings, statistics, and workspace
-    used internally by CHOLMOD.
-    See Section~\ref{cholmod_common} for details.
-
-\item {\tt cholmod\_sparse}:  a sparse matrix in compressed-column form,
-    either pattern-only, real, complex, or ``zomplex.''  In its basic form,
-    the matrix {\tt A} contains:
-    \begin{itemize}
-	\item {\tt A->p}, an integer array of size {\tt A->ncol+1}.
-	\item {\tt A->i}, an integer array of size {\tt A->nzmax}.
-	\item {\tt A->x}, a {\tt double} array of size {\tt A->nzmax} or twice that for the complex case.
-	    This is compatible with the Fortran and ANSI C99 complex data type.
-	\item {\tt A->z}, a {\tt double} array of size {\tt A->nzmax} if {\tt A} is zomplex.
-	    A zomplex matrix has a {\tt z} array, thus the name.
-	    This is compatible with the MATLAB representation of complex matrices.
-    \end{itemize}
-    For all four types of matrices, the row indices of entries of column {\tt j}
-    are located in {\tt A->i [A->p [j] ... A->p [j+1]-1]}.
-    For a real matrix, the corresponding numerical values are in {\tt A->x} at the same location.
-    For a complex matrix, the entry whose row index is {\tt A->i [p]} is contained in
-	{\tt A->x [2*p]} (the real part) and {\tt A->x [2*p+1]} (the imaginary part).
-    For a zomplex matrix, the real part is in {\tt A->x [p]} and imaginary part is in {\tt A->z [p]}.
-    See Section~\ref{cholmod_sparse} for more details.
-
-\item {\tt cholmod\_factor}:
-    A symbolic or numeric factorization, either real, complex, or zomplex.
-    It can be either an $\m{LL}\tr$ or $\m{LDL}\tr$ factorization, and either
-    simplicial or supernodal.  You will normally not need to examine its contents.
-    See Section~\ref{cholmod_factor} for more details.
-
-\item {\tt cholmod\_dense}:
-    A dense matrix, either real, complex or zomplex, in column-major order.
-    This differs from the row-major convention used in C.  A dense matrix {\tt X} contains
-    \begin{itemize}
-	\item {\tt X->x}, a double array of size {\tt X->nzmax} or twice that for the complex case.
-	\item {\tt X->z}, a double array of size {\tt X->nzmax} if {\tt X} is zomplex.
-    \end{itemize}
-    For a real dense matrix $x_{ij}$ is {\tt X->x [i+j*d]} where {\tt d = X->d} is the leading dimension of {\tt X}.
-    For a complex dense matrix, the real part of $x_{ij}$ is {\tt X->x [2*(i+j*d)]} and the imaginary part is {\tt X->x [2*(i+j*d)+1]}.
-    For a zomplex dense matrix, the real part of $x_{ij}$ is {\tt X->x [i+j*d]} and the imaginary part is {\tt X->z [i+j*d]}.
-    Real and complex dense matrices can be passed to LAPACK and the BLAS.
-    See Section~\ref{cholmod_dense} for more details.
-
-\item {\tt cholmod\_triplet}:
-    CHOLMOD's sparse matrix ({\tt cholmod\_sparse}) is the primary input for nearly all CHOLMOD
-    routines, but it can be difficult for the user to construct.
-    A simpler method of creating a sparse matrix is to first create a {\tt cholmod\_triplet} matrix,
-    and then convert it to a {\tt cholmod\_sparse} matrix via
-    the {\tt cholmod\_triplet\_to\_sparse} routine.
-    In its basic form, the triplet matrix {\tt T} contains
-    \begin{itemize}
-	\item {\tt T->i} and {\tt T->j}, integer arrays of size {\tt T->nzmax}.
-	\item {\tt T->x}, a double array of size {\tt T->nzmax} or twice that for the complex case.
-	\item {\tt T->z}, a double array of size {\tt T->nzmax} if {\tt T} is zomplex.
-    \end{itemize}
-    The {\tt k}th entry in the data structure has row index
-    {\tt T->i [k]} and column index {\tt T->j [k]}.
-    For a real triplet matrix, its numerical value is {\tt T->x [k]}.
-    For a complex triplet matrix, its real part is {\tt T->x [2*k]} and its imaginary part is {\tt T->x [2*k+1]}.
-    For a zomplex matrix, the real part is {\tt T->x [k]} and imaginary part is {\tt T->z [k]}.
-    The entries can be in any order, and duplicates are permitted.
-    See Section~\ref{cholmod_triplet} for more details.
-
-\end{enumerate}
-
-Each of the five objects has a routine in CHOLMOD to create and destroy it.
-CHOLMOD provides many other operations on these objects as well.
-A few of the most important ones are illustrated in the sample program in the
-next section.
-
-%-------------------------------------------------------------------------------
-\newpage \section{Simple example program}
-%-------------------------------------------------------------------------------
-
-\input{_simple.tex}
-The {\tt Demo/cholmod\_simple.c} program illustrates the
-basic usage of CHOLMOD.  It reads a triplet matrix from a file
-(in Matrix Market format), converts it into a sparse matrix,
-creates a linear system, solves it, and prints the norm of the residual.
-
-See the {\tt CHOLMOD/Demo/cholmod\_demo.c} program for a more elaborate
-example, and \newline
-{\tt CHOLMOD/Demo/cholmod\_l\_demo.c} for its {\tt long} integer version.
-
-%-------------------------------------------------------------------------------
-\newpage \section{Installation of the C-callable library}
-\label{Install}
-%-------------------------------------------------------------------------------
-
-CHOLMOD requires a suite of external packages, many of which are distributed
-along with CHOLMOD, but three of which are not.  Those included with CHOLMOD are:
-\begin{itemize}
-\item AMD: an approximate minimum degree ordering algorithm,
-    by Tim Davis, Patrick Amestoy, and Iain Duff
-    \cite{AmestoyDavisDuff96,AmestoyDavisDuff03}.
-\item COLAMD: an approximate column minimum degree ordering algorithm,
-    by Tim Davis, Stefan Larimore, John Gilbert, and Esmond Ng
-    \cite{DavisGilbertLarimoreNg00_algo,DavisGilbertLarimoreNg00}.
-\item CCOLAMD: a constrained approximate column minimum degree ordering
-    algorithm,
-    by Tim Davis and Siva Rajamanickam, based directly on COLAMD.
-    This package is not required if CHOLMOD is compiled with the
-    {\tt -DNCAMD} flag.
-\item CAMD: a constrained approximate minimum degree ordering
-    algorithm,
-    by Tim Davis and Yanqing Chen, based directly on AMD.
-    This package is not required if CHOLMOD is compiled with the
-    {\tt -DNCAMD} flag.
-\item {\tt SuiteSparse\_config}:
-    a single place where all sparse matrix packages authored
-    or co-authored by Davis are configured.  Also includes a version of the
-    {\tt xerbla} routine for the BLAS.
-\end{itemize}
-
-Three other packages are required for optimal performance:
-\begin{itemize}
-\item {\tt METIS 4.0.1}: a graph partitioning package by George Karypis,
-    Univ. of Minnesota.  Not needed if {\tt -DNPARTITION} is used.
-    See http://www-users.cs.umn.edu/$\sim$karypis/metis.
-\item BLAS: the Basic Linear Algebra Subprograms.
-    Not needed if {\tt -DNSUPERNODAL} is used.
-    See http://www.netlib.org for the reference BLAS (not meant for production
-    use).  For Kazushige Goto's optimized BLAS (highly recommended for CHOLMOD)
-    see \newline
-    http://www.tacc.utexas.edu/$\sim$kgoto/ or
-    http://www.cs.utexas.edu/users/flame/goto/.
-    I recommend that you avoid the Intel MKL BLAS; one recent
-    version returns NaN's, where both the Goto BLAS and the standard
-    Fortran reference BLAS return the correct answer.
-    See {\tt CHOLMOD/README} for more information.
-\item LAPACK: the Basic Linear Algebra Subprograms.
-    Not needed if {\tt -DNSUPERNODAL} is used.
-    See http://www.netlib.org.
-\item CUDA BLAS:  CHOLMOD can exploit an NVIDIA GPU by using the CUDA BLAS
-    for large supernodes.  This feature is new to CHOLMOD v2.0.0.
-\end{itemize}
-
-You must first obtain and install METIS, LAPACK, and the BLAS.
-Next edit the system-dependent configurations in the
-{\tt SuiteSparse\_config/SuiteSparse\_config.mk} file.
-Sample configurations are provided
-for Linux, Macintosh, Sun Solaris, SGI IRIX, IBM AIX, and the DEC/Compaq Alpha.
-The most important configuration is the location of the BLAS, LAPACK, and METIS
-packages, since in its default configuration CHOLMOD cannot be compiled without them.
-
-\noindent
-Here are the various parameters that you can control in your
-{\tt SuiteSparse\_config/SuiteSparse\_config.mk} file:
-\begin{itemize}
-\item {\tt CC = } your C compiler, such as {\tt cc}.
-\item {\tt CF = } optimization flags, such as {\tt -O}.
-\item {\tt RANLIB = } your system's {\tt ranlib} program, if needed.
-\item {\tt ARCHIVE =} the command to create a library (such as {\tt ar}).
-\item {\tt RM =} the command to delete a file.
-\item {\tt MV =} the command to rename a 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).
-\item {\tt LIB = } basic libraries, such as {\tt -lm}.
-\item {\tt BLAS =} your BLAS library.
-\item {\tt LAPACK =} your LAPACK library.
-\item {\tt XERBLA =} a library containing the BLAS {\tt xerbla} routine, if required.
-\item {\tt METIS\_PATH =} the path to your copy of the METIS 4.0.1 source code.
-\item {\tt METIS =} your METIS library.
-\item {\tt GPU\_CONFIG = } configuration settings specific to the CUDA BLAS.
-    To enable the CUDA BLAS, use {\tt GPU\_CONFIG = -DGPU\_BLAS
-    -I\$(GPU\_BLAS\_PACK)/include}, and set
-    {\tt GPU\_BLAS\_PATH =} to your CUDA library installation path.
-    Then include {\tt \$(GPU\_CONFIG)} as one of the settings for
-    {\tt CHOLMOD\_CONFIG}.  See the {\tt SuiteSparse\_config.mk}
-    file for details.
-\item {\tt CHOLMOD\_CONFIG = } configuration settings specific to CHOLMOD.
-\end{itemize}
-
-\noindent
-CHOLMOD's specific settings are given by the {\tt CHOLMOD\_CONFIG} string:
-\begin{itemize}
-\item {\tt -DNCHECK}:	    do not include the Check module.	   License: GNU LGPL.
-\item {\tt -DNCHOLESKY}:    do not include the Cholesky module.	   License: GNU LGPL.
-\item {\tt -DNPARTITION}:   do not include the interface to METIS in
-the Partition module.   License: GNU LGPL.
-\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.
-\item {\tt -D'LONGBLAS=long'} or {\tt -DLONGBLAS='long long'}
-			    defines the integers used by LAPACK and the BLAS (defaults to {\tt int}).
-\item {\tt -DNSUNPERF}:	    for Solaris only.  If defined, do not use the Sun Performance Library.
-\item {\tt -DNLARGEFILE}:   CHOLMOD now assumes support for large files (2GB or
-larger).  If this causes problems, you can compile CHOLMOD with -DNLARGEFILE.
-To use large files, you should {\tt \#include "cholmod.h"} (or at least
-{\tt \#include "cholmod\_io64.h"}) before any other {\tt \#include} statements,
-in your application that uses CHOLMOD.  You may need to use {\tt fopen64}
-to create a file pointer to pass to CHOLMOD, if you are using a non-gcc
-compiler.
-\end{itemize}
-
-Type {\tt make} in the {\tt CHOLMOD} directory.  The AMD,
-COLAMD, CAMD, CCOLAMD, and {\tt CHOLMOD} libraries will be compiled,
-as will the C version of the null-output {\tt xerbla} routine in case you need it.
-No Fortran compiler is required in this case.  A short demo program will
-be compiled and tested on a few matrices.  The residuals should all be small.
-Compare your output with the {\tt CHOLMOD/Demo/make.out} file.
-
-CHOLMOD is now ready for use in your own applications.  You must link
-your programs with the
-{\tt CHOLMOD/Lib/libcholmod.a},
-{\tt AMD/Lib/libamd.a},
-{\tt COLAMD/libcolamd.a},
-LAPACK,
-and
-BLAS libraries,
-as well as the {\tt xerbla} library if you need it
-({\tt SuiteSparse\_config/xerlib/libcerbla.a} for the C version or
-\newline
- {\tt SuiteSparse\_config/xerlib/libxerbla.a} for the Fortran version).
-Unless you use {\tt -DNPARTITION}, you must also link with
-{\tt metis-4.0/libmetis.a}.
-Unless {\tt -DNCAMD} is present at compile time,
-you must link with {\tt CAMD/libcamd.a}, and {\tt CCOLAMD/libccolamd.a}.
-Your compiler needs to know the location of the CHOLMOD {\tt Include} directory,
-so that it can find the {\tt cholmod.h} include file, by
-adding the {\tt -ICHOLMOD/Include} to your C compiler options
-(modified appropriately to reflect the location of your copy of CHOLMOD).
-
-%-------------------------------------------------------------------------------
-\newpage \section{Using CHOLMOD in MATLAB}
-%-------------------------------------------------------------------------------
-
-CHOLMOD includes a set of m-files and mexFunctions in the CHOLMOD/MATLAB
-directory.  The following functions are provided:
-
-\vspace{0.1in}
-\begin{tabular}{ll}
-\hline
-{\tt analyze}	    & order and analyze a matrix \\
-{\tt bisect}	    & find a node separator \\
-{\tt chol2}	    & same as {\tt chol} \\
-{\tt cholmod2}	    & same as {\tt x=A}$\backslash${\tt b} if {\tt A} is symmetric positive definite \\
-{\tt cholmod\_demo} & a short demo program \\
-{\tt cholmod\_make} & compiles CHOLMOD for use in MATLAB \\
-{\tt etree2}	    & same as {\tt etree} \\
-{\tt graph\_demo}   & graph partitioning demo \\
-{\tt lchol}	    & {\tt L*L'} factorization \\
-{\tt ldlchol}	    & {\tt L*D*L'} factorization \\
-{\tt ldl\_normest}  & estimate {\tt norm(A-L*D*L')} \\
-{\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 \\
-{\tt nesdis}	    & CHOLMOD's nested dissection ordering \\
-{\tt resymbol}	    & recomputes the symbolic factorization \\
-{\tt sdmult}	    & {\tt S*F} where {\tt S} is sparse and {\tt F} is dense \\
-{\tt spsym}	    & determine symmetry \\
-{\tt sparse2}	    & same as {\tt sparse} \\
-{\tt symbfact2}	    & same as {\tt symbfact} \\
-\hline
-\end{tabular}
-
-\vspace{0.1in}\noindent
-Each function is described in the next sections.
-
-\newpage
-\subsection{{\tt analyze}: order and analyze}					\input{_analyze_m.tex}
-\subsection{{\tt bisect}: find a node separator}				\input{_bisect_m.tex}
-\subsection{{\tt chol2}: same as {\tt chol}}					\input{_chol2_m.tex}
-\newpage
-\subsection{{\tt cholmod2}: supernodal backslash}				\input{_cholmod2_m.tex}
-\newpage
-\subsection{{\tt cholmod\_demo}: a short demo program}				\input{_cholmod_demo_m.tex}
-\subsection{{\tt cholmod\_make}: compile CHOLMOD in MATLAB}			\input{_cholmod_make_m.tex}
-\newpage
-\subsection{{\tt etree2}: same as {\tt etree}}					\input{_etree2_m.tex}
-\newpage
-\subsection{{\tt graph\_demo}: graph partitioning demo}				\input{_graph_demo_m.tex}
-\newpage
-\subsection{{\tt lchol}: $\m{LL}\tr$ factorization}				\input{_lchol_m.tex}
-\subsection{{\tt ldlchol}: $\m{LDL}\tr$ factorization}				\input{_ldlchol_m.tex}
-\newpage
-\subsection{{\tt ldlsolve}: solve using an $\m{LDL}\tr$ factorization}		\input{_ldlsolve_m.tex}
-\subsection{{\tt ldlsplit}: split an $\m{LDL}\tr$ factorization}		\input{_ldlsplit_m.tex}
-\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
-\subsection{{\tt metis}: order with METIS}					\input{_metis_m.tex}
-\newpage
-\subsection{{\tt nesdis}: order with CHOLMOD nested dissection}			\input{_nesdis_m.tex}
-\newpage
-\subsection{{\tt resymbol}: re-do symbolic factorization}			\input{_resymbol_m.tex}
-\subsection{{\tt sdmult}: sparse matrix times dense matrix}			\input{_sdmult_m.tex}
-\newpage
-\subsection{{\tt spsym}: determine symmetry}				\input{_spsym_m.tex}
-\newpage
-\subsection{{\tt sparse2}: same as {\tt sparse}}				\input{_sparse2_m.tex}
-\newpage
-\subsection{{\tt symbfact2}: same as {\tt symbfact}}				\input{_symbfact2_m.tex}
-
-%-------------------------------------------------------------------------------
-\newpage \section{Installation for use in MATLAB}
-%-------------------------------------------------------------------------------
-
-If you wish to use METIS within CHOLMOD, you should first obtain a copy of METIS 4.0.1.
-See http://www-users.cs.umn.edu/$\sim$karypis/metis.  Place your copy
-of the {\tt metis-4.0} directory (folder, for Windows users) in the same directory
-that contains your copy of the {\tt CHOLMOD} directory. If you do not have
-METIS, however, you can still use CHOLMOD.  Some of the CHOLMOD functions will not
-be available ({\tt metis}, {\tt bisect}, and {\tt nesdis}),
-and you may experience higher fill-in for large matrices
-(particularly those arising in 3D finite-element problems) when using
-{\tt analyze}, {\tt chol2}, {\tt cholmod2}, {\tt lchol}, and {\tt ldlchol}.
-There are two methods for compiling CHOLMOD for use in MATLAB; both
-are described below.
-
-%-------------------------------------------------------------------------------
-\subsection{{\tt cholmod\_make}: compiling CHOLMOD in MATLAB}
-%-------------------------------------------------------------------------------
-
-This is the preferred method, since it allows METIS to be reconfigured to
-use the MATLAB memory-management functions instead of {\tt malloc} and {\tt free};
-this avoids the issue of METIS terminating MATLAB if it runs out of memory.
-It is also simpler for Windows users, who do not have the {\tt make}
-command (unless you obtain a copy of {\tt Cygwin}).
-
-Start MATLAB, {\tt cd} to the {\tt CHOLMOD/MATLAB} directory, and
-type {\tt cholmod\_make} in the MATLAB command window.  This will compile
-the MATLAB interfaces for AMD, COLAMD, CAMD, CCOLAMD, METIS, and CHOLMOD.
-If you do not have METIS, type {\tt cholmod\_make('')}.
-If your copy of METIS is in another location, type
-{\tt cholmod\_make ('path')} where {\tt path} is the pathname
-of your copy of the {\tt metis-4.0} directory.
-
-When METIS is compiled {\tt malloc}, {\tt free}, {\tt calloc}, and {\tt realloc}
-are redefined to the MATLAB-equivalents ({\tt mxMalloc}, ...).
-These memory-management functions safely terminate a mexFunction if they
-fail, and will free all memory allocated by the mexFunction.
-Thus, METIS will safely abort without terminating MATLAB, if it runs out
-of memory.
-The {\tt cholmod\_make} handles this redefinition without making any
-changes to your METIS source code.
-
-%-------------------------------------------------------------------------------
-\newpage \section{Using CHOLMOD with GPU acceleration}
-%-------------------------------------------------------------------------------
-
-Starting with CHOLMOD v2.0.0, it is possible to accelerate the numerical
-factorization phase of CHOLMOD using NVIDIA GPUs.  Due to the large
-computational capability of the GPUs, enabling this capability can result in
-significant performance improvements.  Similar to CPU processing, the GPU is
-better able to accelerate the dense math associated with larger supernodes.
-Hence the GPU will provide more significant performance improvements for larger
-matrices that have more, larger supernodes.
-
-In CHOLMOD v2.3.0 this GPU capability has been improved to provide a
-significant increase in performance and the interface has been expanded to make
-the use of GPUs more flexible.  CHOLMOD can take advantage of a single NVIDIA
-GPU that supports CUDA and has at least 64MB of memory.  (But substantially
-more memory, typically about 3 GB, is recommended for best performance.)
-
-Only the {\tt long} integer version of CHOLMOD can leverage GPU acceleration.
-
-%-------------------------------------------------------------------------------
-\subsection{Compiling CHOLMOD with GPU support}
-%-------------------------------------------------------------------------------
-
-In order to support GPU processing, CHOLMOD must be compiled with the
-preprocessor macro {\tt GPU\_BLAS} defined.  All GPU code is conditional upon
-this macro.  As well, the environment variable {\tt CUDA\_ROOT} must be defined
-and point to the installation of the CUDA toolkit to be used for compilation of
-CHOLMOD.  Typically this would be {\tt /usr/local/cuda}.  See {\tt
-SuiteSparse\_config\_GPU.mk} for an example of how this is done.
-
-%-------------------------------------------------------------------------------
-\subsection{Enabling GPU acceleration in CHOLMOD}
-%-------------------------------------------------------------------------------
-
-Even if compiled with GPU support, in CHOLMOD v.2.3.0, GPU processing is not
-enabled by default and must be specifically requested.  There are two ways to
-do this, either in the code calling CHOLMOD or using environment variables.
-
-The code author can specify the use of GPU processing with the {\tt
-Common->useGPU} variable.  If this is set to {\tt 1}, CHOLMOD will attempt to
-use the GPU.  If this is set to {\tt 0} the use of the GPU will be prohibited.
-If this is set to {\tt -1}, which is the default case, then the environment
-variables (following paragraph) will be queried to determine if the GPU is to
-be used.  Note that the default value of {\tt -1} is set when {\tt
-cholmod\_start(Common)} is called, so the code author must set {\tt
-Common->useGPU} after calling {\tt cholmod\_start}.
-
-Alternatively, or if it is not possible to modify the code calling CHOLMOD, GPU
-processing can invoked using the {\tt CHOLMOD\_USE\_GPU} environment variable.
-This makes it possible for any CHOLMOD user to invoke GPU processing even if
-the author of the calling program did not consider this.  The interpretation of
-the environment variable {\tt CHOLMOD\_USE\_GPU} is that if the string
-evaluates to an integer other than zero, GPU processing will be enabled.  Note
-that the setting of {\tt Common->useGPU} takes precedence and the environment
-variable {\tt CHOLMOD\_USE\_GPU} will only be queried if {\tt Common->useGPU =
--1}.
-
-Note that in either case, if GPU processing is requested, but there is no GPU
-present, CHOLMOD will continue using the CPU only.  Consequently it is always
-safe to request GPU processing.
-
-%-------------------------------------------------------------------------------
-\newpage \subsection{Adjustable parameters}
-%-------------------------------------------------------------------------------
-
-There are a number of parameters that have been added to CHOLMOD to control GPU
-processing.  All of these have appropriate defaults such that GPU processing
-can be used without any modification.  However, for any particular combination
-of CPU/GPU, better performance might be obtained by adjusting these parameters.
-
-\bigskip
-
-From {\tt t\_cholmod\_gpu.c}
-
-\begin{quote}
-  {\tt CHOLMOD\_ND\_ROW\_LIMIT} : Minimum number of rows required in a
-  descendant supernode to be eligible for GPU processing during supernode
-  assembly
-
-
-  {\tt CHOLMOD\_ND\_COL\_LIMIT} : Minimum number of columns in a descendant
-  supernode to be eligible for GPU processing during supernode assembly
-
-
-  {\tt CHOLMOD\_POTRF\_LIMIT} : Minimum number of columns in a supernode to be
-  eligible for {\tt POTRF} and {\tt TRSM} processing on the GPU
-
-
-  {\tt CHOLMOD\_GPU\_SKIP} : Number of small descendant supernodes to assembled
-  on the CPU before querying if the GPU is needs more descendant supernodes
-  queued 
-
-\end{quote}
-
-From {\tt cholmod\_core.h}
-
-\begin{quote}
-  {\tt CHOLMOD\_HOST\_SUPERNODE\_BUFFERS} : Number of buffers in which to queue
-  descendant supernodes for GPU processing
-
-\end{quote}
-
-Programatically
-
-\begin{quote}
-
-  {\tt Common->maxGpuMemBytes} : Specifies the maximum amount of memory, in
-  bytes, that CHOLMOD can allocate on the GPU.  If this parameter is not set,
-  CHOLMOD will allocate as much GPU memory as possible.  Hence, the purpose of
-  this parameter is to restrict CHOLMOD's GPU memory use so that CHOLMOD can be
-  used simultaneously with other codes that also use GPU acceleration and
-  require some amount of GPU memory.  If the specified amount of GPU memory is
-  not allocatable, CHOLMOD will allocate the available memory and continue.
-
-  {\tt Common->maxGpuMemFraction} : Entirely similar to {\tt
-  Common->maxGpuMemBytes} but with the memory specified as a fraction of total
-  GPU memory.  Note that if both {\tt maxGpuMemBytes} and {\tt
-  maxGpuMemFraction} are specified, whichever results in the minimum amount of
-  memory will be used.
-
-\end{quote}
-
-Environment variables
-
-\begin{quote}
-  {\tt CHOLMOD\_GPU\_MEM\_BYTES} : Environment variable with a meaning
-  equivalent to {\tt Common->maxGpuMemBytes}.  This will only be queried if
-  {\tt Common->useGPU = -1}.
-
-  {\tt CHOLMOD\_GPU\_MEM\_FRACTION} : Environment variable with a meaning
-  equivalent to {\tt Common->maxGpuMemFraction}.  This will only be queried if
-  {\tt Common->useGPU = -1}.
-
-\end{quote}
-
-%-------------------------------------------------------------------------------
-\newpage \section{Integer and floating-point types, and notation used}
-%-------------------------------------------------------------------------------
-
-CHOLMOD supports both {\tt int} and {\tt long} integers.  CHOLMOD
-routines with the prefix {\tt cholmod\_} use {\tt int} integers,
-{\tt cholmod\_l\_} routines use {\tt long}.  All floating-point
-values are {\tt double}.
-
-The {\tt long} integer is redefinable, via {\tt SuiteSparse\_config.h}.
-That file defines a C preprocessor token {\tt SuiteSparse\_long} which is
-{\tt long} on all systems except for Windows-64, in which case it is
-defined as {\tt \_\_int64}.  The intent is that with suitable compile-time
-switches, {\tt int} is a 32-bit integer and {\tt SuiteSparse\_long} is a 64-bit
-integer.  The term {\tt long} is used to describe the latter
-integer throughout this document (except in the prototypes).
-
-Two kinds of complex matrices are supported: complex and zomplex.
-A complex matrix is held in a manner that is compatible with the
-Fortran and ANSI C99 complex data type.  A complex array of size {\tt n}
-is a {\tt double} array {\tt x} of size {\tt 2*n}, with the real and imaginary
-parts interleaved (the real part comes first, as a {\tt double}, followed the
-imaginary part, also as a {\tt double}.  Thus, the real part of the {\tt k}th
-entry is {\tt x[2*k]} and the imaginary part is {\tt x[2*k+1]}.
-
-A zomplex matrix of size {\tt n} stores its real part in one
-{\tt double} array of size {\tt n} called {\tt x} and its imaginary part
-in another {\tt double} array of size {\tt n} called {\tt z} (thus the
-name ``zomplex'').  This also how MATLAB stores its complex matrices.
-The real part of the {\tt k}th entry is {\tt x[k]} and the imaginary part is
-{\tt z[k]}.
-
-Unlike {\tt UMFPACK}, the same routine name in CHOLMOD is used for pattern-only,
-real, complex, and zomplex matrices.  For example, the statement
-\begin{verbatim}
-    C = cholmod_copy_sparse (A, &Common) ;
-\end{verbatim}
-creates a copy of a pattern, real, complex, or zomplex sparse matrix {\tt A}.
-The xtype (pattern, real, complex, or zomplex) of the resulting sparse matrix {\tt C}
-is the same as {\tt A} (a pattern-only sparse matrix contains no floating-point
-values).  In the above case, {\tt C} and {\tt A} use {\tt int} integers.
-For {\tt long} integers, the statement would become:
-\begin{verbatim}
-    C = cholmod_l_copy_sparse (A, &Common) ;
-\end{verbatim}
-The last parameter of all CHOLMOD routines is always {\tt \&Common},
-a pointer to the
-{\tt cholmod\_common} object, which contains parameters, statistics,
-and workspace used throughout CHOLMOD.
-
-The {\tt xtype} of a CHOLMOD object (sparse matrix, triplet matrix, dense
-matrix, or factorization) determines whether it is pattern-only,
-real, complex, or zomplex.
-
-The names of the {\tt int} versions are primarily used in this document.
-To obtain the name of the {\tt long} version of the same routine, simply
-replace {\tt cholmod\_} with {\tt cholmod\_l\_}.
-
-MATLAB matrix notation is used throughout this document and in
-the comments in the CHOLMOD code itself.  If you are not familiar with
-MATLAB, here is a short introduction to the notation, and a few
-minor variations used in CHOLMOD:
-
-\begin{itemize}
-    \item {\tt C=A+B} and {\tt C=A*B}, respectively are a matrix add and multiply if both
-	{\tt A} and {\tt B} are matrices of appropriate size.  If {\tt A} is
-	a scalar, then it is added to or multiplied with every entry in {\tt B}.
-    \item {\tt a:b} where {\tt a} and {\tt b} are integers refers to the
-	sequence {\tt a}, {\tt a+1}, ... {\tt b}.
-    \item {\tt [A B]} and {\tt [A,B]} are the horizontal concatenation of {\tt A} and {\tt B}.
-    \item {\tt [A;B]} is the vertical concatenation of {\tt A} and {\tt B}.
-    \item {\tt A(i,j)} can refer either to a scalar or a submatrix.
-	For example: \newline
-	\vspace{0.05in}
-	\begin{tabular}{ll}
-	\hline
-	{\tt A(1,1)} & a scalar. \\
-	{\tt A(:,j)} & column {\tt j} of {\tt A}. \\
-	{\tt A(i,:)} & row {\tt i} of {\tt A}. \\
-	{\tt A([1 2], [1 2])} & a 2-by-2 matrix containing the 2-by-2 leading minor of {\tt A}. \\
-	\hline
-	\end{tabular} \newline
-	\vspace{0.1in}
-	If {\tt p} is a permutation of {\tt 1:n}, and {\tt A} is {\tt n}-by-{\tt n},
-	then {\tt A(p,p)} corresponds to the permuted matrix $\m{PAP}\tr$.
-    \item {\tt tril(A)} is the lower triangular part of {\tt A}, including the diagonal.
-    \item {\tt tril(A,k)} is the lower triangular part of {\tt A}, including entries
-	on and below the $k$th diagonal.
-    \item {\tt triu(A)} is the upper triangular part of {\tt A}, including the diagonal.
-    \item {\tt triu(A,k)} is the upper triangular part of {\tt A}, including entries
-	on and above the $k$th diagonal.
-    \item {\tt size(A)} returns the dimensions of {\tt A}.
-    \item {\tt find(x)} if {\tt x} is a vector returns a list of indices {\tt i}
-	for which {\tt x(i)} is nonzero.
-    \item {\tt A'} is the transpose of {\tt A} if {\tt A} is real, or
-	the complex conjugate transpose if {\tt A} is complex.
-    \item {\tt A.'} is the array transpose of {\tt A}.
-    \item {\tt diag(A)} is the diagonal of {\tt A} if {\tt A} is a matrix.
-    \item {\tt C=diag(s)} is a diagonal matrix if {\tt s} is a vector,
-	with the values of {\tt s} on the diagonal of {\tt C}.
-    \item {\tt S=spones(A)} returns a binary matrix {\tt S} with the
-	same nonzero pattern of {\tt A}.
-    \item {\tt nnz(A)} is the number of nonzero entries in {\tt A}.
-\end{itemize}
-
-\noindent Variations to MATLAB notation used in this document:
-\begin{itemize}
-    \item CHOLMOD uses 0-based notation (the first entry in the matrix is
-	{\tt A(0,0)}).  MATLAB is 1-based.  The context is usually clear.
-    \item {\tt I} is the identity matrix.
-    \item {\tt A(:,f)}, where {\tt f} is a set of columns, is interpreted
-	differently in CHOLMOD, but just for the set named {\tt f}.
-	See {\tt cholmod\_transpose\_unsym} for details.
-\end{itemize}
-
-%-------------------------------------------------------------------------------
-\newpage \section{The CHOLMOD Modules, objects, and functions}
-\label{Modules}
-%-------------------------------------------------------------------------------
-
-CHOLMOD contains a total of 133 {\tt int}-based routines (and the same number
-of {\tt long} routines), divided into a set of inter-related
-Modules.  Each Module contains a set of related functions.  The functions
-are divided into two types: Primary and Secondary, to reflect how a user will
-typically use CHOLMOD.  Most users will find the Primary routines to be
-sufficient to use CHOLMOD in their programs.  Each Module exists as a
-sub-directory (a folder for Windows users) within the CHOLMOD directory
-(or folder).
-
-\vspace{0.1in}
-\noindent There are seven Modules that provide user-callable routines for CHOLMOD.
-    \begin{enumerate}
-    \item {\tt Core}: basic data structures and definitions
-    \item {\tt Check}: prints/checks each of CHOLMOD's objects
-    \item {\tt Cholesky}: sparse Cholesky factorization
-    \item {\tt Modify}: sparse Cholesky update/downdate and row-add/row-delete
-    \item {\tt MatrixOps}: sparse matrix operators (add, multiply, norm, scale)
-    \item {\tt Supernodal}: supernodal sparse Cholesky factorization
-    \item {\tt Partition}: graph-partitioning-based orderings
-    \end{enumerate}
-
-\noindent Two additional Modules are required to compile the CHOLMOD library:
-    \begin{enumerate}
-    \item {\tt Include}: include files for CHOLMOD and programs that use CHOLMOD
-    \item {\tt Lib}: where the CHOLMOD library is built
-    \end{enumerate}
-
-\noindent Five additional Modules provide support functions and documentation:
-    \begin{enumerate}
-    \item {\tt Demo}: simple programs that illustrate the use of CHOLMOD
-    \item {\tt Doc}: documentation (including this document)
-    \item {\tt MATLAB}: CHOLMOD's interface to MATLAB
-    \item {\tt Tcov}: an exhaustive test coverage (requires Linux or Solaris)
-    \item {\tt Valgrind}: runs the {\tt Tcov} test under {\tt valgrind} (requires Linux)
-    \end{enumerate}
-
-The following Modules are licensed under the GNU Lesser General Public
-License: {\tt Check}, {\tt Cholesky}, {\tt Core}, and {\tt Partition}.
-The following Modules are licensed under the GNU General Public
-License: {\tt Demo}, {\tt Modify}, {\tt MatrixOps}, {\tt Supernodal},
-the {\tt MATLAB} Module (not MATLAB itself!), {\tt Tcov}, and {\tt Valgrind}.
-The files in the {\tt Include} Module are licensed according to
-their respective Modules.  The {\tt Lib} and {\tt Doc} Modules need
-no license; the compiled binaries are licensed the same as their source code.
-
-%-------------------------------------------------------------------------------
-\newpage \subsection{{\tt Core} Module: basic data structures and definitions}
-%-------------------------------------------------------------------------------
-
-CHOLMOD includes five basic objects, defined in the {\tt Core} Module.
-The {\tt Core Module} provides basic operations for these objects
-and is required by all six other CHOLMOD library Modules:
-
-\subsubsection{{\tt cholmod\_common}: parameters, statistics, and workspace}
-    You must call {\tt cholmod\_start} before calling any other
-    CHOLMOD routine, and you must call {\tt cholmod\_finish} as your
-    last call to CHOLMOD (with the exception of
-    {\tt cholmod\_print\_common} and {\tt cholmod\_check\_common}
-    in the {\tt Check} Module).
-    Once the {\tt cholmod\_common} object is initialized,
-    the user may modify CHOLMOD's parameters held in this object,
-    and obtain statistics on CHOLMOD's activity.
-
-\vspace{0.1in}
-\noindent Primary routines for the {\tt cholmod\_common} object:
-% 2
-    \begin{itemize}
-    \item {\tt cholmod\_start}: the first call to CHOLMOD.
-    \item {\tt cholmod\_finish}: the last call to CHOLMOD (frees workspace in the {\tt cholmod\_common} object).
-    \end{itemize}
-
-\noindent Secondary routines for the {\tt cholmod\_common} object:
-% 9
-    \begin{itemize}
-    \item {\tt cholmod\_defaults}: restores default parameters
-    \item {\tt cholmod\_maxrank}: determine maximum rank for update/downdate.
-    \item {\tt cholmod\_allocate\_work}: allocate workspace.
-    \item {\tt cholmod\_free\_work}: free workspace.
-    \item {\tt cholmod\_clear\_flag}: clear {\tt Flag} array.
-    \item {\tt cholmod\_error}: called when CHOLMOD encounters and error.
-    \item {\tt cholmod\_dbound}: bounds the diagonal of $\m{L}$ or $\m{D}$.
-    \item {\tt cholmod\_hypot}: compute {\tt sqrt(x*x+y*y)} accurately.
-    \item {\tt cholmod\_divcomplex}: complex divide.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\newpage \subsubsection{{\tt cholmod\_sparse}: a sparse matrix in compressed column form}
-%-------------------------------------------------------------------------------
-    A sparse matrix {\tt A} is held in compressed column form.  In the basic
-    type (``packed,'' which corresponds to how MATLAB stores its sparse
-    matrices), and {\tt nrow}-by-{\tt ncol} matrix with {\tt nzmax} entries
-    is held in three arrays: {\tt p} of size {\tt ncol+1},
-    {\tt i} of size {\tt nzmax}, and {\tt x} of size {\tt nzmax}.
-    Row indices of nonzero entries in column {\tt j} are held in
-    {\tt i [p[j] ... p[j+1]-1]}, and their corresponding numerical values
-    are held in {\tt x [p[j] ... p[j+1]-1]}.  The first column starts at
-    location zero ({\tt p[0]=0}).
-    There may be no duplicate entries.  Row indices in each column may
-    be sorted or unsorted (the {\tt A->sorted} flag must be false if
-    the columns are unsorted).  The {\tt A->stype} determines the 
-    storage mode: 0 if the matrix is unsymmetric, 1 if the matrix is
-    symmetric with just the upper triangular part stored, and -1 if
-    the matrix is symmetric with just the lower triangular part stored.
-
-    In ``unpacked'' form, an additional array {\tt nz} of size {\tt ncol}
-    is used.  The end of column {\tt j} in {\tt i} and {\tt x}
-    is given by {\tt p[j]+nz[j]}.  Columns not need be in any particular
-    order ({\tt p[0]} need not be zero), and there may be gaps between
-    the columns.
-
-\vspace{0.1in}
-\noindent Primary routines for the {\tt cholmod\_sparse} object:
-% 2
-    \begin{itemize}
-    \item {\tt cholmod\_allocate\_sparse}: allocate a sparse matrix
-    \item {\tt cholmod\_free\_sparse}: free a sparse matrix
-    \end{itemize}
-
-\noindent Secondary routines for the {\tt cholmod\_sparse} object:
-% 16
-    \begin{itemize}
-    \item {\tt cholmod\_reallocate\_sparse}: change the size (number of entries) of a sparse matrix.
-    \item {\tt cholmod\_nnz}: number of nonzeros in a sparse matrix.
-    \item {\tt cholmod\_speye}: sparse identity matrix.
-    \item {\tt cholmod\_spzeros}: sparse zero matrix.
-    \item {\tt cholmod\_transpose}: transpose a sparse matrix.
-    \item {\tt cholmod\_ptranspose}: transpose/permute a sparse matrix.
-    \item {\tt cholmod\_transpose\_unsym}: transpose/permute an unsymmetric sparse matrix.
-    \item {\tt cholmod\_transpose\_sym}: transpose/permute a symmetric sparse matrix.
-    \item {\tt cholmod\_sort}: sort row indices in each column of a sparse matrix.
-    \item {\tt cholmod\_band}: extract a band of a sparse matrix.
-    \item {\tt cholmod\_band\_inplace}: remove entries not with a band.
-    \item {\tt cholmod\_aat}: {\tt C = A*A'}.
-    \item {\tt cholmod\_copy\_sparse}: {\tt C = A}, create an exact copy of a sparse matrix.
-    \item {\tt cholmod\_copy}: {\tt C = A}, with possible change of {\tt stype}.
-    \item {\tt cholmod\_add}: {\tt C = alpha*A + beta*B}.
-    \item {\tt cholmod\_sparse\_xtype}: change the {\tt xtype} of a sparse matrix.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\newpage \subsubsection{{\tt cholmod\_factor}: a symbolic or numeric factorization}
-%-------------------------------------------------------------------------------
-
-    A factor can be in $\m{LL}\tr$ or $\m{LDL}\tr$ form, and either supernodal
-    or simplicial form.  In simplicial form, this is very much like a
-    packed or unpacked {\tt cholmod\_sparse} matrix.  In supernodal
-    form, adjacent columns with similar nonzero pattern are stored as
-    a single block (a supernode).
-
-\vspace{0.1in}
-\noindent Primary routine for the {\tt cholmod\_factor} object:
-% 1
-    \begin{itemize}
-    \item {\tt cholmod\_free\_factor}: free a factor
-    \end{itemize}
-
-\noindent Secondary routines for the {\tt cholmod\_factor} object:
-% 8
-    \begin{itemize}
-    \item {\tt cholmod\_allocate\_factor}: allocate a factor.  You will normally use {\tt cholmod\_analyze} to create a factor.
-    \item {\tt cholmod\_reallocate\_factor}: change the number of entries in a factor.
-    \item {\tt cholmod\_change\_factor}: change the type of a factor ($\m{LDL}\tr$ to $\m{LL}\tr$, supernodal to simplicial, etc.).
-    \item {\tt cholmod\_pack\_factor}: pack the columns of a factor.
-    \item {\tt cholmod\_reallocate\_column}: resize a single column of a factor.
-    \item {\tt cholmod\_factor\_to\_sparse}: create a sparse matrix copy of a factor.
-    \item {\tt cholmod\_copy\_factor}: create a copy of a factor.
-    \item {\tt cholmod\_factor\_xtype}: change the xtype of a factor.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\subsubsection{{\tt cholmod\_dense}: a dense matrix}
-%-------------------------------------------------------------------------------
-    This consists of a dense array of numerical values and its dimensions.
-
-\vspace{0.1in}
-\noindent Primary routines for the {\tt cholmod\_dense} object:
-% 2
-    \begin{itemize}
-    \item {\tt cholmod\_allocate\_dense}: allocate a dense matrix.
-    \item {\tt cholmod\_free\_dense}: free a dense matrix.
-    \end{itemize}
-
-\vspace{0.1in}
-\noindent Secondary routines for the {\tt cholmod\_dense} object:
-% 8
-    \begin{itemize}
-    \item {\tt cholmod\_zeros}: allocate a dense matrix of all zeros.
-    \item {\tt cholmod\_ones}: allocate a dense matrix of all ones.
-    \item {\tt cholmod\_eye}: allocate a dense identity matrix .
-    \item {\tt cholmod\_sparse\_to\_dense}: create a dense matrix copy of a sparse matrix.
-    \item {\tt cholmod\_dense\_to\_sparse}: create a sparse matrix copy of a dense matrix.
-    \item {\tt cholmod\_copy\_dense}: create a copy of a dense matrix.
-    \item {\tt cholmod\_copy\_dense2}: copy a dense matrix (pre-allocated).
-    \item {\tt cholmod\_dense\_xtype}: change the {\tt xtype} of a dense matrix.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\newpage \subsubsection{{\tt cholmod\_triplet}: a sparse matrix in ``triplet'' form}
-%-------------------------------------------------------------------------------
-    The {\tt cholmod\_sparse} matrix is the basic sparse matrix used in
-    CHOLMOD, but it can be difficult for the user to construct.  It also
-    does not easily support the inclusion of new entries in the matrix.
-    The {\tt cholmod\_triplet} matrix is provided to address these issues.
-    A sparse matrix in triplet form consists of three arrays of size
-    {\tt nzmax}: {\tt i}, {\tt j}, and {\tt x}, and a {\tt z} array
-    for the zomplex case.
-
-\vspace{0.1in}
-\noindent Primary routines for the {\tt cholmod\_triplet} object:
-% 3
-    \begin{itemize}
-    \item {\tt cholmod\_allocate\_triplet}: allocate a triplet matrix.
-    \item {\tt cholmod\_free\_triplet}: free a triplet matrix.
-    \item {\tt cholmod\_triplet\_to\_sparse}: create a sparse matrix copy of a triplet matrix.
-    \end{itemize}
-
-\noindent Secondary routines for the {\tt cholmod\_triplet} object:
-% 4
-    \begin{itemize}
-    \item {\tt cholmod\_reallocate\_triplet}: change the number of entries in a triplet matrix.
-    \item {\tt cholmod\_sparse\_to\_triplet}: create a triplet matrix copy of a sparse matrix.
-    \item {\tt cholmod\_copy\_triplet}: create a copy of a triplet matrix.
-    \item {\tt cholmod\_triplet\_xtype}: change the {\tt xtype} of a triplet matrix.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\subsubsection{Memory management routines}
-%-------------------------------------------------------------------------------
-    By default, CHOLMOD uses the ANSI C {\tt malloc}, {\tt free},
-    {\tt calloc}, and {\tt realloc} routines.  You may use different
-    routines by modifying function pointers in the {\tt cholmod\_common} object.
-
-\vspace{0.1in}
-\noindent Primary routines:
-% 2
-    \begin{itemize}
-    \item {\tt cholmod\_malloc}: {\tt malloc} wrapper.
-    \item {\tt cholmod\_free}: {\tt free} wrapper.
-    \end{itemize}
-
-\noindent Secondary routines:
-% 3
-    \begin{itemize}
-    \item {\tt cholmod\_calloc}: {\tt calloc} wrapper.
-    \item {\tt cholmod\_realloc}: {\tt realloc} wrapper.
-    \item {\tt cholmod\_realloc\_multiple}: {\tt realloc} wrapper for multiple objects.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\subsubsection{{\tt cholmod\_version:} Version control}
-%-------------------------------------------------------------------------------
-The {\tt cholmod\_version} function returns the current version of CHOLMOD.
-
-%-------------------------------------------------------------------------------
-\newpage \subsection{{\tt Check} Module: print/check the CHOLMOD objects}
-%-------------------------------------------------------------------------------
-    The {\tt Check} Module contains routines that check and print the five
-    basic objects in CHOLMOD, and three kinds of integer vectors (a set,
-    a permutation, and a tree).  It also provides a routine to read a sparse
-    matrix from a file in Matrix Market format (http://www.nist.gov/MatrixMarket).
-    Requires the {\tt Core} Module.
-
-\vspace{0.1in}
-\noindent Primary routines:
-% 4
-    \begin{itemize}
-    \item {\tt cholmod\_print\_common}: print the {\tt cholmod\_common} object,
-	including statistics on CHOLMOD's behavior (fill-in, flop count,
-	ordering methods used, and so on).
-    \item {\tt cholmod\_write\_sparse}: write a sparse matrix to a file
-	in Matrix Market format.
-    \item {\tt cholmod\_write\_dense}: write a sparse matrix to a file
-	in Matrix Market format.
-    \item {\tt cholmod\_read\_matrix}: read a sparse or dense matrix from a file
-	in Matrix Market format.
-    \end{itemize}
-
-\vspace{0.1in}
-\noindent Secondary routines:
-% 18
-    \begin{itemize}
-    \item {\tt cholmod\_check\_common}: check the {\tt cholmod\_common} object
-    \item {\tt cholmod\_check\_sparse}: check a sparse matrix
-    \item {\tt cholmod\_print\_sparse}: print a sparse matrix
-    \item {\tt cholmod\_check\_dense}: check a dense matrix
-    \item {\tt cholmod\_print\_dense}: print a dense matrix
-    \item {\tt cholmod\_check\_factor}: check a Cholesky factorization
-    \item {\tt cholmod\_print\_factor}: print a Cholesky factorization
-    \item {\tt cholmod\_check\_triplet}: check a triplet matrix
-    \item {\tt cholmod\_print\_triplet}: print a triplet matrix
-    \item {\tt cholmod\_check\_subset}: check a subset (integer vector in given range)
-    \item {\tt cholmod\_print\_subset}: print a subset (integer vector in given range)
-    \item {\tt cholmod\_check\_perm}: check a permutation (an integer vector)
-    \item {\tt cholmod\_print\_perm}: print a permutation (an integer vector)
-    \item {\tt cholmod\_check\_parent}: check an elimination tree (an integer vector)
-    \item {\tt cholmod\_print\_parent}: print an elimination tree (an integer vector)
-    \item {\tt cholmod\_read\_triplet}: read a triplet matrix from a file
-    \item {\tt cholmod\_read\_sparse}: read a sparse matrix from a file
-    \item {\tt cholmod\_read\_dense}: read a dense matrix from a file
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\newpage \subsection{{\tt Cholesky} Module: sparse Cholesky factorization}
-%-------------------------------------------------------------------------------
-
-The primary routines are all that a user requires to order, analyze, and
-factorize a sparse symmetric positive definite matrix $\m{A}$ (or $\m{AA}\tr$), and
-to solve $\m{Ax}=\m{b}$ (or $\m{AA}\tr\m{x}=\m{b}$).  The primary routines rely on the secondary
-routines, the {\tt Core} Module, and the AMD and COLAMD packages.  They
-make optional use of the {\tt Supernodal} and {\tt Partition} Modules, the
-METIS package, the CAMD package, and
-the CCOLAMD package.  The {\tt Cholesky} Module is
-required by the {\tt Partition} Module.
-
-\vspace{0.1in}
-\noindent Primary routines:
-% 4
-    \begin{itemize}
-    \item {\tt cholmod\_analyze}: order and analyze (simplicial or supernodal).
-    \item {\tt cholmod\_factorize}: simplicial or supernodal Cholesky factorization.
-    \item {\tt cholmod\_solve}: solve a linear system (simplicial or supernodal, dense $\m{x}$ and $\m{b}$).
-    \item {\tt cholmod\_spsolve}: solve a linear system (simplicial or supernodal, sparse $\m{x}$ and $\m{b}$ ).
-    \end{itemize}
-
-\noindent Secondary routines:
-% 15
-    \begin{itemize}
-    \item {\tt cholmod\_analyze\_p}: analyze, with user-provided permutation or $\m{f}$ set.
-    \item {\tt cholmod\_factorize\_p}: factorize, with user-provided permutation or $\m{f}$.
-    \item {\tt cholmod\_analyze\_ordering}:  analyze a permutation
-    \item {\tt cholmod\_solve2}: solve a linear system, reusing workspace.
-    \item {\tt cholmod\_etree}: find the elimination tree.
-    \item {\tt cholmod\_rowcolcounts}: compute the row/column counts of $\m{L}$.
-    \item {\tt cholmod\_amd}: order using AMD.
-    \item {\tt cholmod\_colamd}: order using COLAMD.
-    \item {\tt cholmod\_rowfac}: incremental simplicial factorization.
-    \item {\tt cholmod\_row\_subtree}: find the nonzero pattern of a row of $\m{L}$.
-    \item {\tt cholmod\_row\_lsubtree}: find the nonzero pattern of a row of $\m{L}$.
-    \item {\tt cholmod\_row\_lsubtree}: find the nonzero pattern of $\m{L}^{-1}b$.
-    \item {\tt cholmod\_resymbol}: recompute the symbolic pattern of $\m{L}$.
-    \item {\tt cholmod\_resymbol\_noperm}: recompute the symbolic pattern of $\m{L}$, no permutation.
-    \item {\tt cholmod\_postorder}: postorder a tree.
-    \item {\tt cholmod\_rcond}: compute the reciprocal condition number estimate.
-    \item {\tt cholmod\_rowfac\_mask}: for use in LPDASA only.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\newpage \subsection{{\tt Modify} Module: update/downdate a sparse Cholesky factorization}
-%-------------------------------------------------------------------------------
-
-The {\tt Modify} Module contains sparse Cholesky modification routines:
-update, downdate, row-add, and row-delete.
-It can also modify a corresponding solution to $\m{Lx}=\m{b}$ when L is modified.
-This module is most useful when applied on a Cholesky factorization computed by
-the {\tt Cholesky} module, but it does not actually require the {\tt Cholesky} module.
-The {\tt Core} module can create an identity Cholesky factorization ($\m{LDL}\tr$ where
-$\m{L}=\m{D}=\m{I}$) that can then be modified by these routines.
-Requires the {\tt Core} module.  Not required by any other CHOLMOD Module.
-
-\vspace{0.1in}
-\noindent Primary routine:
-% 1
-    \begin{itemize}
-    \item {\tt cholmod\_updown}: multiple rank update/downdate
-    \end{itemize}
-
-\noindent Secondary routines:
-% 8
-    \begin{itemize}
-    \item {\tt cholmod\_updown\_solve}: update/downdate, and modify solution to $\m{Lx=b}$
-    \item {\tt cholmod\_updown\_mark}: update/downdate, and modify solution to partial $\m{Lx=b}$
-    \item {\tt cholmod\_updown\_mask}: for use in LPDASA only.
-    \item {\tt cholmod\_rowadd}: add a row to an $\m{LDL}\tr$ factorization
-    \item {\tt cholmod\_rowadd\_solve}: add a row, and update solution to $\m{Lx=b}$
-    \item {\tt cholmod\_rowadd\_mark}: add a row, and update solution to partial $\m{Lx=b}$
-    \item {\tt cholmod\_rowdel}: delete a row from an $\m{LDL}\tr$ factorization
-    \item {\tt cholmod\_rowdel\_solve}: delete a row, and downdate $\m{Lx=b}$
-    \item {\tt cholmod\_rowdel\_mark}: delete a row, and downdate solution to partial $\m{Lx=b}$
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\subsection{{\tt MatrixOps} Module: basic sparse matrix operations}
-%-------------------------------------------------------------------------------
-
-The {\tt MatrixOps} Module provides
-basic operations on sparse and dense matrices.
-Requires the {\tt Core} module.  Not required by any other CHOLMOD module.
-In the descriptions below,
-{\tt A}, {\tt B}, and {\tt C:} are sparse matrices ({\tt cholmod\_sparse}),
-{\tt X} and {\tt Y} are dense matrices ({\tt cholmod\_dense}),
-{\tt s} is a scalar or vector, and
-{\tt alpha} {\tt beta} are scalars.
-
-% 10
-    \begin{itemize}
-    \item {\tt cholmod\_drop}: drop entries from A with absolute value $\ge$ a given tolerance.
-    \item {\tt cholmod\_norm\_dense}: {\tt s = norm (X)}, 1-norm, infinity-norm, or 2-norm
-    \item {\tt cholmod\_norm\_sparse}: {\tt s = norm (A)}, 1-norm or infinity-norm
-    \item {\tt cholmod\_horzcat}: {\tt C = [A,B]}
-    \item {\tt cholmod\_scale}: {\tt A = diag(s)*A}, {\tt A*diag(s)}, {\tt s*A} or {\tt diag(s)*A*diag(s)}.
-    \item {\tt cholmod\_sdmult}: {\tt Y = alpha*(A*X) + beta*Y} or {\tt alpha*(A'*X) + beta*Y}.
-    \item {\tt cholmod\_ssmult}: {\tt C = A*B}
-    \item {\tt cholmod\_submatrix}: {\tt C = A (i,j)}, where {\tt i} and {\tt j} are arbitrary integer vectors.
-    \item {\tt cholmod\_vertcat}: {\tt C = [A ; B]}.
-    \item {\tt cholmod\_symmetry}: determine symmetry of a matrix.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\newpage \subsection{{\tt Supernodal} Module: supernodal sparse Cholesky factorization}
-%-------------------------------------------------------------------------------
-
-The {\tt Supernodal} Module performs
-supernodal analysis, factorization, and solve.  The simplest way to use
-these routines is via the {\tt Cholesky} Module.  This Module does not provide any
-fill-reducing orderings.  It normally operates on matrices ordered by the
-{\tt Cholesky} Module.
-It does not require the {\tt Cholesky} Module itself, however.
-Requires the {\tt Core} Module, and two external packages: LAPACK and the BLAS.
-Optionally used by the {\tt Cholesky} Module.  All are secondary routines
-since these functions are more easily used via the {\tt Cholesky} Module.
-
-\vspace{0.1in}
-\noindent Secondary routines:
-% 4
-    \begin{itemize}
-    \item {\tt cholmod\_super\_symbolic}: supernodal symbolic analysis
-    \item {\tt cholmod\_super\_numeric}: supernodal numeric factorization
-    \item {\tt cholmod\_super\_lsolve}: supernodal $\m{Lx}=\m{b}$ solve
-    \item {\tt cholmod\_super\_ltsolve}: supernodal $\m{L}\tr\m{x}=\m{b}$ solve
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\subsection{{\tt Partition} Module: graph-partitioning-based orderings}
-%-------------------------------------------------------------------------------
-
-The {\tt Partition} Module provides
-graph partitioning and graph-partition-based orderings.  It includes an
-interface to CAMD, CCOLAMD, and CSYMAMD, constrained minimum degree ordering
-methods which order a matrix following constraints determined via nested
-dissection.
-Requires the {\tt Core} and {\tt Cholesky} Modules, and two packages: {\tt METIS 4.0.1}, CAMD, and CCOLAMD.
-Optionally used by the {\tt Cholesky} Module.  All are secondary routines since
-these are more easily used by the {\tt Cholesky} Module.
-
-Note that METIS does not have a version that uses {\tt long} integers.  If you try to use
-these routines (except the CAMD, CCOLAMD, and CSYMAMD interfaces)
-on a matrix that is too large, an error code will be returned.
-
-\vspace{0.1in}
-\noindent Secondary routines:
-% 8
-    \begin{itemize}
-    \item {\tt cholmod\_nested\_dissection}: CHOLMOD nested dissection ordering
-    \item {\tt cholmod\_metis}: METIS nested dissection ordering ({\tt METIS\_NodeND})
-    \item {\tt cholmod\_camd}: interface to CAMD ordering
-    \item {\tt cholmod\_ccolamd}: interface to CCOLAMD ordering
-    \item {\tt cholmod\_csymamd}: interface to CSYMAMD ordering
-    \item {\tt cholmod\_bisect}: graph partitioner (currently based on METIS)
-    \item {\tt cholmod\_metis\_bisector}: direct interface to {\tt METIS\_NodeComputeSeparator}.
-    \item {\tt cholmod\_collapse\_septree}: pruned a separator tree from
-    {\tt cholmod\_nested\_dissection}.
-    \end{itemize}
-
-%-------------------------------------------------------------------------------
-\newpage \section{CHOLMOD naming convention, parameters, and return values}
-%-------------------------------------------------------------------------------
-
-All routine names, data types, and CHOLMOD library files use the
-{\tt cholmod\_} prefix.  All macros and other {\tt \#define} statements
-visible to the user program use the {\tt CHOLMOD} prefix.
-The {\tt cholmod.h} file must be included in user programs that use CHOLMOD:
-
-{\footnotesize
-\begin{verbatim}
-        #include "cholmod.h"
-\end{verbatim}
-}
-
-\noindent
-All CHOLMOD routines (in all modules) use the following protocol for return values:
-\begin{itemize}
-\item {\tt int}: {\tt TRUE} (1) if successful, or {\tt FALSE} (0) otherwise. (exception: {\tt cholmod\_divcomplex}).
-\item {\tt long}: a value $\ge 0$ if successful, or -1 otherwise.
-\item {\tt double}: a value $\ge 0$ if successful, or -1 otherwise.
-\item {\tt size\_t}: a value $>$ 0 if successful, or 0 otherwise.
-\item {\tt void *}: a non-{\tt NULL} pointer to newly allocated memory if successful, or {\tt NULL} otherwise.
-\item {\tt cholmod\_sparse *}:  a non-{\tt NULL} pointer to a newly allocated sparse matrix if successful, or {\tt NULL} otherwise.
-\item {\tt cholmod\_factor *}:  a non-{\tt NULL} pointer to a newly allocated factor if successful, or {\tt NULL} otherwise.
-\item {\tt cholmod\_triplet *}: a non-{\tt NULL} pointer to a newly allocated triplet matrix if successful, or {\tt NULL} otherwise.
-\item {\tt cholmod\_dense *}:   a non-{\tt NULL} pointer to a newly allocated dense matrix if successful, or {\tt NULL} otherwise.
-\end{itemize}
-
-{\tt TRUE} and {\tt FALSE} are not defined in {\tt cholmod.h},
-since they may conflict with the user program.  A routine that described
-here returning {\tt TRUE} or {\tt FALSE} returns 1 or 0, respectively.
-Any {\tt TRUE}/{\tt FALSE} parameter is true if nonzero, false if zero.
-
-\noindent
-Input, output, and input/output parameters:
-\begin{itemize}
-\item Input parameters appear first in the parameter lists of all CHOLMOD routines.
-They are not modified by CHOLMOD.
-\item Input/output parameters (except for {\tt Common}) appear next.
-They must be defined on input, and are modified on output.
-\item Output parameters are listed next.  If they are pointers, they must
-point to allocated space on input, but their contents are not defined on input.
-\item Workspace parameters appear next.  They are used in only two routines in the Supernodal module.
-\item The {\tt cholmod\_common *Common} parameter always appears as the last parameter
-(with two exceptions: {\tt cholmod\_hypot} and {\tt cholmod\_divcomplex}).
-It is always an input/output parameter.
-\end{itemize}
-
-A floating-point scalar is passed to CHOLMOD as a pointer to a {\tt double}
-array of size two.  The first entry in this array is the real part of the
-scalar, and the second entry is the imaginary part.  The imaginary part is
-only accessed if the other inputs are complex or zomplex.  In some cases
-the imaginary part is always ignored ({\tt cholmod\_factor\_p}, for example).
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Core} Module: {\tt cholmod\_common} object}
-\label{cholmod_common}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{Constant definitions}
-%---------------------------------------
-
-\input{_defn.tex}
-These definitions are used within the {\tt cholmod\_common} object,
-called {\tt Common} both here and throughout the code.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_common}: parameters, statistics, and workspace}
-%---------------------------------------
-
-\input{_common.tex}
-The {\tt cholmod\_common Common} object contains parameters, statistics, and
-workspace used within CHOLMOD.  The first call to CHOLMOD must be
-{\tt cholmod\_start}, which initializes this object.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_start}: start CHOLMOD}
-%---------------------------------------
-
-\input{_start.tex}
-Sets the default parameters, clears the statistics, and initializes all
-workspace pointers to {\tt NULL}.  The {\tt int}/{\tt long} type
-is set in {\tt Common->itype}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_finish}: finish CHOLMOD}
-%---------------------------------------
-
-\input{_finish.tex}
-This must be the last call to CHOLMOD.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_defaults}: set default parameters}
-%---------------------------------------
-
-\input{_defaults.tex}
-Sets the default parameters.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_maxrank}: maximum update/downdate rank}
-%---------------------------------------
-
-\input{_maxrank.tex}
-Returns the maximum rank for an update/downdate.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_allocate\_work}: allocate workspace}
-%---------------------------------------
-
-\input{_allocate_work.tex}
-Allocates workspace in {\tt Common}.  The workspace consists
-of the integer {\tt Head}, {\tt Flag}, and {\tt Iwork} arrays,
-of size {\tt nrow+1}, {\tt nrow}, and {\tt iworksize},
-respectively, and a {\tt double} array {\tt Xwork} of size
-{\tt xworksize}.  The {\tt Head} array is normally equal to -1
-when it is cleared.  If the {\tt Flag} array is cleared,
-all entries are less than {\tt Common->mark}.  The {\tt Iwork} array is
-not kept in any particular state.
-The integer type is {\tt int} or {\tt long}, depending
-on whether the {\tt cholmod\_} or {\tt cholmod\_l\_} routines
-are used.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_free\_work}: free workspace}
-%---------------------------------------
-
-\input{_free_work.tex}
-Frees the workspace in {\tt Common}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_clear\_flag}: clear Flag array}
-%---------------------------------------
-
-\input{_clear_flag.tex}
-Increments {\tt Common->mark} so that the {\tt Flag} array is now cleared.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_error}: report error}
-%---------------------------------------
-
-\input{_error.tex}
-This routine is called when CHOLMOD encounters an error.
-It prints a message (if printing is enabled), sets
-{\tt Common->status}.  It then calls the
-user error handler routine {\tt Common->error\_handler},
-if it is not {\tt NULL}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_dbound}: bound diagonal of $\m{L}$}
-%---------------------------------------
-
-\input{_dbound.tex}
-Ensures that entries on the diagonal of $\m{L}$ for an $\m{LL}\tr$
-factorization are greater than or equal to {\tt Common->dbound}.
-For an $\m{LDL}\tr$ factorization, it ensures that the magnitude
-of the entries of $\m{D}$ are greater than or equal to {\tt Common->dbound}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_hypot}: {\tt sqrt(x*x+y*y)}}
-%---------------------------------------
-
-\input{_hypot.tex}
-Computes the magnitude of a complex number.
-This routine is the default value for the {\tt Common->hypotenuse} function pointer.
-See also {\tt hypot}, in the standard {\tt math.h} header.  If you have
-the ANSI C99 {\tt hypot}, you can use {\tt Common->hypotenuse = hypot}.
-The {\tt cholmod\_hypot} routine is provided in case you are using the
-ANSI C89 standard, which does not have {\tt hypot}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_divcomplex}: complex divide}
-%---------------------------------------
-
-\input{_divcomplex.tex}
-Divides two complex numbers.  It returns 1 if a divide-by-zero occurred, or 0 otherwise.
-This routine is the default value for the {\tt Common->complex\_divide} function pointer.
-This return value is the single exception to the CHOLMOD rule that states all {\tt int} return
-values are {\tt TRUE} if successful or {\tt FALSE} otherwise.
-The exception is made to match the return value of a different complex divide routine
-that is not a part of CHOLMOD, but can be used via the function pointer.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Core} Module: {\tt cholmod\_sparse} object}
-\label{cholmod_sparse}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_sparse}: compressed-column sparse matrix}
-%---------------------------------------
-
-\input{_sparse.tex}
-Stores a sparse matrix in compressed-column form.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_allocate\_sparse}: allocate sparse matrix}
-%---------------------------------------
-
-\input{_allocate_sparse.tex}
-Allocates a sparse matrix.  {\tt A->i}, {\tt A->x}, and {\tt A->z} are not initialized.
-The matrix returned is all zero, but it contains space enough for {\tt nzmax} entries.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_free\_sparse}: free sparse matrix}
-%---------------------------------------
-
-\input{_free_sparse.tex}
-Frees a sparse matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_reallocate\_sparse}: reallocate sparse matrix}
-%---------------------------------------
-
-\input{_reallocate_sparse.tex}
-Reallocates a sparse matrix, so that it can contain {\tt nznew} entries.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_nnz}: number of entries in sparse matrix}
-%---------------------------------------
-
-\input{_nnz.tex}
-Returns the number of entries in a sparse matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_speye}: sparse identity matrix}
-%---------------------------------------
-
-\input{_speye.tex}
-Returns the sparse identity matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_spzeros}: sparse zero matrix}
-%---------------------------------------
-
-\input{_spzeros.tex}
-Returns the sparse zero matrix.  This is another name
-for {\tt cholmod\_allocate\_sparse}, but with fewer parameters
-(the matrix is packed, sorted, and unsymmetric).
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_transpose}: transpose sparse matrix}
-%---------------------------------------
-
-\input{_transpose.tex}
-Returns the transpose or complex conjugate transpose of a sparse matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_ptranspose}: transpose/permute sparse matrix}
-%---------------------------------------
-
-\input{_ptranspose.tex}
-Returns {\tt A'} or {\tt A(p,p)'} if {\tt A} is symmetric.
-Returns {\tt A'}, {\tt A(:,f)'}, or {\tt A(p,f)'} if {\tt A} is unsymmetric.
-See {\tt cholmod\_transpose\_unsym} for a discussion of how {\tt f} is used;
-this usage deviates from the MATLAB notation.
-Can also return the array transpose.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_sort}: sort columns of a sparse matrix}
-%---------------------------------------
-
-\input{_sort.tex}
-Sorts the columns of the matrix {\tt A}.  Returns  {\tt A} in packed form, even if it
-starts as unpacked.  Removes entries in the ignored part of a symmetric matrix.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_transpose\_unsym}: transpose/permute unsymmetric sparse matrix}
-%---------------------------------------
-
-\input{_transpose_unsym.tex}
-Transposes and optionally permutes an unsymmetric sparse matrix.
-The output matrix must be preallocated before calling this routine.
-
-Computes {\tt F=A'}, {\tt F=A(:,f)'} or {\tt F=A(p,f)'}, except that the
-indexing by {\tt f} does not work the same as the MATLAB notation (see below).
-{\tt A->stype} is zero, which denotes that both the upper and lower triangular
-parts of A are present (and used).  The matrix {\tt A} may in fact be symmetric in pattern
-and/or value; {\tt A->stype} just denotes which part of {\tt A} are stored.  {\tt A} may be
-rectangular.
- 
-The integer vector
-{\tt p} is a permutation of {\tt 0:m-1}, and {\tt f} is a subset of {\tt 0:n-1},
-where A is {\tt m}-by-{\tt n}.
-There can be no duplicate entries in {\tt p} or {\tt f}.
-
-\noindent
-Three kinds of transposes are available, depending on the {\tt values} parameter:
-\begin{itemize}
-\item    0: do not transpose the numerical values; create a {\tt CHOLMOD\_PATTERN} matrix
-\item    1: array transpose
-\item    2: complex conjugate transpose (same as 2 if input is real or pattern)
-\end{itemize}
-
-\noindent
-The set {\tt f} is held in fset and fsize:
-\begin{itemize}
-\item  {\tt fset = NULL} means ``{\tt :}'' in MATLAB. {\tt fset} is ignored.
-\item  {\tt fset != NULL} means {\tt f = fset [0..fsize-1]}.
-\item  {\tt fset != NULL} and {\tt fsize = 0} means {\tt f} is the empty set.
-\end{itemize}
- 
-Columns not in the set {\tt f} are considered to be zero.  That is,
-if {\tt A} is 5-by-10 then {\tt F=A(:,[3 4])'} is not 2-by-5, but 10-by-5,
-and rows 3 and 4 of {\tt F} are equal to columns 3 and 4 of {\tt A} (the other
-rows of {\tt F} are zero).  More precisely, in MATLAB notation:
-
-\begin{verbatim}
-        [m n] = size (A)
-        F = A
-        notf = ones (1,n)
-        notf (f) = 0
-        F (:, find (notf)) = 0
-        F = F'
-\end{verbatim}
-
-If you want the MATLAB equivalent {\tt F=A(p,f)} operation, use
-{\tt cholmod\_submatrix} instead (which does not compute the transpose).
-{\tt F->nzmax} must be large enough to hold the matrix {\tt F}.
-If {\tt F->nz} is present then {\tt F->nz [j]} is equal to the number of entries in column {\tt j} of {\tt F}.
-{\tt A} can be sorted or unsorted, with packed or unpacked columns.
-If {\tt f} is present and not sorted in ascending order, then {\tt F} is unsorted
-(that is, it may contain columns whose row indices do not appear in
-ascending order).  Otherwise, {\tt F} is sorted (the row indices in each
-column of {\tt F} appear in strictly ascending order).
-
-{\tt F} is returned in packed or unpacked form, depending on {\tt F->packed} on input.
-If {\tt F->packed} is {\tt FALSE}, then {\tt F} is returned in unpacked form ({\tt F->nz} must be
-present).  Each row {\tt i} of {\tt F} is large enough to hold all the entries in row {\tt i}
-of {\tt A}, even if {\tt f} is provided.  That is, {\tt F->i} and
-{\tt F->x [F->p [i] .. F->p [i] + F->nz [i] - 1]} contain all entries in {\tt A(i,f)},
-but {\tt F->p [i+1] - F->p [i]} is equal to the number of nonzeros in {\tt A (i,:)},
-not just {\tt A (i,f)}.
-The {\tt cholmod\_transpose\_unsym} routine is the only operation in CHOLMOD that
-can produce an unpacked matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_transpose\_sym}: transpose/permute symmetric sparse matrix}
-%---------------------------------------
-
-\input{_transpose_sym.tex}
-Computes {\tt F = A'} or {\tt F = A(p,p)'}, the transpose or permuted transpose, where
-{\tt A->stype} is nonzero.  {\tt A} must be square and symmetric.
-If {\tt A->stype} $> 0$, then {\tt A} is a symmetric matrix where just the upper part
-of the matrix is stored.  Entries in the lower triangular part may be
-present, but are ignored.
-If {\tt A->stype} $< 0$, then {\tt A} is a symmetric matrix where just the lower part
-of the matrix is stored.  Entries in the upper triangular part may be present, but are ignored.
-If {\tt F=A'}, then {\tt F} is returned
-sorted; otherwise {\tt F} is unsorted for the {\tt F=A(p,p)'} case.
-There can be no duplicate entries in {\tt p}.
-
-Three kinds of transposes are available, depending on the {\tt values} parameter:
-\begin{itemize}
-\item    0: do not transpose the numerical values; create a {\tt CHOLMOD\_PATTERN} matrix
-\item    1: array transpose
-\item    2: complex conjugate transpose (same as 2 if input is real or pattern)
-\end{itemize}
-
-For {\tt cholmod\_transpose\_unsym} and {\tt cholmod\_transpose\_sym}, the output matrix
-{\tt F} must already be pre-allocated by the caller, with the correct dimensions.
-If {\tt F} is not valid or has the wrong dimensions, it is not modified.
-Otherwise, if {\tt F} is too small, the transpose is not computed; the contents
-of {\tt F->p} contain the column pointers of the resulting matrix, where
-{\tt F->p [F->ncol] > F->nzmax}.  In this case, the remaining contents of {\tt F} are
-not modified.  {\tt F} can still be properly freed with {\tt cholmod\_free\_sparse}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_band}: extract band of a sparse matrix}
-%---------------------------------------
-
-\input{_band.tex}
-Returns {\tt C = tril (triu (A,k1), k2)}.
-{\tt C} is a matrix consisting of the diagonals of A from {\tt k1} to {\tt k2}.
-{\tt k=0} is the main diagonal of {\tt A}, {\tt k=1} is the superdiagonal, {\tt k=-1} is the
-subdiagonal, and so on.  If {\tt A} is {\tt m}-by-{\tt n}, then:
-\begin{itemize}
-\item {\tt k1=-m} means {\tt C = tril (A,k2)}
-\item {\tt k2=n} means {\tt C = triu (A,k1)}
-\item {\tt k1=0} and {\tt k2=0} means {\tt C = diag(A)}, except {\tt C} is a matrix, not a vector
-\end{itemize}
-Values of {\tt k1} and {\tt k2} less than {\tt -m} are treated as {\tt -m}, and values greater
-than {\tt n} are treated as {\tt n}.
-
-{\tt A} can be of any symmetry (upper, lower, or unsymmetric); {\tt C} is returned in
-the same form, and packed.  If {\tt A->stype} $> 0$, entries in the lower
-triangular part of {\tt A} are ignored, and the opposite is true if
-{\tt A->stype} $< 0$.  If {\tt A} has sorted columns, then so does {\tt C}.
-{\tt C} has the same size as {\tt A}.
-
-{\tt C} can be returned as a numerical valued matrix (if {\tt A} has numerical values
-and {\tt mode} $> 0$), as a pattern-only ({\tt mode} $=0$), or as a pattern-only but with
-the diagonal entries removed ({\tt mode} $< 0$).
-
-The xtype of {\tt A} can be pattern or real.  Complex or zomplex cases are supported only
-if {\tt mode} is $\le 0$ (in which case the numerical values are ignored).
-
-%---------------------------------------
-\subsection{{\tt cholmod\_band\_inplace}: extract band, in place}
-%---------------------------------------
-
-\input{_band_inplace.tex}
-Same as {\tt cholmod\_band}, except that it always operates in place.
-Only packed matrices can be converted in place.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_aat}: compute $\m{AA}\tr$}
-%---------------------------------------
-
-\input{_aat.tex}
-Computes {\tt C = A*A'} or {\tt C = A(:,f)*A(:,f)'}.
-{\tt A} can be packed or unpacked, sorted or unsorted, but must be stored with
-both upper and lower parts ({\tt A->stype} of zero).  {\tt C} is returned as packed,
-{\tt C->stype} of zero (both upper and lower parts present), and unsorted.  See
-{\tt cholmod\_ssmult} in the {\tt MatrixOps} Module for a more general matrix-matrix
-multiply.
-The xtype of {\tt A} can be pattern or real.  Complex or zomplex cases are supported only
-if {\tt mode} is $\le 0$ (in which case the numerical values are ignored).
-You can trivially convert {\tt C} to a symmetric upper/lower matrix
-by changing {\tt C->stype} to 1 or -1, respectively, after calling this routine.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_copy\_sparse}: copy sparse matrix}
-%---------------------------------------
-
-\input{_copy_sparse.tex}
-Returns an exact copy of the input sparse matrix {\tt A}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_copy}: copy (and change) sparse matrix}
-%---------------------------------------
-
-\input{_copy.tex}
-{\tt C = A}, which allocates {\tt C} and copies {\tt A} into {\tt C}, with possible change of
-{\tt stype}.  The diagonal can optionally be removed.  The numerical entries
-can optionally be copied.  This routine differs from {\tt cholmod\_copy\_sparse},
-which makes an exact copy of a sparse matrix.
-
-{\tt A} can be of any type (packed/unpacked, upper/lower/unsymmetric).  {\tt C} is
-packed and can be of any stype (upper/lower/unsymmetric), except that if
-{\tt A} is rectangular {\tt C} can only be unsymmetric.  If the stype of A and C
-differ, then the appropriate conversion is made.
-
-\noindent
-There are three cases for {\tt A->stype}:
-\begin{itemize}
-\item $<0$,  lower: assume {\tt A} is symmetric with just {\tt tril(A)} stored; the rest of {\tt A} is ignored
-\item $ 0$,  unsymmetric: assume {\tt A} is unsymmetric; consider all entries in A
-\item $>0$,  upper: assume {\tt A} is symmetric with just {\tt triu(A)} stored; the rest of {\tt A} is ignored
-\end{itemize}
-
-\noindent
-There are three cases for the requested symmetry of {\tt C} ({\tt stype} parameter):
-\begin{itemize}
-\item $<0$,  lower: return just {\tt tril(C)}
-\item $0$,   unsymmetric: return all of {\tt C}
-\item $>0$,  upper: return just {\tt triu(C)}
-\end{itemize}
-
-\noindent
-This gives a total of nine combinations: \newline
-\begin{tabular}{ll}
-\hline
-Equivalent MATLAB statements			    & Using {\tt cholmod\_copy} \\
-\hline
-{\tt C = A ;						   }& {\tt A} unsymmetric, {\tt C} unsymmetric \\
-{\tt C = tril (A) ;					   }& {\tt A} unsymmetric, {\tt C} lower \\
-{\tt C = triu (A) ;					   }& {\tt A} unsymmetric, {\tt C} upper \\
-{\tt U = triu (A) ; L = tril (U',-1) ; C = L+U ;	   }& {\tt A} upper, {\tt C} unsymmetric \\
-{\tt C = triu (A)' ;					   }& {\tt A} upper, {\tt C} lower \\
-{\tt C = triu (A) ;					   }& {\tt A} upper, {\tt C} upper \\
-{\tt L = tril (A) ; U = triu (L',1) ; C = L+U ;		   }& {\tt A} lower, {\tt C} unsymmetric \\
-{\tt C = tril (A) ;					   }& {\tt A} lower, {\tt C} lower \\
-{\tt C = tril (A)' ;					   }& {\tt A} lower, {\tt C} upper \\
-\hline
-\end{tabular}
-
-\vspace{0.1in}
-The xtype of {\tt A} can be pattern or real.  Complex or zomplex cases are supported only
-if {\tt values} is {\tt FALSE} (in which case the numerical values are ignored).
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_add}: add sparse matrices}
-%---------------------------------------
-
-\input{_add.tex}
-Returns {\tt C = alpha*A + beta*B}.
-If the {\tt stype} of {\tt A} and {\tt B} match, then {\tt C} has
-the same {\tt stype}.  Otherwise, {\tt C->stype} is zero ({\tt C} is
-unsymmetric).
-
-%---------------------------------------
-\subsection{{\tt cholmod\_sparse\_xtype}: change sparse xtype}
-%---------------------------------------
-
-\input{_sparse_xtype.tex}
-Changes the {\tt xtype} of a sparse matrix, to pattern, real, complex, or zomplex.
-Changing from complex or zomplex to real discards the imaginary part.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Core} Module: {\tt cholmod\_factor} object}
-\label{cholmod_factor}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_factor} object: a sparse Cholesky factorization}
-%---------------------------------------
-
-\input{_factor.tex}
-An $\m{LL}\tr$ or $\m{LDL}\tr$ factorization in simplicial or supernodal form.
-A simplicial factor is very similar to a {\tt cholmod\_sparse} matrix.
-For an $\m{LDL}\tr$ factorization, the diagonal matrix $\m{D}$ is stored
-as the diagonal of $\m{L}$; the unit-diagonal of $\m{L}$ is not stored.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_free\_factor}: free factor}
-%---------------------------------------
-
-\input{_free_factor.tex}
-Frees a factor.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_allocate\_factor}: allocate factor}
-%---------------------------------------
-
-\input{_allocate_factor.tex}
-Allocates a factor and sets it to identity.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_reallocate\_factor}: reallocate factor}
-%---------------------------------------
-
-\input{_reallocate_factor.tex}
-Reallocates a simplicial factor so that it can contain {\tt nznew} entries.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_change\_factor}: change factor}
-%---------------------------------------
-
-\input{_change_factor.tex}
-Change the numeric or symbolic, $\m{LL}\tr$ or $\m{LDL}\tr$, simplicial or super, packed or unpacked, and
-monotonic or non-monotonic status of a {\tt cholmod\_factor} object.
-
-There are four basic classes of factor types:
-\begin{enumerate}
-\item simplicial symbolic:  Consists of two size-{\tt n} arrays: the fill-reducing
-permutation ({\tt L->Perm}) and the nonzero count for each column of L
-({\tt L->ColCount}).  All other factor types also include this information.
-{\tt L->ColCount} may be exact (obtained from the analysis routines), or
-it may be a guess.  During factorization, and certainly after update/downdate,
-the columns of {\tt L} can have a different number of nonzeros.
-{\tt L->ColCount} is used to allocate space.  {\tt L->ColCount} is exact for the
-supernodal factorizations.  The nonzero pattern of {\tt L} is not kept.
-
-\item simplicial numeric:  These represent {\tt L} in a compressed column form.  The
-variants of this type are:
-
-\begin{itemize}
-\item $\m{LDL}\tr$:	{\tt L} is unit diagonal.  Row indices in column {\tt j} are located in
-    {\tt L->i [L->p [j] ... L->p [j] + L->nz [j]]}, and corresponding numeric
-    values are in the same locations in {\tt L->x}.  The total number of
-    entries is the sum of {\tt L->nz [j]}.  The unit diagonal is not stored;
-    {\tt D} is stored on the diagonal of {\tt L} instead.  {\tt L->p} may or may not be
-    monotonic.  The order of storage of the columns in {\tt L->i} and {\tt L->x} is
-    given by a doubly-linked list ({\tt L->prev} and {\tt L->next}).  {\tt L->p} is of
-    size {\tt n+1}, but only the first {\tt n} entries are used.
-
-    For the complex case, {\tt L->x} is stored interleaved with real and imaginary
-    parts, and is of size {\tt 2*lnz*sizeof(double)}.  For the zomplex case,
-    {\tt L->x} is of size {\tt lnz*sizeof(double)} and holds the real part; {\tt L->z}
-    is the same size and holds the imaginary part.
-
-\item $\m{LL}\tr$:  This is identical to the $\m{LDL}\tr$ form, except that the non-unit
-    diagonal of {\tt L} is stored as the first entry in each column of {\tt L}.
-\end{itemize}
-
-\item supernodal symbolic:  A representation of the nonzero pattern of the
-supernodes for a supernodal factorization.  There are {\tt L->nsuper}
-supernodes.  Columns {\tt L->super [k]} to {\tt L->super [k+1]-1} are in the {\tt k}th
-supernode.  The row indices for the {\tt k}th supernode are in
-{\tt L->s [L->pi [k] ... L->pi [k+1]-1]}.  The numerical values are not
-allocated ({\tt L->x}), but when they are they will be located in
-{\tt L->x [L->px [k] ... L->px [k+1]-1]}, and the {\tt L->px} array is defined
-in this factor type.
-
-For the complex case, {\tt L->x} is stored interleaved with real/imaginary parts,
-and is of size \newline
-{\tt 2*L->xsize*sizeof(double)}.  The zomplex supernodal case
-is not supported, since it is not compatible with LAPACK and the BLAS.
-
-\item supernodal numeric:  Always an $\m{LL}\tr$ factorization.  {\tt L} has a non-unit
-     diagonal.  {\tt L->x} contains the numerical values of the supernodes, as
-     described above for the supernodal symbolic factor.
-     For the complex case, {\tt L->x} is stored interleaved, and is of size
-     {\tt 2*L->xsize*sizeof(double)}.  The zomplex supernodal case is not
-     supported, since it is not compatible with LAPACK and the BLAS.
-\end{enumerate}
-
-
-In all cases, the row indices in each column ({\tt L->i} for simplicial {\tt L} and
-{\tt L->s} for supernodal {\tt L}) are kept sorted from low indices to high indices.
-This means the diagonal of {\tt L} (or {\tt D} for a $\m{LDL}\tr$ factorization) is always kept as the
-first entry in each column.  The elimination tree is not kept.  The parent
-of node {\tt j} can be found as the second row index in the {\tt j}th column.
-If column {\tt j} has no off-diagonal entries then node {\tt j} is a root
-of the elimination tree.
-
-The {\tt cholmod\_change\_factor} routine can do almost all possible conversions.
-It cannot do the following conversions:
-
-\begin{itemize}
-\item Simplicial numeric types cannot be converted to a supernodal
-    symbolic type.  This would simultaneously deallocate the
-    simplicial pattern and numeric values and reallocate uninitialized
-    space for the supernodal pattern.  This isn't useful for the user,
-    and not needed by CHOLMOD's own routines either.
-\item Only a symbolic factor (simplicial to supernodal) can be converted
-    to a supernodal numeric factor.
-\end{itemize}
-
-Some conversions are meant only to be used internally by other CHOLMOD
-routines, and should not be performed by the end user.  They allocate space
-whose contents are undefined:
-
-\begin{itemize}
-\item converting from simplicial symbolic to supernodal symbolic.
-\item converting any factor to supernodal numeric.
-\end{itemize}
-
-Supports all xtypes, except that there is no supernodal zomplex L.
-
-The {\tt to\_xtype} parameter is used only when converting from symbolic to numeric
-or numeric to symbolic.  It cannot be used to convert a numeric xtype (real,
-complex, or zomplex) to a different numeric xtype.  For that conversion,
-use {\tt cholmod\_factor\_xtype} instead.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_pack\_factor}: pack the columns of a factor}
-%---------------------------------------
-
-\input{_pack_factor.tex}
-Pack the columns of a simplicial $\m{LDL}\tr$ or $\m{LL}\tr$ factorization.  This can be followed
-by a call to {\tt cholmod\_reallocate\_factor} to reduce the size of {\tt L} to the exact
-size required by the factor, if desired.  Alternatively, you can leave the
-size of {\tt L->i} and {\tt L->x} the same, to allow space for future updates/rowadds.
-Each column is reduced in size so that it has at most {\tt Common->grow2} free
-space at the end of the column.
-Does nothing and returns silently if given any other type of factor.
-Does not force the columns of {\tt L} to be monotonic.  It thus differs from
-\begin{verbatim}
-    cholmod_change_factor (xtype, L->is_ll, FALSE, TRUE, TRUE, L, Common)
-\end{verbatim}
-which packs the columns and ensures that they appear in monotonic order.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_reallocate\_column}: reallocate one column of a factor}
-%---------------------------------------
-
-\input{_reallocate_column.tex}
-Reallocates the space allotted to a single column of $\m{L}$.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_factor\_to\_sparse}: sparse matrix copy of a factor}
-%---------------------------------------
-
-\input{_factor_to_sparse.tex}
-Returns a column-oriented sparse matrix containing the pattern and values
-of a simplicial or supernodal numerical factor, and then converts the factor
-into a simplicial symbolic factor.  If {\tt L} is already packed, monotonic,
-and simplicial (which is the case when {\tt cholmod\_factorize} uses the simplicial
-Cholesky factorization algorithm) then this routine requires only a small
-amount of time and memory, independent of {\tt n}.
-It only operates on numeric factors (real, complex, or zomplex).  It does not
-change {\tt L->xtype} (the resulting sparse matrix has the same {\tt xtype}
-as {\tt L}).  If this routine fails, {\tt L} is left unmodified.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_copy\_factor}: copy factor}
-%---------------------------------------
-
-\input{_copy_factor.tex}
-Returns an exact copy of a factor.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_factor\_xtype}: change factor xtype}
-%---------------------------------------
-
-\input{_factor_xtype.tex}
-Changes the {\tt xtype} of a factor, to pattern, real, complex, or zomplex.
-Changing from complex or zomplex to real discards the imaginary part.
-You cannot change a supernodal factor to the zomplex xtype.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Core} Module: {\tt cholmod\_dense} object}
-\label{cholmod_dense}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_dense} object: a dense matrix}
-%---------------------------------------
-
-\input{_dense.tex}
-Contains a dense matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_allocate\_dense}: allocate dense matrix}
-%---------------------------------------
-
-\input{_allocate_dense.tex}
-Allocates a dense matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_free\_dense}: free dense matrix}
-%---------------------------------------
-
-\input{_free_dense.tex}
-Frees a dense matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_ensure\_dense}: ensure dense matrix has a given size
-and type}
-%---------------------------------------
-
-\input{_ensure_dense.tex}
-Ensures a dense matrix has a given size and type.
-
-%---------------------------------------
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_zeros}: dense zero matrix}
-%---------------------------------------
-
-\input{_zeros.tex}
-Returns an all-zero dense matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_ones}: dense matrix, all ones}
-%---------------------------------------
-
-\input{_ones.tex}
-Returns a dense matrix with each entry equal to one.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_eye}: dense identity matrix}
-%---------------------------------------
-
-\input{_eye.tex}
-Returns a dense identity matrix.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_sparse\_to\_dense}: dense matrix copy of a sparse matrix}
-%---------------------------------------
-
-\input{_sparse_to_dense.tex}
-Returns a dense copy of a sparse matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_dense\_to\_sparse}: sparse matrix copy of a dense matrix}
-%---------------------------------------
-
-\input{_dense_to_sparse.tex}
-Returns a sparse copy of a dense matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_copy\_dense}: copy dense matrix}
-%---------------------------------------
-
-\input{_copy_dense.tex}
-Returns a copy of a dense matrix.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_copy\_dense2}: copy dense matrix (preallocated)}
-%---------------------------------------
-
-\input{_copy_dense2.tex}
-Returns a copy of a dense matrix, placing the result in a preallocated matrix {\tt Y}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_dense\_xtype}: change dense matrix xtype}
-%---------------------------------------
-
-\input{_dense_xtype.tex}
-Changes the {\tt xtype} of a dense matrix, to real, complex, or zomplex.
-Changing from complex or zomplex to real discards the imaginary part.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Core} Module: {\tt cholmod\_triplet} object}
-\label{cholmod_triplet}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_triplet} object: sparse matrix in triplet form}
-%---------------------------------------
-
-\input{_triplet.tex}
-Contains a sparse matrix in triplet form.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_allocate\_triplet}: allocate triplet matrix}
-%---------------------------------------
-
-\input{_allocate_triplet.tex}
-Allocates a triplet matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_free\_triplet}: free triplet matrix}
-%---------------------------------------
-
-\input{_free_triplet.tex}
-Frees a triplet matrix.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_reallocate\_triplet}: reallocate triplet matrix}
-%---------------------------------------
-
-\input{_reallocate_triplet.tex}
-Reallocates a triplet matrix so that it can hold {\tt nznew} entries.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_sparse\_to\_triplet}: triplet matrix copy of a sparse matrix}
-%---------------------------------------
-
-\input{_sparse_to_triplet.tex}
-Returns a triplet matrix copy of a sparse matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_triplet\_to\_sparse}: sparse matrix copy of a triplet matrix}
-%---------------------------------------
-
-\input{_triplet_to_sparse.tex}
-Returns a sparse matrix copy of a triplet matrix.
-If the triplet matrix is symmetric with just the lower part present ({\tt T->stype} $< 0$),
-then entries in the upper part are transposed and placed in the lower part when
-converting to a sparse matrix.  Similarly,
-if the triplet matrix is symmetric with just the upper part present ({\tt T->stype} $> 0$),
-then entries in the lower part are transposed and placed in the upper part when
-converting to a sparse matrix.
-Any duplicate entries are summed.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_copy\_triplet}: copy triplet matrix}
-%---------------------------------------
-
-\input{_copy_triplet.tex}
-Returns an exact copy of a triplet matrix.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_triplet\_xtype}: change triplet xtype}
-%---------------------------------------
-
-\input{_triplet_xtype.tex}
-Changes the {\tt xtype} of a dense matrix, to real, complex, or zomplex.
-Changing from complex or zomplex to real discards the imaginary part.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Core} Module: memory management}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_malloc}: allocate memory}
-%---------------------------------------
-
-\input{_malloc.tex}
-Allocates a block of memory of size {\tt n*size},
-using the {\tt SuiteSparse\_config.malloc\_func}
-function pointer (default is to use the ANSI C {\tt malloc} routine).
-A value of {\tt n=0} is treated as {\tt n=1}.
-If not successful, {\tt NULL} is returned and {\tt Common->status} is set to {\tt CHOLMOD\_OUT\_OF\_MEMORY}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_calloc}: allocate and clear memory}
-%---------------------------------------
-
-\input{_calloc.tex}
-Allocates a block of memory of size {\tt n*size},
-using the {\tt SuiteSparse\_config.calloc\_func}
-function pointer (default is to use the ANSI C {\tt calloc} routine).
-A value of {\tt n=0} is treated as {\tt n=1}.
-If not successful, {\tt NULL} is returned and {\tt Common->status} is set to {\tt CHOLMOD\_OUT\_OF\_MEMORY}.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_free}: free memory}
-%---------------------------------------
-
-\input{_free.tex}
-Frees a block of memory of size {\tt n*size},
-using the {\tt SuiteSparse\_config.free\_func}
-function pointer (default is to use the ANSI C {\tt free} routine).
-The size of the block ({\tt n} and {\tt size}) is only required so that CHOLMOD
-can keep track of its current and peak memory usage.  This is a useful statistic,
-and it can also help in tracking down memory leaks.  After the call to
-{\tt cholmod\_finish}, the count of allocated blocks ({\tt Common->malloc\_count})
-should be zero, and the count of bytes in use ({\tt Common->memory\_inuse}) also
-should be zero.  If you allocate a block with one size and free it with another,
-the {\tt Common->memory\_inuse} count will be wrong, but CHOLMOD will not
-have a memory leak.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_realloc}: reallocate memory}
-%---------------------------------------
-
-\input{_realloc.tex}
-Reallocates a block of memory whose current size {\tt n*size},
-and whose new size will be {\tt nnew*size} if successful,
-using the {\tt SuiteSparse\_config.calloc\_func}
-function pointer (default is to use the ANSI C {\tt realloc} routine).
-If the reallocation is not successful, {\tt p} is returned unchanged
-and {\tt Common->status} is set to {\tt CHOLMOD\_OUT\_OF\_MEMORY}.
-The value of {\tt n} is set to {\tt nnew} if successful, or left
-unchanged otherwise.
-A value of {\tt nnew=0} is treated as {\tt nnew=1}.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_realloc\_multiple}: reallocate memory}
-%---------------------------------------
-
-\input{_realloc_multiple.tex}
-Reallocates multiple blocks of memory, all with the same number of items
-(but with different item sizes).  Either all reallocations succeed,
-or all are returned to their original size.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Core} Module: version control}
-%-------------------------------------------------------------------------------
-
-\subsection{{\tt cholmod\_version}: return current CHOLMOD version}
-
-\input{_version.tex}
-Returns the CHOLMOD version number, so that it can be tested at run time, even
-if the caller does not have access to the CHOLMOD include files.  For example,
-for a CHOLMOD version 3.2.1, the {\tt version} array will contain 3, 2, and 1,
-in that order.  This function appears in CHOLMOD 2.1.1 and later.  You can
-check if the function exists with the {\tt CHOLMOD\_HAS\_VERSION\_FUNCTION}
-macro, so that the following code fragment works in any version of CHOLMOD:
-
-\begin{verbatim}
-   #ifdef CHOLMOD_HAS_VERSION_FUNCTION
-   v = cholmod_version (NULL) ;
-   #else
-   v = CHOLMOD_VERSION ;
-   #endif
-\end{verbatim}
-
-Note that {\tt cholmod\_version} and {\tt cholmod\_l\_version} have identical
-prototypes.  Both use {\tt int}'s.  Unlike all other CHOLMOD functions, this
-function does not take the {\tt Common} object as an input parameter, and it
-does not use any definitions from any include files.  Thus, the caller can
-access this function even if the caller does not include any CHOLMOD include
-files.
-
-The above code fragment does require the {\tt \#include "cholmod.h"},
-of course, but {\tt cholmod\_version} can be called without it, if necessary.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Check} Module routines}
-%-------------------------------------------------------------------------------
-
-No CHOLMOD routines print anything, except for the {\tt cholmod\_print\_*}
-routines in the {\tt Check} Module, and the {\tt cholmod\_error} routine.  The
-{\tt Common->print\_function} is a pointer to {\tt printf} by default;
-you can redirect the output of CHOLMOD by redefining this pointer.
-If {\tt Common->print\_function} is {\tt NULL}, CHOLMOD does not print anything.
-
-The {\tt Common->print} parameter determines how much detail is printed.
-Each value of {\tt Common->print} listed below also prints the items listed
-for smaller values of {\tt Common->print}:
-\begin{itemize}
-\item 0: print nothing; check the data structures and return {\tt TRUE} or {\tt FALSE}.
-\item 1: print error messages.
-\item 2: print warning messages.
-\item 3: print a one-line summary of the object.
-\item 4: print a short summary of the object (first and last few entries).
-\item 5: print the entire contents of the object.
-\end{itemize}
-Values less than zero are treated as zero, and values greater than five are
-treated as five.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_check\_common}: check Common object}
-%---------------------------------------
-
-\input{_check_common.tex}
-Check if the {\tt Common} object is valid.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_print\_common}: print Common object}
-%---------------------------------------
-
-\input{_print_common.tex}
-Print the {\tt Common} object and check if it is valid.
-This prints the CHOLMOD parameters and statistics.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_check\_sparse}: check sparse matrix}
-%---------------------------------------
-
-\input{_check_sparse.tex}
-Check if a sparse matrix is valid.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_print\_sparse}: print sparse matrix}
-%---------------------------------------
-
-\input{_print_sparse.tex}
-Print a sparse matrix and check if it is valid.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_check\_dense}: check dense matrix}
-%---------------------------------------
-
-\input{_check_dense.tex}
-Check if a dense matrix is valid.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_print\_dense}: print dense matrix}
-%---------------------------------------
-
-\input{_print_dense.tex}
-Print a dense matrix and check if it is valid.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_check\_factor}: check factor}
-%---------------------------------------
-
-\input{_check_factor.tex}
-Check if a factor is valid.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_print\_factor}: print factor}
-%---------------------------------------
-
-\input{_print_factor.tex}
-Print a factor and check if it is valid.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_check\_triplet}: check triplet matrix}
-%---------------------------------------
-
-\input{_check_triplet.tex}
-Check if a triplet matrix is valid.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_print\_triplet}: print triplet matrix}
-%---------------------------------------
-
-\input{_print_triplet.tex}
-Print a triplet matrix and check if it is valid.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_check\_subset}: check subset}
-%---------------------------------------
-
-\input{_check_subset.tex}
-Check if a subset is valid.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_print\_subset}: print subset}
-%---------------------------------------
-
-\input{_print_subset.tex}
-Print a subset and check if it is valid.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_check\_perm}: check permutation}
-%---------------------------------------
-
-\input{_check_perm.tex}
-Check if a permutation is valid.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_print\_perm}: print permutation}
-%---------------------------------------
-
-\input{_print_perm.tex}
-Print a permutation and check if it is valid.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_check\_parent}: check elimination tree}
-%---------------------------------------
-
-\input{_check_parent.tex}
-Check if an elimination tree is valid.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_print\_parent}: print elimination tree}
-%---------------------------------------
-
-\input{_print_parent.tex}
-Print an elimination tree and check if it is valid.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_read\_triplet}: read triplet matrix from file}
-%---------------------------------------
-
-\input{_read_triplet.tex}
-Read a sparse matrix in triplet form, using the the {\tt coord} 
-Matrix Market format (http://www.nist.gov/MatrixMarket).
-Skew-symmetric and complex symmetric matrices are returned with
-both upper and lower triangular parts present (an stype of zero).
-Real symmetric and complex Hermitian matrices are returned with just
-their upper or lower triangular part, depending on their stype.
-The Matrix Market {\tt array} data type for dense matrices is not supported
-(use {\tt cholmod\_read\_dense} for that case).
-
-If the first line of the file starts with {\tt \%\%MatrixMarket}, then it is
-interpreted as a file in Matrix Market format.  The header line is optional.
-If present, this line must have the following format:
-\vspace{0.1in}
-
-        {\tt \%\%MatrixMarket matrix coord} {\em type storage}
-
-\vspace{0.1in}
-\noindent
-where {\em type} is one of: {\tt real}, {\tt complex}, {\tt pattern},
-or {\tt integer}, and {\em storage} is one of: {\tt general}, {\tt hermitian},
-{\tt symmetric}, or {\tt skew-symmetric}.
-In CHOLMOD, these roughly correspond to the {\tt xtype}
-(pattern, real, complex, or zomplex) and {\tt stype}
-(unsymmetric, symmetric/upper, and symmetric/lower).
-The strings are case-insensitive.  Only the first character (or the
-first two for skew-symmetric) is significant.
-The {\tt coord} token can be replaced with {\tt array} in the Matrix Market format, but
-this format not supported by {\tt cholmod\_read\_triplet}.
-The {\tt integer} type is converted to real.
-The {\em type} is ignored; the actual type (real, complex, or pattern) is
-inferred from the number of tokens in each line of the file (2: pattern,
-3: real, 4: complex).  This is compatible with the Matrix Market format.
-
-A storage of {\tt general} implies an stype of zero
-(see below).  A storage of {\tt symmetric} and {\tt hermitian} imply an stype of -1.
-Skew-symmetric and complex symmetric matrices are returned with an stype of 0.
-Blank lines, any other lines starting with ``{\tt \%}'' are treated as comments, and are ignored.
-
-The first non-comment line contains 3 or 4 integers:
-\vspace{0.1in}
-
-	{\em nrow ncol nnz stype}
-
-\vspace{0.1in}
-\noindent
-where {\em stype} is optional (stype does not appear in the Matrix Market format).
-The matrix is {\em nrow}-by-{\em ncol}.  The following {\em nnz} lines (excluding comments)
-each contain a single entry.  Duplicates are permitted, and are summed in
-the output matrix.
-
-If stype is present, it denotes the storage format for the matrix.
-\begin{itemize}
-\item stype = 0 denotes an unsymmetric matrix (same as Matrix Market {\tt general}).
-\item stype = -1 denotes a symmetric or Hermitian matrix whose lower triangular 
-	entries are stored.  Entries may be present in the upper triangular
-	part, but these are ignored (same as Matrix Market {\tt symmetric}
-	for the real case, {\tt hermitian} for the complex case).
-\item stype = 1 denotes a symmetric or Hermitian matrix whose upper triangular 
-	entries are stored.  Entries may be present in the lower triangular
-	part, but these are ignored.  This format is not available in the Matrix
-	Market format.
-\end{itemize}
-
-If neither the stype nor the Matrix Market header are present, then
-the stype is inferred from the rest of the data.  If the matrix is
-rectangular, or has
-entries in both the upper and lower triangular parts, then it is assumed to
-be unsymmetric (stype=0).  If only entries in the lower triangular part are
-present, the matrix is assumed to have stype = -1.  If only entries in the
-upper triangular part are present, the matrix is assumed to have stype = 1.
-
-Each nonzero consists of one line with 2, 3, or 4 entries.  All lines must
-have the same number of entries.  The first two entries are the row and
-column indices of the nonzero.  If 3 entries are present, the 3rd entry is
-the numerical value, and the matrix is real.  If 4 entries are present,
-the 3rd and 4th entries in the line are the real and imaginary parts of
-a complex value.
-
-The matrix can be either 0-based or 1-based.  It is first assumed to be
-one-based (compatible with Matrix Market), with row indices in the range
-1 to ncol and column indices in the range 1 to nrow.  If a row or column
-index of zero is found, the matrix is assumed to be zero-based (with row
-indices in the range 0 to ncol-1 and column indices in the range 0 to
-nrow-1).  This test correctly determines that all Matrix Market
-matrices are in 1-based form.
-
-For symmetric pattern-only matrices, the kth diagonal (if present) is set to
-one plus the degree of the row k or column k (whichever is larger), and the
-off-diagonals are set to -1.  A symmetric pattern-only matrix with a
-zero-free diagonal is thus converted into a symmetric positive definite
-matrix.  All entries are set to one for an unsymmetric pattern-only matrix.
-This differs from the MatrixMarket format ({\tt A = mmread ('file')} returns
-a binary pattern for A for symmetric pattern-only matrices).
-To return a binary format for all pattern-only matrices, use
-{\tt A = mread('file',1)}.
-
-Example matrices that follow this format can be found in the
-{\tt CHOLMOD/Demo/Matrix} and \newline
-{\tt CHOLMOD/Tcov/Matrix} directories.
-You can also try any of the matrices in the Matrix Market collection
-at http://www.nist.gov/MatrixMarket.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_read\_sparse}: read sparse matrix from file}
-%---------------------------------------
-
-\input{_read_sparse.tex}
-Read a sparse matrix in triplet form from a file (using {\tt cholmod\_read\_triplet})
-and convert to a CHOLMOD sparse matrix.
-The Matrix Market format is used.
-If {\tt Common->prefer\_upper} is {\tt TRUE} (the default case), a symmetric matrix is
-returned stored in upper-triangular form ({\tt A->stype} is 1).
-Otherwise, it is left in its original form, either upper or lower.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_read\_dense}: read dense matrix from file}
-%---------------------------------------
-
-\input{_read_dense.tex}
-Read a dense matrix from a file, using the the {\tt array} 
-Matrix Market format 
-\newline (http://www.nist.gov/MatrixMarket).
-
-%---------------------------------------
-\subsection{{\tt cholmod\_read\_matrix}: read a matrix from file}
-%---------------------------------------
-
-\input{_read_matrix.tex}
-Read a sparse or dense matrix from a file, in Matrix Market format.
-Returns a {\tt void} pointer to either a
-{\tt cholmod\_triplet},
-{\tt cholmod\_sparse}, or
-{\tt cholmod\_dense} object.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_write\_sparse}: write a sparse matrix to a file}
-%---------------------------------------
-
-\input{_write_sparse.tex}
-Write a sparse matrix to a file in Matrix Market format.   Optionally include
-comments, and print explicit zero entries given by the pattern of the {\tt Z}
-matrix.  If not NULL, the {\tt Z} matrix must have the same dimensions and stype
-as {\tt A}.
-
-Returns the symmetry in which the matrix was printed
-(1 to 7) or -1 on failure.  See the {\tt cholmod\_symmetry} function for
-a description of the return codes.
-
-If {\tt A} and {\tt Z} are sorted on input, and either unsymmetric (stype = 0) or
-symmetric-lower (stype < 0), and if {\tt A} and {\tt Z} do not overlap,
-then the triplets
-are sorted, first by column and then by row index within each column, with
-no duplicate entries.  If all the above holds except stype > 0, then the
-triplets are sorted by row first and then column.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_write\_dense}: write a dense matrix to a file}
-%---------------------------------------
-
-\input{_write_dense.tex}
-Write a dense matrix to a file in Matrix Market format.   Optionally include
-comments.  Returns > 0 if successful, -1 otherwise (1 if rectangular, 2 if
-square).
-A dense matrix is written in "general" format; symmetric formats in the
-Matrix Market standard are not exploited.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Cholesky} Module routines}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_analyze}: symbolic factorization}
-%---------------------------------------
-
-\input{_analyze.tex}
-Orders and analyzes a matrix (either simplicial or supernodal), in preparation
-for numerical factorization via {\tt cholmod\_factorize} or via the ``expert''
-routines {\tt cholmod\_rowfac} and {\tt cholmod\_super\_numeric}.
-
-In the symmetric case, {\tt A} or {\tt A(p,p)} is analyzed,
-where {\tt p} is the fill-reducing ordering.
-In the unsymmetric case, {\tt A*A'} or {\tt A(p,:)*A(p,:)'} is analyzed.
-The {\tt cholmod\_analyze\_p} routine can be given a user-provided permutation {\tt p}
-(see below).
-
-The default ordering strategy is to first try AMD.
-The ordering quality is analyzed, and if AMD obtains an ordering where
-{\tt nnz(L)} is greater than or equal to {\tt 5*nnz(tril(A))}
-(or {\tt 5*nnz(tril(A*A'))} if {\tt A} is unsymmetric) and
-the floating-point operation count for the subsequent factorization is
-greater than or equal to {\tt 500*nnz(L)}, then METIS is tried (if installed).
-For {\tt cholmod\_analyze\_p}, the user-provided ordering is also tried.
-This default behavior is obtained when {\tt Common->nmethods} is zero.
-In this case, methods 0, 1, and 2 in {\tt Common->method[...]} are reset
-to user-provided, AMD, and METIS, respectively.
-The ordering with the smallest {\tt nnz(L)} is kept.
-
-If {\tt Common->default\_nesdis} is true (nonzero), then CHOLMOD's
-nested dissection (NESDIS) is used for the default strategy described
-above, in place of METIS.
-
-Other ordering options can be requested.  These include:
-\begin{enumerate}
-\item	natural:    A is not permuted to reduce fill-in.
-\item	user-provided:	    a permutation can be provided to {\tt cholmod\_analyze\_p}.
-\item	AMD:	    approximate minimum degree (AMD for the symmetric case, COLAMD for the {\tt A*A'} case).
-\item	METIS:	    nested dissection with {\tt METIS\_NodeND}
-\item	{\tt NESDIS}:	    CHOLMOD's nested dissection using
-    {\tt METIS\_NodeComputeSeparator},
-    followed by a constrained minimum degree
-    (CAMD or CSYMAMD for the symmetric case, CCOLAMD for the {\tt A*A'} case).
-    This is typically slower than METIS, but typically provides better orderings.
-\end{enumerate}
-
-Multiple ordering options can be tried (up to 9 of them), and the best one
-is selected (the one that gives the smallest number of nonzeros in the
-simplicial factor L).  If one method fails, {\tt cholmod\_analyze} keeps going, and
-picks the best among the methods that succeeded.  This routine fails (and
-returns {\tt NULL}) if either the initial memory allocation fails, all ordering methods
-fail, or the supernodal analysis (if requested) fails.  Change {\tt Common->nmethods} to the
-number of methods you wish to try.  By default, the 9 methods available are:
-
-\begin{enumerate}
-\item user-provided permutation (only for {\tt cholmod\_analyze\_p}).
-\item AMD with default parameters.
-\item METIS with default parameters.
-\item {\tt NESDIS} with default parameters: stopping the partitioning when
-	    the graph is of size {\tt nd\_small} = 200 or less, remove nodes with
-	    more than {\tt max (16, prune\_dense * sqrt (n))} nodes where
-	    {\tt prune\_dense} = 10, and follow partitioning with
-	    constrained minimum degree ordering
-	    (CAMD for the symmetric case,
-	    CCOLAMD for the unsymmetric case).
-\item natural ordering (with weighted postorder).
-\item NESDIS, {\tt nd\_small} = 20000, {\tt prune\_dense} = 10.
-\item NESDIS, {\tt nd\_small} =     4, {\tt prune\_dense} = 10,
-    no constrained minimum degree.
-\item NESDIS, {\tt nd\_small} =   200, {\tt prune\_dense} = 0.
-\item COLAMD for {\tt A*A'} or AMD for {\tt A}
-\end{enumerate}
-
-You can modify these 9 methods and the number of methods tried by changing
-parameters in the {\tt Common} argument.  If you know the best ordering for your
-matrix, set {\tt Common->nmethods} to 1 and set {\tt Common->method[0].ordering} to the
-requested ordering method.  Parameters for each method can also be modified
-(refer to the description of {\tt cholmod\_common} for details).
-
-Note that it is possible for METIS to terminate your program if it runs out
-of memory.  This is not the case for any CHOLMOD or minimum degree ordering
-routine (AMD, COLAMD, CAMD, CCOLAMD, or CSYMAMD).
-Since {\tt NESDIS} relies on METIS, it too can terminate your program.
-
-The selected ordering is followed by a weighted postorder of the elimination
-tree by default (see {\tt cholmod\_postorder} for details),
-unless {\tt Common->postorder} is set to {\tt FALSE}.
-The postorder does not change the number of nonzeros in $\m{L}$ or
-the floating-point operation count.  It does improve performance,
-particularly for the supernodal factorization.
-If you truly want the natural ordering with no postordering,
-you must set {\tt Common->postorder} to {\tt FALSE}.
-
-The factor {\tt L} is returned as simplicial symbolic if
-{\tt Common->supernodal} is {\tt CHOLMOD\_SIMPLICIAL} (zero) or as supernodal symbolic if
-{\tt Common->supernodal} is {\tt CHOLMOD\_SUPERNODAL} (two).  If \newline
-{\tt Common->supernodal} is {\tt CHOLMOD\_AUTO} (one),
-then {\tt L} is simplicial if the flop count per nonzero in {\tt L} is less than
-{\tt Common->supernodal\_switch} (default: 40), and
-supernodal otherwise.  In both cases, {\tt L->xtype} is {\tt CHOLMOD\_PATTERN}.
-A subsequent call to {\tt cholmod\_factorize} will perform a
-simplicial or supernodal factorization, depending on the type of {\tt L}.
-
-For the simplicial case, {\tt L} contains the fill-reducing permutation ({\tt L->Perm})
-and the counts of nonzeros in each column of {\tt L} ({\tt L->ColCount}).  For the
-supernodal case, {\tt L} also contains the nonzero pattern of each supernode.
-
-If a simplicial factorization is selected, it will be $\m{LDL}\tr$ by default, since
-this is the kind required by the {\tt Modify} Module.  CHOLMOD does not include a
-supernodal $\m{LDL}\tr$ factorization, so if a supernodal factorization is selected,
-it will be in the form $\m{LL}\tr$.  The $\m{LDL}\tr$ method can be used to
-factorize positive definite matrices and indefinite matrices whose leading minors
-are well-conditioned (2-by-2 pivoting is not supported).  The $\m{LL}\tr$ method
-is restricted to positive definite matrices.  To factorize a large indefinite matrix,
-set {\tt Common->supernodal} to {\tt CHOLMOD\_SIMPLICIAL}, and the simplicial 
-$\m{LDL}\tr$ method will always be used.  This will be significantly slower than
-a supernodal $\m{LL}\tr$ factorization, however.
-
-Refer to {\tt cholmod\_transpose\_unsym} for a description of {\tt f}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_factorize}: numeric factorization}
-%---------------------------------------
-
-\input{_factorize.tex}
-Computes the numerical factorization of a symmetric matrix.  The % primary
-inputs to this routine are a sparse matrix {\tt A} and the symbolic factor {\tt L} from
-{\tt cholmod\_analyze} or a prior numerical factor {\tt L}.  If {\tt A} is symmetric, this
-routine factorizes {\tt A(p,p)}. %+beta*I (beta can be zero),
-where p is the fill-reducing permutation ({\tt L->Perm}).  If {\tt A} is unsymmetric,
-% either
-{\tt A(p,:)*A(p,:)'} % +beta*I  or A(p,f)*A(p,f)'+beta*I
-is factorized.  %  The set f and
-The nonzero pattern of the matrix {\tt A} must be the same as the matrix passed to
-{\tt cholmod\_analyze} for the supernodal case.  For the simplicial case, it can
-be different, but it should be the same for best performance. %  beta is real.
-
-A simplicial factorization or supernodal factorization is chosen, based on
-the type of the factor {\tt L}.  If {\tt L->is\_super} is {\tt TRUE}, a supernodal $\m{LL}\tr$
-factorization is computed.  Otherwise, a simplicial numeric factorization
-is computed, either $\m{LL}\tr$ or $\m{LDL}\tr$, depending on {\tt Common->final\_ll}
-(the default for the simplicial case is to compute an $\m{LDL}\tr$ factorization).
-
-Once the factorization is complete, it can be left as is or optionally
-converted into any simplicial numeric type, depending on the
-{\tt Common->final\_*} parameters.  If converted from a supernodal to simplicial
-type, and {\tt Common->final\_resymbol} is {\tt TRUE}, then numerically
-zero entries in {\tt L} due to relaxed supernodal amalgamation are removed from
-the simplicial factor (they are always left in the supernodal form of {\tt L}).
-Entries that are numerically zero but present in the simplicial symbolic
-pattern of {\tt L} are left in place (the graph of {\tt L} remains chordal).
-This is required for the update/downdate/rowadd/rowdel routines to work
-properly.
-
-If the matrix is not positive definite the routine returns {\tt TRUE}, but
-{\tt Common->status} is set to {\tt CHOLMOD\_NOT\_POSDEF} and {\tt L->minor} is set to the
-column at which the failure occurred.  Columns {\tt L->minor} to {\tt L->n-1}
-are set to zero.
-
-Supports any xtype (pattern, real, complex, or zomplex), except that the
-input matrix {\tt A} cannot be pattern-only.  If {\tt L} is simplicial, its numeric
-xtype matches {\tt A} on output.  If {\tt L} is supernodal, its xtype is real if {\tt A} is
-real, or complex if {\tt A} is complex or zomplex.  CHOLMOD does not provide
-a supernodal zomplex factor, since it is incompatible with how complex numbers are
-stored in LAPACK and the BLAS.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_analyze\_p}: symbolic factorization, given permutation}
-%---------------------------------------
-
-\input{_analyze_p.tex}
-Identical to {\tt cholmod\_analyze}, except that a user-provided
-permutation {\tt p} can be provided, and the set {\tt f} for the unsymmetric case
-can be provided.  The matrices {\tt A(:,f)*A(:,f)'} or {\tt A(p,f)*A(p,f)'}
-can be analyzed in the the unsymmetric case.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_factorize\_p}: numeric factorization, given permutation}
-%---------------------------------------
-
-\input{_factorize_p.tex}
-Identical to {\tt cholmod\_factorize}, but with additional options.
-The set {\tt f} can be provided for the unsymmetric case;
-{\tt A(p,f)*A(p,f)'} is factorized.  The term {\tt beta*I} can be added to
-the matrix before it is factorized, where {\tt beta} is real.
-Only the real part, {\tt beta[0]}, is used.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_solve}: solve a linear system}
-%---------------------------------------
-
-\input{_solve.tex}
-Returns a solution {\tt X} that solves one of the following systems:
-
-\begin{tabular}{ll|ll}
-	\hline
-	system			    & {\tt sys} parameter & system		    & {\tt sys} parameter \\
-	$\m{Ax}=\m{b}$		    & 0: {\tt CHOLMOD\_A}	&			    &			\\
-	$\m{LDL}\tr\m{x}=\m{b}$	    & 1: {\tt CHOLMOD\_LDLt}	& $\m{L}\tr\m{x}=\m{b}$	    & 5: {\tt CHOLMOD\_Lt}	\\
-	$\m{LDx}=\m{b}$		    & 2: {\tt CHOLMOD\_LD}	& $\m{Dx}=\m{b}$	    & 6: {\tt CHOLMOD\_D}	\\
-	$\m{DL}\tr\m{x}=\m{b}$	    & 3: {\tt CHOLMOD\_DLt}	& $\m{x}=\m{Pb}$	    & 7: {\tt CHOLMOD\_P}	\\
-	$\m{Lx}=\m{b}$		    & 4: {\tt CHOLMOD\_L}	& $\m{x}=\m{P}\tr\m{b}$	    & 8: {\tt CHOLMOD\_Pt}	\\
-	\hline
-\end{tabular}
-
-The factorization can be simplicial $\m{LDL}\tr$, simplicial $\m{LL}\tr$, or supernodal $\m{LL}\tr$.
-For an $\m{LL}\tr$ factorization, $\m{D}$ is the identity matrix.  Thus {\tt CHOLMOD\_LD} and
-{\tt CHOLMOD\_L} solve the same system if an $\m{LL}\tr$ factorization was performed,
-for example.
-This is one of the few routines in CHOLMOD for which the xtype of the input
-arguments need not match.
-If both {\tt L} and {\tt B} are real, then {\tt X} is returned real.  If either is complex
-or zomplex, {\tt X} is returned as either complex or zomplex, depending on the
-{\tt Common->prefer\_zomplex} parameter (default is complex).
-
-This routine does not check to see if the diagonal of $\m{L}$ or $\m{D}$ is zero,
-because sometimes a partial solve can be done with an indefinite or singular
-matrix.  If you wish to check in your own code, test {\tt L->minor}.  If
-{\tt L->minor == L->n}, then the matrix has no zero diagonal entries.
-If {\tt k = L->minor < L->n}, then {\tt L(k,k)} is zero for an $\m{LL}\tr$ factorization, or
-{\tt D(k,k)} is zero for an $\m{LDL}\tr$ factorization.
-
-Iterative refinement is not performed, but this can be easily done with
-the {\tt MatrixOps} Module.  See {\tt Demo/cholmod\_demo.c} for an example.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_spsolve}: solve a linear system}
-%---------------------------------------
-
-\input{_spsolve.tex}
-Identical to {\tt cholmod\_solve}, except that {\tt B} and {\tt X} are sparse.
-This function converts {\tt B} to full format, solves the system, and then
-converts {\tt X} back to sparse.  If you want to solve with a sparse {\tt B}
-and get just a partial solution back in {\tt X} (corresponding to the pattern
-of {\tt B}), use {\tt cholmod\_solve2} below.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_solve2}: solve a linear system, reusing workspace}
-%---------------------------------------
-
-\input{_solve2.tex}
-Solve a linear system, optionally reusing workspace from a prior call
-to {\tt cholmod\_solve2}.
-
-The inputs to this function are the same as {\tt cholmod\_solve},
-with the addition of three parameters:
-{\tt X},
-{\tt Y},
-and
-{\tt E}.  The dense matrix {\tt X} is the solution on output.
-On input, {\tt \&X} can point to a NULL matrix, or be the wrong size.
-If that is the case, it is freed and allocated to be the proper size. 
-If {\tt X} has the right size and type on input, then the allocation
-is skipped.  In contrast, the {\tt cholmod\_solve} function always
-allocates its output {\tt X}.  This {\tt cholmod\_solve2} function
-allows you to reuse the memory space of a prior {\tt X}, thereby
-saving time.
-
-The two workspace matrices {\tt Y} and {\tt E} can also be reused
-between calls.
-You must free
-{\tt X}
-{\tt Y},
-and 
-{\tt E} yourself, when your computations are done.  Below is an
-example of usage.
-Note that 
-{\tt X}
-{\tt Y},
-and 
-{\tt E} must be defined on input (either NULL, or valid dense matrices).
-
-\begin{verbatim}
-        cholmod_dense *X = NULL, *Y = NULL, *E = NULL ;
-        ...
-        cholmod_l_solve2 (sys, L, B1, NULL, &X, NULL, &Y, &E, Common) ;
-        cholmod_l_solve2 (sys, L, B2, NULL, &X, NULL, &Y, &E, Common) ;
-        cholmod_l_solve2 (sys, L, B3, NULL, &X, NULL, &Y, &E, Common) ;
-        cholmod_l_free_dense (&X, Common) ;
-        cholmod_l_free_dense (&Y, Common) ;
-        cholmod_l_free_dense (&E, Common) ;
-\end{verbatim}
-
-The equivalent when using {\tt cholmod\_solve} is:
-
-\begin{verbatim}
-        cholmod_dense *X = NULL, *Y = NULL, *E = NULL ;
-        ...
-        X = cholmod_l_solve (sys, L, B1, Common) ;
-        cholmod_l_free_dense (&X, Common) ;
-        X = cholmod_l_solve (sys, L, B2, Common) ;
-        cholmod_l_free_dense (&X, Common) ;
-        X = cholmod_l_solve (sys, L, B3, Common) ;
-        cholmod_l_free_dense (&X, Common) ;
-\end{verbatim}
-
-Both methods work fine, but in the second method with {\tt cholmod\_solve},
-the internal workspaces ({\tt Y} and {\tt E}) and the solution ({\tt X})
-are allocated and freed on each call.
-
-The {\tt cholmod\_solve2 function} can also solve for a subset of the solution
-vector {\tt X}, if the optional {\tt Bset} parameter is non-NULL.  The
-right-hand-side {\tt B} must be a single column vector, and its complexity
-(real, complex, zomplex) must match that of {\tt L}.  The vector {\tt B} is
-dense, but it is assumed to be zero except for row indices specified in {\tt
-Bset}.  The vector {\tt Bset} must be a sparse column vector, of dimension the
-same as {\tt B}.  Only the pattern of {\tt Bset} is used.  The solution {\tt X}
-(a dense column vector) is modified on output, but is defined only in the rows
-defined by the sparse vector {\tt Xset}.  The entries in {\tt Bset} are a
-subset of {\tt Xset} (except if {\tt sys} is {\tt CHOLMOD\_P} or {\tt
-CHOLMOD\_Pt}).
-
-No memory allocations are done if the outputs and internal
-workspaces ({\tt X}, {\tt Xset}, {\tt Y}, and {\tt E}) have been allocated
-by a prior call (or if allocated by the user).  To let {\tt cholmod\_solve2}
-allocate these outputs and workspaces for you, simply initialize them to
-NULL (as in the example above).  Since it is possible for this function
-to reallocate these 4 arrays, you should always re-acquire the pointers to
-their internal data ({\tt X->x} for example) after calling
-{\tt cholmod\_solve2}), since they may change.  They normally will not
-change except in the first call to this function.
-
-On the first call to {\tt cholmod\_solve2} when {\tt Bset} is NULL,
-the factorization is converted from supernodal to simplicial, if needed.
-The inverse permutation is also computed and stored in the factorization
-object, {\tt L}.  This can take a modest amount of time.  Subsequent
-calls to {\tt cholmod\_solve2} with a small {\tt Bset}
-are very fast (both asymptotically and in practice).
-
-You can find an example of how to use {\tt cholmod\_solve2} in the
-two demo programs, {\tt cholmod\_demo} and {\tt cholmod\_l\_demo}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_etree}: find elimination tree}
-%---------------------------------------
-
-\input{_etree.tex}
-Computes the elimination tree of {\tt A} or {\tt A'*A}.
-In the symmetric case, the upper triangular part of {\tt A} is used.  Entries not
-in this part of the matrix are ignored.  Computing the etree of a symmetric
-matrix from just its lower triangular entries is not supported.
-In the unsymmetric case, all of {\tt A} is used, and the etree of {\tt A'*A} is computed.
-Refer to \cite{Liu90a} for a discussion of the elimination tree
-and its use in sparse Cholesky factorization.
-% J. Liu, "The role of elimination trees in sparse factorization", SIAM J.
-% Matrix Analysis \& Applic., vol 11, 1990, pp. 134-172.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowcolcounts}: nonzeros counts of a factor}
-%---------------------------------------
-
-\input{_rowcolcounts.tex}
-Compute the row and column counts of the Cholesky factor {\tt L} of the matrix
-{\tt A} or {\tt A*A'}.  The etree and its postordering must already be computed (see
-{\tt cholmod\_etree} and {\tt cholmod\_postorder}) and given as inputs to this routine.
-For the symmetric case ($\m{LL}\tr=\m{A}$), {\tt A} must be stored in
-symmetric/lower form ({\tt A->stype = -1}).
-In the unsymmetric case, {\tt A*A'} or {\tt A(:,f)*A(:,f)'} can be analyzed.
-The fundamental floating-point operation count is returned in {\tt Common->fl}
-(this excludes extra flops due to relaxed supernodal amalgamation).
-Refer to {\tt cholmod\_transpose\_unsym} for a description of {\tt f}.
-The algorithm is described in \cite{GilbertLiNgPeyton01,GilbertNgPeyton94}.
-
-% J. Gilbert, E. Ng, B. Peyton, "An efficient algorithm to compute row and
-% column counts for sparse Cholesky factorization", SIAM J. Matrix Analysis \&
-% Applic., vol 15, 1994, pp. 1075-1091.
-% 
-% J. Gilbert, X. Li, E. Ng, B. Peyton, "Computing row and column counts for
-% sparse QR and LU factorization", BIT, vol 41, 2001, pp. 693-710.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_analyze\_ordering}: analyze a permutation}
-%---------------------------------------
-
-\input{_analyze_ordering.tex}
-Given a matrix {\tt A} and its fill-reducing permutation, compute the elimination
-tree, its (non-weighted) postordering, and the number of nonzeros in each
-column of {\tt L}.  Also computes the flop count, the total nonzeros in {\tt L}, and
-the nonzeros in {\tt tril(A)} ({\tt Common->fl}, {\tt Common->lnz}, and {\tt Common->anz}).
-In the unsymmetric case, {\tt A(p,f)*A(p,f)'} is analyzed, and {\tt Common->anz}
-is the number of nonzero entries in the lower triangular part of the product,
-not in {\tt A} itself.
-
-Refer to {\tt cholmod\_transpose\_unsym} for a description of {\tt f}.
-
-The column counts of {\tt L}, flop count, and other statistics from
-{\tt cholmod\_rowcolcounts} are not computed if {\tt ColCount} is {\tt NULL}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_amd}: interface to AMD}
-%---------------------------------------
-
-\input{_amd.tex}
-CHOLMOD interface to the AMD ordering package.  Orders {\tt A} if the matrix is
-symmetric.  On output, {\tt Perm [k] = i} if row/column {\tt i} of {\tt A} is the {\tt k}th
-row/column of {\tt P*A*P'}.  This corresponds to {\tt A(p,p)} in MATLAB notation.
-If A is unsymmetric, {\tt cholmod\_amd} orders {\tt A*A'} or {\tt A(:,f)*A(:,f)'}.
-On output, {\tt Perm [k] = i} if
-row/column {\tt i} of {\tt A*A'} is the {\tt k}th row/column of {\tt P*A*A'*P'}.
-This corresponds to {\tt A(p,:)*A(p,:)'} in MATLAB notation.
-If {\tt f} is present, {\tt A(p,f)*A(p,f)'} is the permuted matrix.
-Refer to {\tt cholmod\_transpose\_unsym} for a description of {\tt f}.
-
-Computes the flop count for a subsequent $\m{LL}\tr$ factorization, the number
-of nonzeros in {\tt L}, and the number of nonzeros in the matrix ordered
-({\tt A}, {\tt A*A'} or {\tt A(:,f)*A(:,f)'}).
-These statistics are returned in
-{\tt Common->fl}, {\tt Common->lnz}, and {\tt Common->anz}, respectively.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_colamd}: interface to COLAMD}
-%---------------------------------------
-
-\input{_colamd.tex}
-CHOLMOD interface to the COLAMD ordering package.
-Finds a permutation {\tt p} such that the Cholesky factorization of {\tt P*A*A'*P'} is
-sparser than {\tt A*A'}, using COLAMD.  If the {\tt postorder} input parameter is {\tt TRUE},
-the column elimination tree is found and postordered, and the COLAMD ordering is then
-combined with its postordering (COLAMD itself does not perform this postordering).
-{\tt A} must be unsymmetric ({\tt A->stype = 0}).
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowfac}: row-oriented Cholesky factorization}
-%---------------------------------------
-
-\input{_rowfac.tex}
-Full or incremental numerical $\m{LDL}\tr$ or $\m{LL}\tr$ factorization (simplicial, not
-supernodal).  {\tt cholmod\_factorize} is the ``easy'' wrapper for this code, but it
-does not provide access to incremental factorization.
-The algorithm is the row-oriented, up-looking method described in \cite{Davis05}.
-See also \cite{Liu86c}.  No 2-by-2 pivoting (or any other pivoting) is performed.
-
-{\tt cholmod\_rowfac} computes the full or incremental $\m{LDL}\tr$ or $\m{LL}\tr$ factorization of
-{\tt A+beta*I} (where {\tt A} is symmetric) or {\tt A*F+beta*I}
-(where {\tt A} and {\tt F} are unsymmetric
-and only the upper triangular part of {\tt A*F+beta*I} is used).  It computes
-{\tt L} (and {\tt D}, for $\m{LDL}\tr$) one row at a time.
-The input scalar {\tt beta} is real; only the real part ({\tt beta[0]}) is used.
-
-{\tt L} can be a simplicial symbolic or numeric ({\tt L->is\_super} must be {\tt FALSE}).
-A symbolic factor is converted immediately into a numeric factor containing
-the identity matrix.
-
-For a full factorization, use {\tt kstart = 0} and {\tt kend = nrow}.  The existing nonzero
-entries (numerical values in {\tt L->x} and {\tt L->z} for the zomplex case, and indices
-in {\tt L->i}) are overwritten.
-
-To compute an incremental factorization, select {\tt kstart} and {\tt kend} as the range
-of rows of {\tt L} you wish to compute.    Rows {\tt kstart} to {\tt kend-1} of {\tt L}
-will be computed.  A correct factorization will be computed
-only if all descendants of all nodes {\tt kstart} to {\tt kend-1} in the elimination tree have
-been factorized by a prior call to this routine, and if rows {\tt kstart} to {\tt kend-1}
-have not been factorized.  This condition is {\bf not} checked on input.
-
-In the symmetric case, {\tt A} must be stored in upper form ({\tt A->stype} is greater than zero).
-The matrix {\tt F} is not accessed and may be {\tt NULL}.  Only
-columns {\tt kstart} to {\tt kend-1} of {\tt A} are accessed.
-
-In the unsymmetric case,
-	the typical case is {\tt F=A'}.  Alternatively, if {\tt F=A(:,f)'}, then this
-	routine factorizes the matrix {\tt S = beta*I + A(:,f)*A(:,f)'}.
-	The product {\tt A*F} is assumed to be symmetric;
-	only the upper triangular part of {\tt A*F} is used.
-	{\tt F} must be of size {\tt A->ncol} by {\tt A->nrow}.
-
-% J. Liu, "A compact row storage scheme for Cholesky factors", ACM Trans.
-% Math. Software, vol 12, 1986, pp. 127-148.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowfac\_mask}: row-oriented Cholesky factorization}
-%---------------------------------------
-
-\input{_rowfac_mask.tex}
-For use in LPDASA only.
-
-
-%---------------------------------------
-\subsection{{\tt cholmod\_row\_subtree}: pattern of row of a factor}
-%---------------------------------------
-
-\input{_row_subtree.tex}
-Compute the nonzero pattern of the solution to the lower triangular system
-\begin{verbatim}
-    L(0:k-1,0:k-1) * x = A (0:k-1,k)
-\end{verbatim}
-if {\tt A} is symmetric, or
-\begin{verbatim}
-    L(0:k-1,0:k-1) * x = A (0:k-1,:) * A (:,k)'
-\end{verbatim}
-if {\tt A} is unsymmetric.
-This gives the nonzero pattern of row {\tt k} of {\tt L} (excluding the diagonal).
-The pattern is returned postordered, according to the subtree of the elimination
-tree rooted at node {\tt k}.
-
-The symmetric case requires {\tt A} to be in symmetric-upper form.
-
-The result is returned in {\tt R}, a pre-allocated sparse matrix of size {\tt nrow}-by-1,
-with {\tt R->nzmax >= nrow}.  {\tt R} is assumed to be packed ({\tt Rnz [0]} is not updated);
-the number of entries in {\tt R} is given by {\tt Rp [0]}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_row\_lsubtree}: pattern of row of a factor}
-%---------------------------------------
-
-\input{_row_lsubtree.tex}
-Identical to {\tt cholmod\_row\_subtree}, except the elimination tree is
-found from {\tt L} itself, not {\tt Parent}.  Also, {\tt F=A'} is not provided;
-the nonzero pattern of the {\tt k}th column of {\tt F} is given by 
-{\tt Fi} and {\tt fnz} instead.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_resymbol}: re-do symbolic factorization}
-%---------------------------------------
-
-\input{_resymbol.tex}
-Recompute the symbolic pattern of {\tt L}.  Entries not in the symbolic pattern
-of the factorization of {\tt A(p,p)} or {\tt F*F'}, where
-{\tt F=A(p,f)} or {\tt F=A(:,f)}, are dropped, where
-{\tt p = L->Perm} is used to permute the input matrix {\tt A}.
-
-Refer to {\tt cholmod\_transpose\_unsym} for a description of {\tt f}.
-
-If an entry in {\tt L} is kept, its numerical value does not change.
-
-This routine is used after a supernodal factorization is converted into
-a simplicial one, to remove zero entries that were added due to relaxed
-supernode amalgamation.  It can also be used after a series of downdates
-to remove entries that would no longer be present if the matrix were
-factorized from scratch.  A downdate ({\tt cholmod\_updown}) does not remove any
-entries from {\tt L}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_resymbol\_noperm}: re-do symbolic factorization}
-%---------------------------------------
-
-\input{_resymbol_noperm.tex}
-Identical to {\tt cholmod\_resymbol}, except that the fill-reducing
-ordering {\tt L->Perm} is not used.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_postorder}: tree postorder}
-%---------------------------------------
-
-\input{_postorder.tex}
-Postorder a tree.  The tree is either an elimination tree (the output from
-{\tt cholmod\_etree}) or a component tree (from {\tt cholmod\_nested\_dissection}).
-
-An elimination tree is a complete tree of {\tt n} nodes with {\tt Parent [j] > j} or
-{\tt Parent [j] = -1} if j is a root.  On output {\tt Post [0..n-1]} is a complete
-permutation vector;
-{\tt Post [k] = j} if node {\tt j} is the {\tt k}th node in the
-postordered elimination tree, where {\tt k} is in the range 0 to {\tt n-1}.
-
-A component tree is a subset of {\tt 0:n-1}.  {\tt Parent [j] = -2} if node {\tt j} is not
-in the component tree.  {\tt Parent [j] = -1} if {\tt j} is a root of the component
-tree, and {\tt Parent [j]} is in the range 0 to {\tt n-1} if {\tt j} is in the component
-tree but not a root.  On output, {\tt Post [k]} is defined only for nodes in
-the component tree.  {\tt Post [k] = j} if node {\tt j} is the {\tt k}th node in the
-postordered component tree, where {\tt k} is in the range 0 to the number of
-components minus 1.
-Node {\tt j} is ignored and not included in the postorder if {\tt Parent [j] < -1}.
-As a result, {\tt cholmod\_check\_parent (Parent, ...)} and {\tt cholmod\_check\_perm (Post, ...)}
-fail if used for a component tree and its postordering.
-
-An optional node weight can be given.  When starting a postorder at node {\tt j},
-the children of {\tt j} are ordered in decreasing order of their weight.
-If no weights are given ({\tt Weight} is {\tt NULL}) then children are ordered in
-decreasing order of their node number.  The weight of a node must be in the
-range 0 to {\tt n-1}.  Weights outside that range are silently converted to that
-range (weights $<$ 0 are treated as zero, and weights $\ge$ {\tt n} are treated as {\tt n-1}).
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rcond}: reciprocal condition number}
-%---------------------------------------
-
-\input{_rcond.tex}
-Returns a rough estimate of the reciprocal of the condition number:
-the minimum entry on the diagonal of {\tt L} (or absolute entry of {\tt D} for an $\m{LDL}\tr$
-factorization) divided by the maximum entry.  {\tt L} can be real, complex, or
-zomplex.  Returns -1 on error, 0 if the matrix is singular or has a zero or NaN
-entry on the diagonal of {\tt L}, 1 if the matrix is 0-by-0, or
-{\tt min(diag(L))/max(diag(L))} otherwise.  Never returns NaN; if {\tt L} has a NaN on
-the diagonal it returns zero instead.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Modify} Module routines}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_updown}: update/downdate}
-%---------------------------------------
-
-\input{_updown.tex}
-Updates/downdates the $\m{LDL}\tr$ factorization (symbolic, then numeric), by
-computing a new factorization of
-\[
-\new{\m{L}}\new{\m{D}}\new{\m{L}}\tr = \m{LDL}\tr \pm \m{CC}\tr
-\]
-where $\new{\m{L}}$ denotes the new factor.
-{\tt C} must be sorted.  It can be either packed or unpacked.  As in all CHOLMOD
-routines, the columns of {\tt L} are sorted on input, and also on output.
-If {\tt L} does not contain a simplicial numeric $\m{LDL}\tr$ factorization, it
-is converted into one.  Thus, a supernodal $\m{LL}\tr$ factorization
-can be passed to {\tt cholmod\_updown}.
-A symbolic {\tt L} is converted into a numeric identity matrix.
-If the initial conversion fails, the factor is returned unchanged.
-
-If memory runs out during the update, the factor is returned as a simplicial
-symbolic factor.  That is, everything is freed except for the fill-reducing
-ordering and its corresponding column counts (typically computed by
-{\tt cholmod\_analyze}).
-
-Note that the fill-reducing permutation {\tt L->Perm} is not used.  The row
-indices of {\tt C} refer to the rows of {\tt L}, not {\tt A}.  If your original system is
-$\m{LDL}\tr = \m{PAP}\tr$ (where $\m{P} =$ {\tt L->Perm}), and you want to compute the $\m{LDL}\tr$
-factorization of $\m{A}+\m{CC}\tr$, then you must permute $\m{C}$ first.  That is,
-if
-\[
-    \m{PAP}\tr = \m{LDL}\tr
-\]
-is the initial factorization, then
-\[
-\m{P}(\m{A}+\m{CC}\tr)\m{P}\tr
-    = \m{PAP}\tr+\m{PCC}\tr\m{P}\tr
-    = \m{LDL}\tr + (\m{PC})(\m{PC})\tr
-    = \m{LDL}\tr + \new{\m{C}}\new{\m{C}}\tr
-\]
-where $\new{\m{C}} = \m{PC}$.
-
-You can use the {\tt cholmod\_submatrix} routine in the {\tt MatrixOps} Module
-to permute {\tt C}, with:
-\begin{verbatim}
-    Cnew = cholmod_submatrix (C, L->Perm, L->n, NULL, -1, TRUE, TRUE, Common) ;
-\end{verbatim}
-
-Note that the {\tt sorted} input parameter to {\tt cholmod\_submatrix} must be {\tt TRUE},
-because {\tt cholmod\_updown} requires {\tt C} with sorted columns.
-Only real matrices are supported.
-The algorithms are described in \cite{DavisHager99,DavisHager01}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_updown\_solve}: update/downdate}
-%---------------------------------------
-
-\input{_updown_solve.tex}
-Identical to {\tt cholmod\_updown}, except
-the system $\m{Lx}=\m{b}$ is also updated/downdated.
-The new system is $\new{\m{L}}\new{\m{x}}=\m{b} + \Delta \m{b}$.  The old solution $\m{x}$ is overwritten
-with $\new{\m{x}}$.  Note that as in the update/downdate of $\m{L}$ itself, the fill-
-reducing permutation {\tt L->Perm} is not used.  The vectors $\m{x}$ and $\m{b}$ are in the permuted
-ordering, not your original ordering.  This routine does not handle multiple right-hand-sides.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_updown\_mark}: update/downdate}
-%---------------------------------------
-
-\input{_updown_mark.tex}
-Identical to {\tt cholmod\_updown\_solve}, except that only part of $\m{L}$
-is used in the update of the solution to $\m{Lx}=\m{b}$.  For more details,
-see the source code file {\tt CHOLMOD/Modify/cholmod\_updown.c}.
-This routine is meant for use in the {\tt LPDASA} linear program solver only,
-by Hager and Davis.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_updown\_mask}: update/downdate}
-%---------------------------------------
-
-\input{_updown_mask.tex}
-For use in LPDASA only.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowadd}: add row to factor}
-%---------------------------------------
-
-\input{_rowadd.tex}
-Adds a row and column to an $\m{LDL}\tr$ factorization.  The {\tt k}th
-row and column of {\tt L} must be equal to the {\tt k}th row and
-column of the identity matrix on input.
-Only real matrices are supported.
-The algorithm is described in \cite{DavisHager05}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowadd\_solve}: add row to factor}
-%---------------------------------------
-
-\input{_rowadd_solve.tex}
-Identical to {\tt cholmod\_rowadd}, except the system $\m{Lx}=\m{b}$ is also updated/downdated, just like {\tt cholmod\_updown\_solve}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowdel}: delete row from factor}
-%---------------------------------------
-
-\input{_rowdel.tex}
-Deletes a row and column from an $\m{LDL}\tr$ factorization.  The {\tt k}th
-row and column of {\tt L} is equal to the {\tt k}th row and
-column of the identity matrix on output.
-Only real matrices are supported.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowdel\_solve}: delete row from factor}
-%---------------------------------------
-
-\input{_rowdel_solve.tex}
-Identical to {\tt cholmod\_rowdel}, except the system $\m{Lx}=\m{b}$ is also updated/downdated, just like {\tt cholmod\_updown\_solve}.
-When row/column $k$ of $\m{A}$ is deleted from the system $\m{Ay}=\m{b}$, this can induce
-a change to $\m{x}$, in addition to changes arising when $\m{L}$ and $\m{b}$ are modified.
-If this is the case, the kth entry of $\m{y}$ is required as input ({\tt yk}).
-The algorithm is described in \cite{DavisHager05}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowadd\_mark}: add row to factor}
-%---------------------------------------
-
-\input{_rowadd_mark.tex}
-Identical to {\tt cholmod\_rowadd\_solve}, except that only part of $\m{L}$
-is used in the update of the solution to $\m{Lx}=\m{b}$.  For more details,
-see the source code file {\tt CHOLMOD/Modify/cholmod\_rowadd.c}.
-This routine is meant for use in the {\tt LPDASA} linear program solver only.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_rowdel\_mark}: delete row from factor}
-%---------------------------------------
-
-\input{_rowdel_mark.tex}
-Identical to {\tt cholmod\_rowadd\_solve}, except that only part of $\m{L}$
-is used in the update of the solution to $\m{Lx}=\m{b}$.  For more details,
-see the source code file {\tt CHOLMOD/Modify/cholmod\_rowdel.c}.
-This routine is meant for use in the {\tt LPDASA} linear program solver only.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt MatrixOps} Module routines}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_drop}: drop small entries}
-%---------------------------------------
-
-\input{_drop.tex}
-Drop small entries from {\tt A}, and entries in the ignored part of {\tt A} if {\tt A}
-is symmetric.  No CHOLMOD routine drops small numerical entries
-from a matrix, except for this one.  NaN's and Inf's are kept.
-
-Supports pattern and real matrices; complex and zomplex matrices are not supported.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_norm\_dense}: dense matrix norm}
-%---------------------------------------
-
-\input{_norm_dense.tex}
-Returns the infinity-norm, 1-norm, or 2-norm of a dense matrix.
-Can compute the 2-norm only for a dense column vector.
-All xtypes are supported.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_norm\_sparse}: sparse matrix norm}
-%---------------------------------------
-
-\input{_norm_sparse.tex}
-Returns the infinity-norm or 1-norm of a sparse matrix.
-All xtypes are supported.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_scale}: scale sparse matrix}
-%---------------------------------------
-
-\input{_scale.tex}
-Scales a matrix:  {\tt A = diag(s)*A}, {\tt A*diag(s)}, {\tt s*A}, or {\tt diag(s)*A*diag(s)}.
-
-{\tt A} can be of any type (packed/unpacked, upper/lower/unsymmetric).
-The symmetry of {\tt A} is ignored; all entries in the matrix are modified.
-
-If {\tt A} is {\tt m}-by-{\tt n} unsymmetric but scaled symmetrically, the result is
-\begin{verbatim}
-    A = diag (s (1:m)) * A * diag (s (1:n))
-\end{verbatim}
-
-Row or column scaling of a symmetric matrix still results in a symmetric
-matrix, since entries are still ignored by other routines.
-For example, when row-scaling a symmetric matrix where just the upper
-triangular part is stored (and lower triangular entries ignored)
-{\tt A = diag(s)*triu(A)} is performed, where the result {\tt A} is also
-symmetric-upper.  This has the effect of modifying the implicit lower
-triangular part.  In MATLAB notation:
-\begin{verbatim}
-    U = diag(s)*triu(A) ;
-    L = tril (U',-1)
-    A = L + U ;
-\end{verbatim}
-
-The scale parameter determines the kind of scaling to perform and the size of {\tt S}:
-
-\begin{tabular}{lll}
-\hline
-{\tt scale} & operation & size of {\tt S} \\
-\hline
-{\tt CHOLMOD\_SCALAR} & {\tt s[0]*A}		& 1 \\
-{\tt CHOLMOD\_ROW}    & {\tt diag(s)*A}		& {\tt nrow}-by-1 or 1-by-{\tt nrow} \\
-{\tt CHOLMOD\_COL}    & {\tt A*diag(s)}		& {\tt ncol}-by-1 or 1-by-{\tt ncol} \\
-{\tt CHOLMOD\_SYM}    & {\tt diag(s)*A*diag(s)}	& {\tt max(nrow,ncol)}-by-1, or 1-by-{\tt max(nrow,ncol)} \\
-\hline
-\end{tabular}
-
-Only real matrices are supported.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_sdmult}: sparse-times-dense matrix}
-%---------------------------------------
-
-\input{_sdmult.tex}
-Sparse matrix times dense matrix:
-{\tt Y = alpha*(A*X) + beta*Y} or {\tt Y = alpha*(A'*X) + beta*Y},
-where {\tt A} is sparse and {\tt X} and {\tt Y} are dense.
-When using {\tt A},
-{\tt X} has {\tt A->ncol} rows and
-{\tt Y} has {\tt A->nrow} rows.
-When using {\tt A'},
-{\tt X} has {\tt A->nrow} rows and
-{\tt Y} has {\tt A->ncol} rows.
-If {\tt transpose = 0}, then {\tt A} is used;
-otherwise, {\tt A'} is used (the complex conjugate transpose).
-The {\tt transpose} parameter is ignored if the matrix is symmetric or Hermitian.
-(the array transpose {\tt A.'} is not supported).
-Supports real, complex, and zomplex matrices, but the xtypes of {\tt A}, {\tt X}, and {\tt Y} must all match.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_ssmult}: sparse-times-sparse matrix}
-%---------------------------------------
-
-\input{_ssmult.tex}
-Computes {\tt C = A*B}; multiplying two sparse matrices.
-{\tt C} is returned as packed, and either unsorted or sorted, depending on the
-{\tt sorted} input parameter.  If {\tt C} is returned sorted, then either {\tt C = (B'*A')'}
-or {\tt C = (A*B)''} is computed, depending on the number of nonzeros in {\tt A}, {\tt B}, and {\tt C}.
-The stype of {\tt C} is determined by the {\tt stype} parameter.
-Only pattern and real matrices are supported.  Complex and zomplex matrices
-are supported only when the numerical values are not computed ({\tt values}
-is {\tt FALSE}).
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_submatrix}: sparse submatrix}
-%---------------------------------------
-
-\input{_submatrix.tex}
-Returns {\tt C = A (rset,cset)}, where {\tt C} becomes {\tt length(rset)}-by-{\tt length(cset)} in dimension.
-{\tt rset} and {\tt cset} can have duplicate entries.  {\tt A} must be unsymmetric.  {\tt C} unsymmetric and
-is packed.  If {\tt sorted} is {\tt TRUE} on input, or {\tt rset} is sorted and {\tt A} is
-sorted, then {\tt C} is sorted; otherwise {\tt C} is unsorted.
-
-If {\tt rset} is {\tt NULL}, it means ``{\tt [ ]}'' in MATLAB notation, the empty set.
-The number of rows in the result {\tt C} will be zero if {\tt rset} is {\tt NULL}.
-Likewise if {\tt cset} means the empty set; the number of columns in the result {\tt C} will be zero if {\tt cset} is {\tt NULL}.
-If {\tt rsize} or {\tt csize} is negative, it denotes ``{\tt :}'' in MATLAB notation.
-Thus, if both {\tt rsize} and {\tt csize} are negative {\tt C = A(:,:) = A} is returned.
-
-For permuting a matrix, this routine is an alternative to {\tt cholmod\_ptranspose}
-(which permutes and transposes a matrix and can work on symmetric matrices).
-
-The time taken by this routine is O({\tt A->nrow}) if the {\tt Common} workspace needs
-to be initialized, plus O({\tt C->nrow + C->ncol + nnz (A (:,cset))}).  Thus, if {\tt C}
-is small and the workspace is not initialized, the time can be dominated by
-the call to {\tt cholmod\_allocate\_work}.  However, once the workspace is
-allocated, subsequent calls take less time.
-
-Only pattern and real matrices are supported.  Complex and zomplex matrices
-are supported only when {\tt values} is {\tt FALSE}.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_horzcat}: horizontal concatenation}
-%---------------------------------------
-
-\input{_horzcat.tex}
-Horizontal concatenation, returns {\tt C = [A,B]} in MATLAB notation.
-{\tt A} and {\tt B} can have any stype.  {\tt C} is returned unsymmetric and packed.
-{\tt A} and {\tt B} must have the same number of rows.
-{\tt C} is sorted if both {\tt A} and {\tt B} are sorted.
-{\tt A} and {\tt B} must have the same numeric xtype, unless {\tt values} is {\tt FALSE}.
-{\tt A} and {\tt B} cannot be complex or zomplex, unless {\tt values} is {\tt FALSE}.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_vertcat}: vertical concatenation}
-%---------------------------------------
-
-\input{_vertcat.tex}
-Vertical concatenation, returns {\tt C = [A;B]} in MATLAB notation.
-{\tt A} and {\tt B} can have any stype.  {\tt C} is returned unsymmetric and packed.
-{\tt A} and {\tt B} must have the same number of columns.
-{\tt C} is sorted if both {\tt A} and {\tt B} are sorted.
-{\tt A} and {\tt B} must have the same numeric xtype, unless {\tt values} is {\tt FALSE}.
-{\tt A} and {\tt B} cannot be complex or zomplex, unless {\tt values} is {\tt FALSE}.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_symmetry}: compute the symmetry of a matrix}
-%---------------------------------------
-
-\input{_symmetry.tex}
-
-Determines if a sparse matrix is rectangular, unsymmetric, symmetric,
-skew-symmetric, or Hermitian.  It does so by looking at its numerical values
-of both upper and lower triangular parts of a CHOLMOD "unsymmetric"
-matrix, where A->stype == 0.  The transpose of A is NOT constructed.
-
-If not unsymmetric, it also determines if the matrix has a diagonal whose
-entries are all real and positive (and thus a candidate for sparse Cholesky
-if A->stype is changed to a nonzero value).
-
-Note that a Matrix Market "general" matrix is either rectangular or
-unsymmetric.
-
-The row indices in the column of each matrix MUST be sorted for this function
-to work properly (A->sorted must be TRUE).  This routine returns EMPTY if
-A->stype is not zero, or if A->sorted is FALSE.  The exception to this rule
-is if A is rectangular.
-
-If option == 0, then this routine returns immediately when it finds a
-non-positive diagonal entry (or one with nonzero imaginary part).   If the
-matrix is not a candidate for sparse Cholesky, it returns the value
-{\tt CHOLMOD\_MM\_UNSYMMETRIC}, even if the matrix might in fact be symmetric or
-Hermitian.
-
-This routine is useful inside the MATLAB backslash, which must look at an
-arbitrary matrix (A->stype == 0) and determine if it is a candidate for
-sparse Cholesky.  In that case, option should be 0.
-
-This routine is also useful when writing a MATLAB matrix to a file in
-Rutherford/Boeing or Matrix Market format.  Those formats require a
-determination as to the symmetry of the matrix, and thus this routine should
-not return upon encountering the first non-positive diagonal.  In this case,
-option should be 1.
-
-If option is 2, this function can be used to compute the numerical and
-pattern symmetry, where 0 is a completely unsymmetric matrix, and 1 is a
-perfectly symmetric matrix.  This option is used when computing the following
-statistics for the matrices in the UF Sparse Matrix Collection.
-
-	numerical symmetry: number of matched off-diagonal nonzeros over
-	the total number of off-diagonal entries.  A real entry $a_{ij}$,  $i \ne j$,
-	is matched if $a_{ji} = a_{ij}$, but this is only counted if both
-	$a_{ji}$ and $a_{ij}$ are nonzero.  This does not depend on {\tt Z}.
-	(If A is complex, then the above test is modified; $a_{ij}$ is matched
-	if $\mbox{conj}(a_{ji}) = a_{ij}$.
-
-	Then numeric symmetry = xmatched / nzoffdiag, or 1 if nzoffdiag = 0.
- 
-	pattern symmetry: number of matched offdiagonal entries over the
-	total number of offdiagonal entries.  An entry $a_{ij}$, $i \ne j$, is
-	matched if $a_{ji}$ is also an entry.
-
-	Then pattern symmetry = pmatched / nzoffdiag, or 1 if nzoffdiag = 0.
- 
-The symmetry of a matrix with no offdiagonal entries is equal to 1.
-
-A workspace of size ncol integers is allocated; EMPTY is returned if this
-allocation fails.
-
-Summary of return values:
-
-\begin{tabular}{ll}
-{\tt EMPTY (-1)}		    & out of memory, stype not zero, A not sorted \\
-{\tt CHOLMOD\_MM\_RECTANGULAR 1}    & A is rectangular \\
-{\tt CHOLMOD\_MM\_UNSYMMETRIC 2}    & A is unsymmetric \\
-{\tt CHOLMOD\_MM\_SYMMETRIC 3}	    & A is symmetric, but with non-pos. diagonal \\
-{\tt CHOLMOD\_MM\_HERMITIAN 4}	    & A is Hermitian, but with non-pos. diagonal \\
-{\tt CHOLMOD\_MM\_SKEW\_SYMMETRIC 5}    & A is skew symmetric \\
-{\tt CHOLMOD\_MM\_SYMMETRIC\_POSDIAG 6} & A is symmetric with positive diagonal \\
-{\tt CHOLMOD\_MM\_HERMITIAN\_POSDIAG 7} & A is Hermitian with positive diagonal \\
-\end{tabular}
-
-See also the {\tt spsym} mexFunction, which is a MATLAB interface for this code.
-
-If the matrix is a candidate for sparse Cholesky, it will return a result
-\newline
-{\tt CHOLMOD\_MM\_SYMMETRIC\_POSDIAG} if real, or {\tt CHOLMOD\_MM\_HERMITIAN\_POSDIAG} if
-complex.  Otherwise, it will return a value less than this.  This is true
-regardless of the value of the option parameter.
-
-
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Supernodal} Module routines}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_super\_symbolic}: supernodal symbolic factorization}
-%---------------------------------------
-
-\input{_super_symbolic.tex}
-Supernodal symbolic analysis of the $\m{LL}\tr$ factorization of {\tt A}, {\tt A*A'}, or {\tt A(:,f)*A(:,f)'}.
-This routine must be preceded by a simplicial symbolic analysis
-({\tt cholmod\_rowcolcounts}).  See {\tt Cholesky/cholmod\_analyze.c} for an example of how to use
-this routine.
-The user need not call this directly; {\tt cholmod\_analyze} is a ``simple'' wrapper for this routine.
-{\tt A} can be symmetric (upper), or unsymmetric.  The symmetric/lower form is not supported.
-In the unsymmetric case {\tt F} is the normally transpose of {\tt A}.
-Alternatively, if {\tt F=A(:,f)'} then {\tt F*F'} is analyzed.
-Requires {\tt Parent} and {\tt L->ColCount} to be defined on input; these are the
-simplicial {\tt Parent} and {\tt ColCount} arrays as computed by {\tt cholmod\_rowcolcounts}.
-Does not use {\tt L->Perm}; the input matrices {\tt A} and {\tt F} must already be properly
-permuted.  Allocates and computes the supernodal pattern of {\tt L}
-({\tt L->super}, {\tt L->pi}, {\tt L->px}, and {\tt L->s}).
-Does not allocate the real part ({\tt L->x}).
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_super\_numeric}: supernodal numeric factorization}
-%---------------------------------------
-
-\input{_super_numeric.tex}
-Computes the numerical Cholesky factorization of {\tt A+beta*I} or {\tt A*F+beta*I}.  Only the
-lower triangular part of {\tt A+beta*I} or {\tt A*F+beta*I} is accessed.  The
-matrices {\tt A} and {\tt F} must already be permuted according to the fill-reduction
-permutation {\tt L->Perm}.  {\tt cholmod\_factorize} is an "easy" wrapper for this code
-which applies that permutation.
-The input scalar {\tt beta} is real; only the real part ({\tt beta[0]} is used.
-
-Symmetric case: {\tt A} is a symmetric (lower) matrix.  {\tt F} is not accessed and may be {\tt NULL}.
-With a fill-reducing permutation, {\tt A(p,p)} should be passed for {\tt A}, where is
-{\tt p} is {\tt L->Perm}.
-
-Unsymmetric case: {\tt A} is unsymmetric, and {\tt F} must be present.  Normally, {\tt F=A'}.
-With a fill-reducing permutation, {\tt A(p,f)} and {\tt A(p,f)'} should be passed as the
-parameters {\tt A} and {\tt F}, respectively, where {\tt f} is a list of the subset of the columns of {\tt A}.
-
-The input factorization {\tt L} must be supernodal ({\tt L->is\_super} is {\tt TRUE}).  It can
-either be symbolic or numeric.  In the first case, {\tt L} has been analyzed by
-{\tt cholmod\_analyze} or {\tt cholmod\_super\_symbolic}, but the matrix has not yet been
-numerically factorized.  The numerical values are allocated here and the
-factorization is computed.  In the second case, a prior matrix has been
-analyzed and numerically factorized, and a new matrix is being factorized.
-The numerical values of {\tt L} are replaced with the new numerical factorization.
-
-{\tt L->is\_ll} is ignored on input, and set to {\tt TRUE} on output.  This routine always computes an $\m{LL}\tr$
-factorization.  Supernodal $\m{LDL}\tr$ factorization is not supported.
-
-If the matrix is not positive definite the routine returns {\tt TRUE}, but sets
-{\tt Common->status} to {\tt CHOLMOD\_NOT\_POSDEF} and {\tt L->minor} is set to the column at
-which the failure occurred.  Columns {\tt L->minor} to {\tt L->n-1} are set to zero.
-
-If {\tt L} is supernodal symbolic on input, it is converted to a supernodal numeric
-factor on output, with an xtype of real if {\tt A} is real, or complex if {\tt A} is
-complex or zomplex.  If {\tt L} is supernodal numeric on input, its xtype must
-match {\tt A} (except that {\tt L} can be complex and {\tt A} zomplex).  The xtype of {\tt A} and {\tt F}
-must match.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_super\_lsolve}: supernodal forward solve}
-%---------------------------------------
-
-\input{_super_lsolve.tex}
-Solve $\m{Lx}=\m{b}$ for a supernodal factorization.  This routine does not
-apply the permutation {\tt L->Perm}.  See {\tt cholmod\_solve} for a more general
-interface that performs that operation.
-Only real and complex xtypes are supported.
-{\tt L}, {\tt X}, and {\tt E} must have the same xtype.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_super\_ltsolve}: supernodal backsolve}
-%---------------------------------------
-
-\input{_super_ltsolve.tex}
-Solve $\m{L}\tr\m{x}=\m{b}$ for a supernodal factorization.  This routine does not
-apply the permutation {\tt L->Perm}.  See {\tt cholmod\_solve} for a more general
-interface that performs that operation.
-Only real and complex xtypes are supported.
-{\tt L}, {\tt X}, and {\tt E} must have the same xtype.
-
-%-------------------------------------------------------------------------------
-\newpage \section{{\tt Partition} Module routines}
-%-------------------------------------------------------------------------------
-
-%---------------------------------------
-\subsection{{\tt cholmod\_nested\_dissection}: nested dissection ordering}
-%---------------------------------------
-
-\input{_nested_dissection.tex}
-CHOLMOD's nested dissection algorithm:
-	using its own compression and connected-components
-	algorithms, an external graph partitioner (METIS), and a constrained
-	minimum degree ordering algorithm (CAMD, CCOLAMD, or CSYMAMD).  Typically
-	gives better orderings than {\tt METIS\_NodeND} (about 5\% to 10\% fewer
-	nonzeros in {\tt L}).
-
-This method uses a node bisector, applied recursively (but using a
-non-recursive implementation).  Once the graph is partitioned, it calls a
-constrained minimum degree code (CAMD or CSYMAMD for {\tt A+A'},
-and CCOLAMD for {\tt A*A'}) to
-order all the nodes in the graph - but obeying the constraints determined
-by the separators.  This routine is similar to {\tt METIS\_NodeND}, except for
-how
-it treats the leaf nodes.  {\tt METIS\_NodeND} orders the leaves of the separator
-tree with {\tt MMD}, ignoring the rest of the matrix when ordering a single leaf.
-This routine orders the whole matrix with CAMD, CSYMAMD, or CCOLAMD, all at once,
-when the graph partitioning is done.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_metis}: interface to METIS nested dissection}
-%---------------------------------------
-
-\input{_metis.tex}
-CHOLMOD wrapper for the {\tt METIS\_NodeND} ordering routine.  Creates {\tt A+A'},
-{\tt A*A'} or {\tt A(:,f)*A(:,f)'} and then calls {\tt METIS\_NodeND} on the resulting graph.
-This routine is comparable to {\tt cholmod\_nested\_dissection}, except that it
-calls {\tt METIS\_NodeND} directly, and it does not return the separator tree.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_camd}: interface to CAMD}
-%---------------------------------------
-
-\input{_camd.tex}
-CHOLMOD interface to the CAMD ordering routine.  Finds a permutation
-{\tt p} such that the Cholesky factorization of {\tt A(p,p)}
-is sparser than {\tt A}.  If {\tt A} is unsymmetric,
-{\tt A*A'} is ordered.
-If {\tt Cmember[i]=c} then node {\tt i} is in set {\tt c}.
-All nodes in set 0 are ordered first, followed by all nodes in set 1, and so on.
-
-%---------------------------------------
-\newpage \subsection{{\tt cholmod\_ccolamd}: interface to CCOLAMD}
-%---------------------------------------
-
-\input{_ccolamd.tex}
-CHOLMOD interface to the CCOLAMD ordering routine.  Finds a permutation
-{\tt p} such that the Cholesky factorization of {\tt A(p,:)*A(p,:)'} is sparser than {\tt A*A'}.
-The column elimination is found and postordered, and the CCOLAMD ordering is then
-combined with its postordering.  {\tt A} must be unsymmetric.
-If {\tt Cmember[i]=c} then node {\tt i} is in set {\tt c}.
-All nodes in set 0 are ordered first, followed by all nodes in set 1, and so on.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_csymamd}: interface to CSYMAMD}
-%---------------------------------------
-
-\input{_csymamd.tex}
-CHOLMOD interface to the CSYMAMD ordering routine.  Finds a permutation
-{\tt p} such that the Cholesky factorization of {\tt A(p,p)} is sparser than {\tt A}.
-The elimination tree is found and postordered, and the CSYMAMD
-ordering is then combined with its postordering.  If {\tt A} is unsymmetric,
-{\tt A+A'} is ordered ({\tt A} must be square).
-If {\tt Cmember[i]=c} then node {\tt i} is in set {\tt c}.
-All nodes in set 0 are ordered first, followed by all nodes in set 1, and so on.
-
-%---------------------------------------
-\newpage
-\subsection{{\tt cholmod\_bisect}: graph bisector}
-%---------------------------------------
-
-\input{_bisect.tex}
-Finds a node bisector of {\tt A}, {\tt A*A'}, {\tt A(:,f)*A(:,f)'}:
-a set of nodes that partitions the graph into two parts.
-Compresses the graph first, and then calls METIS.
-
-%---------------------------------------
-\subsection{{\tt cholmod\_metis\_bisector}: interface to METIS node bisector}
-%---------------------------------------
-
-\input{_metis_bisector.tex}
-Finds a set of nodes that bisects the graph of {\tt A} or {\tt A*A'} (a direct interface to \newline
-{\tt METIS\_NodeComputeSeparator}).
-
-The input matrix {\tt A} must be square, symmetric (with both upper and lower
-parts present) and with no diagonal entries.  These conditions are not
-checked.
-
-%---------------------------------------
-\newpage
-\subsection{{\tt cholmod\_collapse\_septree}: prune a separator tree}
-%---------------------------------------
-
-\input{_collapse_septree.tex}
-Prunes a separator tree obtained from {\tt cholmod\_nested\_dissection}.
-
-\newpage
-\bibliographystyle{plain}
-\bibliography{UserGuide}
-\end{document}
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/footer.tex b/src/C/SuiteSparse/CHOLMOD/Doc/footer.tex
deleted file mode 100644
index 112a2d1..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/footer.tex
+++ /dev/null
@@ -1,6 +0,0 @@
-\end{verbatim}
-}
-\noindent\hspace{0.85in}\rule[0.25in]{5.2in}{1pt}
-\vspace{-0.15in}
-
-\noindent {\bf Purpose:}
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/getmproto b/src/C/SuiteSparse/CHOLMOD/Doc/getmproto
deleted file mode 100755
index 644a48c..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/getmproto
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-cat mheader.tex
-expand -8 $1 | awk -f mfile.awk
-cat mfooter.tex
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/getproto b/src/C/SuiteSparse/CHOLMOD/Doc/getproto
deleted file mode 100755
index b3b30a6..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/getproto
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-echo -n $1 > _temp.awk
-cat rule.awk >> _temp.awk
-cat header.tex
-expand -8 $2 | awk -f _temp.awk
-cat footer.tex
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/header.tex b/src/C/SuiteSparse/CHOLMOD/Doc/header.tex
deleted file mode 100644
index 4f28f1b..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/header.tex
+++ /dev/null
@@ -1,4 +0,0 @@
-\noindent\hspace{0.85in}\rule[0.05in]{5.2in}{1pt}
-\vspace{-0.15in}
-{\footnotesize
-\begin{verbatim}
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/mfile.awk b/src/C/SuiteSparse/CHOLMOD/Doc/mfile.awk
deleted file mode 100644
index 5106442..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/mfile.awk
+++ /dev/null
@@ -1 +0,0 @@
-/^%/ { print "            ", substr ($0,2) }
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/mfooter.tex b/src/C/SuiteSparse/CHOLMOD/Doc/mfooter.tex
deleted file mode 100644
index 4bce503..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/mfooter.tex
+++ /dev/null
@@ -1,4 +0,0 @@
-\end{verbatim}
-}
-\noindent\hspace{0.85in}\rule[0.25in]{5.2in}{1pt}
-\vspace{-0.15in}
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/mheader.tex b/src/C/SuiteSparse/CHOLMOD/Doc/mheader.tex
deleted file mode 100644
index 90d3203..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/mheader.tex
+++ /dev/null
@@ -1,5 +0,0 @@
-
-\noindent\hspace{0.85in}\rule[0.05in]{5.2in}{1pt}
-\vspace{-0.15in}
-{\footnotesize
-\begin{verbatim}
diff --git a/src/C/SuiteSparse/CHOLMOD/Doc/rule.awk b/src/C/SuiteSparse/CHOLMOD/Doc/rule.awk
deleted file mode 100644
index 16e6ac1..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Doc/rule.awk
+++ /dev/null
@@ -1 +0,0 @@
-{ print "            ", $0 }
diff --git a/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu.c b/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu.c
deleted file mode 100644
index 31007f8..0000000
--- a/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/* ========================================================================== */
-/* === GPU/cholmod_gpu -===================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/GPU Module.  Copyright (C) 2014, Timothy A. Davis.
- * The CHOLMOD/GPU 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
- * -------------------------------------------------------------------------- */
-
-/* Primary routines:
- * -----------------
- * cholmod_gpu_memorysize       determine free memory on current GPU
- * cholmod_gpu_probe            ensure a GPU is available
- * cholmod_gpu_allocate         allocate GPU resources
- * cholmod_gpu_deallocate       free GPU resources
- */
-
-#include "cholmod_internal.h"
-#include "cholmod_core.h"
-#include "cholmod_gpu.h"
-#include "stdio.h"
-#ifdef GPU_BLAS
-#include <cuda_runtime.h>
-#endif
-
-#define MINSIZE (64 * 1024 * 1024)
-
-/* ========================================================================== */
-/* === cholmod_gpu_memorysize =============================================== */
-/* ========================================================================== */
-
-/* Determine the amount of free memory on the current GPU.  To use another
- * GPU, use cudaSetDevice (k) prior to calling this routine, where k is an
- * integer in the range 0 to the number of devices-1.   If the free size is
- * less than 64 MB, then a size of 1 is returned.  Normal usage:
- *
- *  Common->useGPU = 1 ;
- *  err = cholmod_gpu_memorysize (&totmem, &availmem, Common);
- *  Returns 1 if GPU requested but not available, 0 otherwise
- */
-
-#ifdef GPU_BLAS
-
-static int poll_gpu (size_t s)          /* TRUE if OK, FALSE otherwise */
-{
-    /* Returns TRUE if the GPU has a block of memory of size s,
-       FALSE otherwise.  The block of memory is immediately freed. */
-    void *p = NULL ;
-    /* double t = SuiteSparse_time ( ) ; */
-    if (s == 0)
-    {
-        return (FALSE) ;
-    }
-    if (cudaMalloc (&p, s) != cudaSuccess)
-    {
-        /* t = SuiteSparse_time ( ) - t ; */
-        /* printf ("s %lu failed, time %g\n", s, t) ; */
-        return (FALSE) ;
-    }
-    cudaFree (p) ;
-    /* t = SuiteSparse_time ( ) - t ; */
-    /* printf ("s %lu OK time %g\n", s, t) ; */
-    return (TRUE) ;
-}
-
-#endif
-
-int CHOLMOD(gpu_memorysize)      /* returns 1 on error, 0 otherwise */
-(
-    size_t         *total_mem,
-    size_t         *available_mem,
-    cholmod_common *Common
-)
-{
-    size_t good, bad, s, total_free, total_memory ;
-    int k ;
-    double t ;
-
-    *total_mem = 0;
-    *available_mem = 0;
-#ifndef DLONG
-    return 0;
-#endif
-
-    if (Common->useGPU != 1)
-    {
-        return (0) ;                    /* not using the GPU at all */
-    }
-
-#ifdef GPU_BLAS
-
-    /* find the total amount of free memory */
-    t = SuiteSparse_time ( ) ;
-    cudaMemGetInfo (&total_free, &total_memory) ;
-    t = SuiteSparse_time ( ) - t ;
-    /* printf ("free %lu tot %lu time %g\n", total_free, total_memory, t) ; */
-
-    *total_mem = total_memory;
-
-    if (total_free < MINSIZE)
-    {
-        return (1) ;                    /* not even 64MB; return failure code */
-    }
-
-    /* try a bit less than the total free memory */
-    s = MAX (MINSIZE, total_free*0.98) ;
-    if (poll_gpu (s))
-    {
-        /* printf ("quick %lu\n", s) ; */
-        *available_mem = s;
-        return (0) ;  /* no error */
-    }
-
-    /* ensure s = 64 MB is OK */
-    if (!poll_gpu (MINSIZE))
-    {
-        return (1) ;                    /* not even 64MB; return failure code */
-    }
-
-    /* 8 iterations of binary search */
-    good = MINSIZE ;                    /* already known to be OK */
-    bad  = total_free ;                 /* already known to be bad */
-    for (k = 0 ; k < 8 ; k++)
-    {
-        s = (good + bad) / 2 ;
-        if (poll_gpu (s))
-        {
-            good = s ;                  /* s is OK, increase good */
-        }
-        else
-        {
-            bad = s ;                   /* s failed, decrease bad */
-        }
-    }
-
-    /* printf ("final %lu\n", good) ; */
-    *available_mem = good;
-
-#endif
-
-    return (0) ; /* no error */
-}
-
-
-/* ========================================================================== */
-/* === cholmod_gpu_probe ==================================================== */
-/* ========================================================================== */
-/*
- * Used to ensure that a suitable GPU is available.  As this version of
- * CHOLMOD can only utilize a single GPU, only the default (i.e. selected as
- * 'best' by the NVIDIA driver) is verified as suitable.  If this selection
- * is incorrect, the user can select the proper GPU with the
- * CUDA_VISIBLE_DEVICES environment variable.
- *
- * To be considered suitable, the GPU must have a compute capability > 1 and
- * more than 1 GB of device memory.
- */
-
-int CHOLMOD(gpu_probe) ( cholmod_common *Common )
-{
-
-#ifdef GPU_BLAS
-    int ngpus, idevice;
-    double tstart, tend;
-    struct cudaDeviceProp gpuProp;
-
-    if (Common->useGPU != 1)
-    {
-        return (0) ;
-    }
-
-    cudaGetDeviceCount(&ngpus);
-
-    if ( ngpus ) {
-        cudaGetDevice ( &idevice );
-        cudaGetDeviceProperties ( &gpuProp, idevice );
-        if ( gpuProp.major > 1 && 1.0e-9*gpuProp.totalGlobalMem > 1.0 ) {
-            return 1;  /* useGPU = 1 */
-        }
-    }
-    CHOLMOD_GPU_PRINTF (("GPU WARNING: useGPUs was selected, "
-        "but no applicable GPUs were found. useGPU reset to FALSE.\n")) ;
-#endif
-
-    /* no GPU is available */
-    return 0;  /* useGPU = 0 */
-}
-
-/* ========================================================================== */
-/* === cholmod_gpu_deallocate =============================================== */
-/* ========================================================================== */
-
-/*
- * Deallocate all GPU related buffers.
- */
-
-int CHOLMOD(gpu_deallocate)
-(
-    cholmod_common *Common
-)
-{
-
-#ifdef GPU_BLAS
-    cudaError_t cudaErr;
-
-    if ( Common->dev_mempool )
-    {
-        /* fprintf (stderr, "free dev_mempool\n") ; */
-        cudaErr = cudaFree (Common->dev_mempool);
-        /* fprintf (stderr, "free dev_mempool done\n") ; */
-        if ( cudaErr )
-        {
-            ERROR ( CHOLMOD_GPU_PROBLEM,
-                    "GPU error when freeing device memory.");
-        }
-    }
-    Common->dev_mempool = NULL;
-    Common->dev_mempool_size = 0;
-
-    if ( Common->host_pinned_mempool )
-    {
-        /* fprintf (stderr, "free host_pinned_mempool\n") ; */
-        cudaErr = cudaFreeHost ( Common->host_pinned_mempool );
-        /* fprintf (stderr, "free host_pinned_mempool done\n") ; */
-        if ( cudaErr )
-        {
-            ERROR ( CHOLMOD_GPU_PROBLEM,
-                    "GPU error when freeing host pinned memory.");
-        }
-    }
-    Common->host_pinned_mempool = NULL;
-    Common->host_pinned_mempool_size = 0;
-
-    CHOLMOD (gpu_end) (Common) ;
-#endif
-
-    return (0);
-}
-
-/* ========================================================================== */
-/* === cholmod_gpu_end ====================================================== */
-/* ========================================================================== */
-
-void CHOLMOD(gpu_end)
-(
-    cholmod_common *Common
-)
-{
-#ifdef GPU_BLAS
-    int k ;
-
-    /* ------------------------------------------------------------------ */
-    /* destroy Cublas Handle */
-    /* ------------------------------------------------------------------ */
-
-    if (Common->cublasHandle)
-    {
-        /* fprintf (stderr, "destroy cublas %p\n", Common->cublasHandle) ; */
-        cublasDestroy (Common->cublasHandle) ;
-        /* fprintf (stderr, "destroy cublas done\n") ; */
-        Common->cublasHandle = NULL ;
-    }
-
-    /* ------------------------------------------------------------------ */
-    /* destroy each CUDA stream */
-    /* ------------------------------------------------------------------ */
-
-    for (k = 0 ; k < CHOLMOD_HOST_SUPERNODE_BUFFERS ; k++)
-    {
-        if (Common->gpuStream [k])
-        {
-            /* fprintf (stderr, "destroy gpuStream [%d] %p\n", k,
-                Common->gpuStream [k]) ; */
-            cudaStreamDestroy (Common->gpuStream [k]) ;
-            /* fprintf (stderr, "destroy gpuStream [%d] done\n", k) ; */
-            Common->gpuStream [k] = NULL ;
-        }
-    }
-
-    /* ------------------------------------------------------------------ */
-    /* destroy each CUDA event */
-    /* ------------------------------------------------------------------ */
-
-    for (k = 0 ; k < 3 ; k++)
-    {
-        if (Common->cublasEventPotrf [k])
-        {
-            /* fprintf (stderr, "destroy cublasEnventPotrf [%d] %p\n", k,
-                Common->cublasEventPotrf [k]) ; */
-            cudaEventDestroy (Common->cublasEventPotrf [k]) ;
-            /* fprintf (stderr, "destroy cublasEnventPotrf [%d] done\n", k) ; */
-            Common->cublasEventPotrf [k] = NULL ;
-        }
-    }
-
-    for (k = 0 ; k < CHOLMOD_HOST_SUPERNODE_BUFFERS ; k++)
-    {
-        if (Common->updateCBuffersFree [k])
-        {
-            /* fprintf (stderr, "destroy updateCBuffersFree [%d] %p\n", k,
-                Common->updateCBuffersFree [k]) ; */
-            cudaEventDestroy (Common->updateCBuffersFree [k]) ;
-            /* fprintf (stderr, "destroy updateCBuffersFree [%d] done\n", k) ;*/
-            Common->updateCBuffersFree [k] = NULL ;
-        }
-    }
-
-    if (Common->updateCKernelsComplete)
-    {
-        /* fprintf (stderr, "destroy updateCKernelsComplete %p\n",
-            Common->updateCKernelsComplete) ; */
-        cudaEventDestroy (Common->updateCKernelsComplete) ;
-        /* fprintf (stderr, "destroy updateCKernelsComplete done\n") ; */
-        Common->updateCKernelsComplete = NULL;
-    }
-#endif
-}
-
-
-/* ========================================================================== */
-/* === cholmod_gpu_allocate ================================================= */
-/* ========================================================================== */
-/*
- * Allocate both host and device memory needed for GPU computation.
- *
- * Memory allocation is expensive and should be done once and reused for
- * multiple factorizations.
- *
- * When gpu_allocate is called, the requested amount of device (and by
- * association host) memory is computed.  If that amount or more memory has
- * already been allocated, then nothing is done.  (i.e. memory allocation is
- * not reduced.)  If the requested amount is more than is currently allcoated
- * then both device and pinned host memory is freed and the new amount
- * allocated.
- *
- * This routine will allocate the minimum of either:
- *
- * maxGpuMemBytes - size of requested device allocation in bytes
- *
- * maxGpuMemFraction - size of requested device allocation as a fraction of
- *                     total GPU memory
- *
- * If both maxGpuMemBytes and maxGpuMemFraction are zero, this will allocate
- * the maximum amount of GPU memory possible.
- *
- * Note that since the GPU driver requires some memory, it is not advisable
- * to request maxGpuMemFraction of 1.0 (which will request all GPU memory and
- * will fail).  If maximum memory is requested then call this routine wtih
- * both maxGpuMemBytes and maxGpuMemFraction of 0.0.
- *
- */
-
-int CHOLMOD(gpu_allocate) ( cholmod_common *Common )
-{
-
-#ifdef GPU_BLAS
-
-    int k;
-    size_t fdm, tdm;
-    size_t requestedDeviceMemory, requestedHostMemory;
-    double tstart, tend;
-    cudaError_t cudaErr;
-    cublasStatus_t cublasErr;
-    size_t maxGpuMemBytes;
-    double maxGpuMemFraction;
-
-    /* fprintf (stderr, "gpu_allocate useGPU %d\n", Common->useGPU) ; */
-    if (Common->useGPU != 1) return (0) ;
-
-    maxGpuMemBytes = Common->maxGpuMemBytes;
-    maxGpuMemFraction = Common->maxGpuMemFraction;
-
-    /* ensure valid input */
-    if ( maxGpuMemBytes < 0 ) maxGpuMemBytes = 0;
-    if ( maxGpuMemFraction < 0 ) maxGpuMemFraction = 0;
-    if ( maxGpuMemFraction > 1 ) maxGpuMemFraction = 1;
-
-    int err = CHOLMOD(gpu_memorysize) (&tdm,&fdm,Common) ;
-    if (err)
-    {
-        printf ("GPU failure in cholmod_gpu: gpu_memorysize %g %g MB\n",
-            ((double) tdm) / (1024*1024),
-            ((double) fdm) / (1024*1024)) ;
-        ERROR (CHOLMOD_GPU_PROBLEM, "gpu memorysize failure\n") ;
-    }
-
-    /* compute the amount of device memory requested */
-    if ( maxGpuMemBytes == 0 && maxGpuMemFraction == 0 ) {
-        /* no specific request - take all available GPU memory
-         *  (other programs could already have allocated some GPU memory,
-         *  possibly even previous calls to gpu_allocate).  Always leave
-         *  50 MB free for driver use. */
-        requestedDeviceMemory = fdm+Common->dev_mempool_size-
-            1024ll*1024ll*50ll;
-    }
-    else if ( maxGpuMemBytes > 0 && maxGpuMemFraction > 0 ) {
-        /* both byte and fraction limits - take the lowest of the two */
-        requestedDeviceMemory = maxGpuMemBytes;
-        if ( requestedDeviceMemory > tdm*maxGpuMemFraction ) {
-            requestedDeviceMemory = tdm*maxGpuMemFraction;
-        }
-    }
-    else if ( maxGpuMemFraction > 0 ) {
-        /* just a fraction requested */
-        requestedDeviceMemory = maxGpuMemFraction * tdm;
-    }
-    else {
-        /* specific number of bytes requested */
-        requestedDeviceMemory = maxGpuMemBytes;
-        if ( maxGpuMemBytes > fdm ) {
-            CHOLMOD_GPU_PRINTF ((
-                "GPU WARNING: Requested amount of device memory not available\n"
-                )) ;
-            requestedDeviceMemory = fdm;
-        }
-    }
-
-    /* do nothing if sufficient memory has already been allocated */
-    if ( requestedDeviceMemory <= Common->dev_mempool_size ) {
-
-        CHOLMOD_GPU_PRINTF (("requested = %d, mempool = %d \n",
-            requestedDeviceMemory, Common->dev_mempool_size));
-        CHOLMOD_GPU_PRINTF (("GPU NOTE:  gpu_allocate did nothing \n"));
-        return 0;
-    }
-
-    CHOLMOD(gpu_deallocate);
-
-    /* create cuBlas handle */
-    if ( ! Common->cublasHandle ) {
-        cublasErr = cublasCreate (&(Common->cublasHandle)) ;
-        if (cublasErr != CUBLAS_STATUS_SUCCESS) {
-            ERROR (CHOLMOD_GPU_PROBLEM, "CUBLAS initialization") ;
-            return 1;
-        }
-    }
-
-    /* allocated corresponding pinned host memory */
-    requestedHostMemory = requestedDeviceMemory*CHOLMOD_HOST_SUPERNODE_BUFFERS/
-        CHOLMOD_DEVICE_SUPERNODE_BUFFERS;
-
-    cudaErr = cudaMallocHost ( (void**)&(Common->host_pinned_mempool),
-                               requestedHostMemory );
-    while ( cudaErr ) {
-        /* insufficient host memory, try again with less */
-        requestedHostMemory *= .5;
-        cudaErr = cudaMallocHost ( (void**)&(Common->host_pinned_mempool),
-                                   requestedHostMemory );
-    }
-    Common->host_pinned_mempool_size = requestedHostMemory;
-
-    requestedDeviceMemory = requestedHostMemory*
-        CHOLMOD_DEVICE_SUPERNODE_BUFFERS/CHOLMOD_HOST_SUPERNODE_BUFFERS;
-
-    /* Split up the memory allocations into required device buffers. */
-    Common->devBuffSize = requestedDeviceMemory/
-        (size_t)CHOLMOD_DEVICE_SUPERNODE_BUFFERS;
-    Common->devBuffSize -= Common->devBuffSize%0x20000;
-
-    cudaErr = cudaMalloc ( &(Common->dev_mempool), requestedDeviceMemory );
-    /*
-    CHOLMOD_HANDLE_CUDA_ERROR (cudaErr,"device memory allocation failure\n");
-    */
-    if (cudaErr)
-    {
-        printf ("GPU failure in cholmod_gpu: requested %g MB\n",
-            ((double) requestedDeviceMemory) / (1024*1024)) ;
-        ERROR (CHOLMOD_GPU_PROBLEM, "device memory allocation failure\n") ;
-    }
-
-    Common->dev_mempool_size = requestedDeviceMemory;
-
-#endif
-
-    return (0);
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu_kernels.c b/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu_kernels.c
deleted file mode 100644
index 95d1378..0000000
--- a/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu_kernels.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* ========================================================================== */
-/* === cholmod_gpu_kernels.c ================================================ */
-/* ========================================================================== */
-
-/* a dummy file to satisfy 'make' when the GPU is not available */
-
diff --git a/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu_kernels.cu b/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu_kernels.cu
deleted file mode 100644
index 1e212a2..0000000
--- a/src/C/SuiteSparse/CHOLMOD/GPU/cholmod_gpu_kernels.cu
+++ /dev/null
@@ -1,196 +0,0 @@
-/* ========================================================================== */
-/* ========================= CHOLMOD CUDA/C kernels ========================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/GPU Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/GPU 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
- * -------------------------------------------------------------------------- */
-
-#include <stdio.h>
-#include "SuiteSparse_config.h"
-/* 64-bit version only */
-#define Int SuiteSparse_long
-
-extern "C" {
-
-  __global__ void kernelCreateMap ( Int *d_Map, Int *d_Ls, 
-				    Int psi, Int nsrow )
-  /*
-    Ls[supernode row] = Matrix Row
-  */
-  {
-    int tid = blockIdx.x * blockDim.x + threadIdx.x;
-    if ( tid < nsrow ) {
-      d_Map[d_Ls[psi+tid]] = ((Int) (tid));
-    }
-  }
-  
-  __global__ void kernelCreateRelativeMap ( Int *d_Map, Int *d_Ls, 
-					    Int *d_RelativeMap, 
-					    Int pdi1, Int ndrow )
-  {
-    int tid = blockIdx.x * blockDim.x + threadIdx.x;
-    if ( tid < ndrow ) {
-      d_RelativeMap[tid] = d_Map[d_Ls[pdi1+tid]];
-    }
-  }
-  
-  __global__ void kernelAddUpdate ( double *d_A, double *devPtrC, 
-				    Int *d_RelativeMap, 
-				    Int ndrow1, Int ndrow2, 
-				    Int nsrow )
-  {
-    int idrow = blockIdx.x * blockDim.x + threadIdx.x;
-    int idcol = blockIdx.y * blockDim.y + threadIdx.y;
-    if ( idrow < ndrow2  && idcol < ndrow1 ) {
-      Int idx = d_RelativeMap[idrow] + d_RelativeMap[idcol] * nsrow;
-      d_A[idx] += devPtrC[idrow+ndrow2*idcol];
-    }
-  }
-  
-  __global__ void kernelAddComplexUpdate ( double *d_A, double *devPtrC, 
-					   Int *d_RelativeMap, 
-					   Int ndrow1, Int ndrow2, 
-					   Int nsrow )
-  {
-    int idrow = blockIdx.x * blockDim.x + threadIdx.x;
-    int idcol = blockIdx.y * blockDim.y + threadIdx.y;
-    if ( idrow < ndrow2  && idcol < ndrow1 ) {
-      Int idx = d_RelativeMap[idrow] + d_RelativeMap[idcol] * nsrow;
-      d_A[idx*2] += devPtrC[(idrow+ndrow2*idcol)*2];
-      d_A[idx*2+1] += devPtrC[(idrow+ndrow2*idcol)*2+1];
-    }
-  }
-  
-  __global__ void kernelSumA ( double *a1, double *a2, const double alpha, 
-			       int nsrow, int nscol ) {
-    int isrow = blockIdx.x * blockDim.x + threadIdx.x;
-    int iscol = blockIdx.y * blockDim.y + threadIdx.y;
-    if ( isrow < nsrow && iscol < nscol ) {
-      Int idx = iscol*nsrow + isrow;
-      a1[idx] += alpha * a2[idx];
-    }
-  }
-
-  __global__ void kernelSumComplexA ( double *a1, double *a2, 
-				      const double alpha, int nsrow, 
-				      int nscol ) {
-    int isrow = blockIdx.x * blockDim.x + threadIdx.x;
-    int iscol = blockIdx.y * blockDim.y + threadIdx.y;
-    if ( isrow < nsrow && iscol < nscol ) {
-      Int idx = iscol*nsrow + isrow;
-      a1[idx*2] += alpha * a2[idx*2];
-      a1[idx*2+1] += alpha * a2[idx*2+1];
-    }
-  }
-
-  /* ======================================================================== */
-  /* using Ls and Lpi data already on the device, construct Map */
-  /* ======================================================================== */
-  int createMapOnDevice ( Int *d_Map, Int *d_Ls, 
-			  Int  psi, Int nsrow ) 
-  {
-    unsigned int kgrid = (nsrow+31)/32;
-    unsigned int kblock = 32;
-    kernelCreateMap <<<kgrid, kblock>>> ( d_Map, d_Ls, psi, nsrow );
-    return 0;
-  }
-
-
-  int createRelativeMapOnDevice ( Int *d_Map, Int *d_Ls, 
-				  Int *d_RelativeMap,Int  pdi1, 
-				  Int ndrow, cudaStream_t* astream )
-  {
-    unsigned int kgrid = (ndrow+255)/256;
-    unsigned int kblock = 256;
-    kernelCreateRelativeMap <<<kgrid, kblock, 0, *astream>>> 
-      ( d_Map, d_Ls, d_RelativeMap, pdi1, ndrow);
-    return 0;
-  }
-
-
-  /* ======================================================================== */
-  int addUpdateOnDevice ( double *d_A, double *devPtrC, 
-			  Int *d_RelativeMap, Int ndrow1, 
-			  Int ndrow2, Int nsrow, 
-			  cudaStream_t* astream )
-  /* ======================================================================== */
-  /* Assemble the Schur complment from a descendant supernode into the current
-     supernode */ 
-  /* ======================================================================== */
-{
-  dim3 grids;
-  dim3 blocks;
-
-  blocks.x = 16;
-  blocks.y = 16;
-  blocks.z = 1;
-
-  grids.x = (ndrow2+15)/16; 
-  grids.y = (ndrow1+15)/16; 
-
-  kernelAddUpdate <<<grids, blocks, 0, *astream>>> 
-    ( d_A, devPtrC, d_RelativeMap, ndrow1, ndrow2, nsrow );
-
-  return 0;
-}
-
-  /* ======================================================================== */
-  int addComplexUpdateOnDevice ( double *d_A, double *devPtrC, 
-				 Int *d_RelativeMap, Int ndrow1, 
-				 Int ndrow2, Int nsrow, 
-				 cudaStream_t* astream )
-  /* ======================================================================== */
-  /* Assemble the Schur complment from a descendant supernode into the current
-     supernode */ 
-  /* ======================================================================== */
-{
-  dim3 grids;
-  dim3 blocks;
-
-  blocks.x = 16;
-  blocks.y = 16;
-  blocks.z = 1;
-
-  grids.x = (ndrow2+15)/16; 
-  grids.y = (ndrow1+15)/16; 
-
-  kernelAddComplexUpdate <<<grids, blocks, 0, *astream>>> 
-    ( d_A, devPtrC, d_RelativeMap, ndrow1, ndrow2, nsrow );
-
-  return 0;
-}
-
-  int sumAOnDevice ( double *a1, double *a2, const double alpha, 
-		     int nsrow, int nscol )
-  {
-    dim3 grids;
-    dim3 blocks;
-    blocks.x = 16;
-    blocks.y = 16;
-    blocks.z = 1;
-    grids.x = (nsrow+15)/16;
-    grids.y = (nscol+15)/16;
-    kernelSumA <<<grids, blocks, 0, 0>>> ( a1, a2, alpha, nsrow, nscol );
-    return 0;
-  }
-
-  int sumComplexAOnDevice ( double *a1, double *a2, const double alpha, 
-			    int nsrow, int nscol )
-  {
-    dim3 grids;
-    dim3 blocks;
-    blocks.x = 16;
-    blocks.y = 16;
-    blocks.z = 1;
-    grids.x = (nsrow+15)/16;
-    grids.y = (nscol+15)/16;
-    kernelSumComplexA <<<grids, blocks, 0, 0>>> ( a1, a2, alpha, nsrow, nscol );
-    return 0;
-  }
-
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/GPU/t_cholmod_gpu.c b/src/C/SuiteSparse/CHOLMOD/GPU/t_cholmod_gpu.c
deleted file mode 100644
index ec45f51..0000000
--- a/src/C/SuiteSparse/CHOLMOD/GPU/t_cholmod_gpu.c
+++ /dev/null
@@ -1,1397 +0,0 @@
-/* ========================================================================== */
-/* === GPU/t_cholmod_gpu ==================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/GPU Module.  Copyright (C) 2005-2012, Timothy A. Davis
- * The CHOLMOD/GPU 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
- * -------------------------------------------------------------------------- */
-
-/* GPU BLAS template routine for cholmod_super_numeric. */
-
-/* ========================================================================== */
-/* === include files and definitions ======================================== */
-/* ========================================================================== */
-
-#ifdef GPU_BLAS
-
-#include <string.h>
-#include "cholmod_template.h"
-
-#undef L_ENTRY
-#ifdef REAL
-#define L_ENTRY 1
-#else
-#define L_ENTRY 2
-#endif
-
-
-/* ========================================================================== */
-/* === gpu_clear_memory ===================================================== */
-/* ========================================================================== */
-/*
- * Ensure the Lx is zeroed before forming factor.  This is a significant cost
- * in the GPU case - so using this parallel memset code for efficiency.
- */
-
-void TEMPLATE2 (CHOLMOD (gpu_clear_memory))
-(
-    double* buff,
-    size_t size,
-    int num_threads
-)
-{
-    int chunk_multiplier = 5;
-    int num_chunks = chunk_multiplier * num_threads;
-    size_t chunksize = size / num_chunks;
-    size_t i;
-
-#pragma omp parallel for num_threads(num_threads) private(i) schedule(dynamic)
-    for(i = 0; i < num_chunks; i++) {
-        size_t chunkoffset = i * chunksize;
-        if(i == num_chunks - 1) {
-            memset(buff + chunkoffset, 0, (size - chunksize*(num_chunks - 1)) *
-                   sizeof(double));
-        }
-        else {
-            memset(buff + chunkoffset, 0, chunksize * sizeof(double));
-        }
-    }
-}
-
-/* ========================================================================== */
-/* === gpu_init ============================================================= */
-/* ========================================================================== */
-/*
- * Performs required initialization for GPU computing.
- *
- * Returns 0 if there is an error, so the intended use is
- *
- *     useGPU = CHOLMOD(gpu_init)
- *
- * which would locally turn off gpu processing if the initialization failed.
- */
-
-int TEMPLATE2 (CHOLMOD (gpu_init))
-(
-    void *Cwork,
-    cholmod_factor *L,
-    cholmod_common *Common,
-    Int nsuper,
-    Int n,
-    Int nls,
-    cholmod_gpu_pointers *gpu_p
-)
-{
-    Int i, k, maxSize ;
-    cublasStatus_t cublasError ;
-    cudaError_t cudaErr ;
-    size_t maxBytesSize, HostPinnedSize ;
-
-    feenableexcept (FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW );
-
-    maxSize = L->maxcsize;
-
-    /* #define PAGE_SIZE (4*1024) */
-    CHOLMOD_GPU_PRINTF (("gpu_init : %p\n",
-        (void *) ((size_t) Cwork & ~(4*1024-1)))) ;
-
-    /* make sure the assumed buffer sizes are large enough */
-    if ( (nls+2*n+4)*sizeof(Int) > Common->devBuffSize ) {
-        ERROR (CHOLMOD_GPU_PROBLEM,"\n\n"
-               "GPU Memory allocation error.  Ls, Map and RelativeMap exceed\n"
-               "devBuffSize.  It is not clear if this is due to insufficient\n"
-               "device or host memory or both.  You can try:\n"
-               "     1) increasing the amount of GPU memory requested\n"
-               "     2) reducing CHOLMOD_NUM_HOST_BUFFERS\n"
-               "     3) using a GPU & host with more memory\n"
-               "This issue is a known limitation and should be fixed in a \n"
-               "future release of CHOLMOD.\n") ;
-        return (0) ;
-    }
-
-    /* divvy up the memory in dev_mempool */
-    gpu_p->d_Lx[0] = Common->dev_mempool;
-    gpu_p->d_Lx[1] = Common->dev_mempool + Common->devBuffSize;
-    gpu_p->d_C = Common->dev_mempool + 2*Common->devBuffSize;
-    gpu_p->d_A[0] = Common->dev_mempool + 3*Common->devBuffSize;
-    gpu_p->d_A[1] = Common->dev_mempool + 4*Common->devBuffSize;
-    gpu_p->d_Ls = Common->dev_mempool + 5*Common->devBuffSize;
-    gpu_p->d_Map = gpu_p->d_Ls + (nls+1)*sizeof(Int) ;
-    gpu_p->d_RelativeMap = gpu_p->d_Map + (n+1)*sizeof(Int) ;
-
-    /* Copy all of the Ls and Lpi data to the device.  If any supernodes are
-     * to be computed on the device then this will be needed, so might as
-     * well do it now.   */
-
-    cudaErr = cudaMemcpy ( gpu_p->d_Ls, L->s, nls*sizeof(Int),
-                           cudaMemcpyHostToDevice );
-    CHOLMOD_HANDLE_CUDA_ERROR(cudaErr,"cudaMemcpy(d_Ls)");
-
-    if (!(Common->gpuStream[0])) {
-
-        /* ------------------------------------------------------------------ */
-        /* create each CUDA stream */
-        /* ------------------------------------------------------------------ */
-
-        for ( i=0; i<CHOLMOD_HOST_SUPERNODE_BUFFERS; i++ ) {
-            cudaErr = cudaStreamCreate ( &(Common->gpuStream[i]) );
-            if (cudaErr != cudaSuccess) {
-                ERROR (CHOLMOD_GPU_PROBLEM, "CUDA stream") ;
-                return (0) ;
-            }
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* create each CUDA event */
-        /* ------------------------------------------------------------------ */
-
-        for (i = 0 ; i < 3 ; i++) {
-            cudaErr = cudaEventCreateWithFlags
-                (&(Common->cublasEventPotrf [i]), cudaEventDisableTiming) ;
-            if (cudaErr != cudaSuccess) {
-                ERROR (CHOLMOD_GPU_PROBLEM, "CUDA event") ;
-                return (0) ;
-            }
-        }
-
-        for (i = 0 ; i < CHOLMOD_HOST_SUPERNODE_BUFFERS ; i++) {
-            cudaErr = cudaEventCreateWithFlags
-                (&(Common->updateCBuffersFree[i]), cudaEventDisableTiming) ;
-            if (cudaErr != cudaSuccess) {
-                ERROR (CHOLMOD_GPU_PROBLEM, "CUDA event") ;
-                return (0) ;
-            }
-        }
-
-        cudaErr = cudaEventCreateWithFlags ( &(Common->updateCKernelsComplete),
-                                             cudaEventDisableTiming );
-        if (cudaErr != cudaSuccess) {
-            ERROR (CHOLMOD_GPU_PROBLEM, "CUDA updateCKernelsComplete event") ;
-            return (0) ;
-        }
-
-    }
-
-    gpu_p->h_Lx[0] = (double*)(Common->host_pinned_mempool);
-    for ( k=1; k<CHOLMOD_HOST_SUPERNODE_BUFFERS; k++ ) {
-        gpu_p->h_Lx[k] = (double*)((char *)(Common->host_pinned_mempool) +
-                                   k*Common->devBuffSize);
-    }
-
-    return (1);  /* initialization successfull, useGPU = 1 */
-
-}
-
-
-/* ========================================================================== */
-/* === gpu_reorder_descendants ============================================== */
-/* ========================================================================== */
-/* Reorder the descendant supernodes as:
- *    1st - descendant supernodes eligible for processing on the GPU
- *          in increasing (by flops) order
- *    2nd - supernodes whose processing is to remain on the CPU
- *          in any order
- *
- * All of the GPU-eligible supernodes will be scheduled first.  All
- * CPU-eligible descendants will overlap with the last (largest)
- * CHOLMOD_HOST_SUPERNODE_BUFFERS GPU-eligible descendants.
- */
-
-void TEMPLATE2 (CHOLMOD (gpu_reorder_descendants))
-(
-    cholmod_common *Common,
-    Int *Super,
-    Int *locals,
-    Int *Lpi,
-    Int *Lpos,
-    Int *Head,
-    Int *Next,
-    Int *Previous,
-    Int *ndescendants,
-    Int *tail,
-    Int *mapCreatedOnGpu,
-    cholmod_gpu_pointers *gpu_p
-)
-{
-
-    Int prevd, nextd, firstcpu, d, k, kd1, kd2, ndcol, pdi, pdend, pdi1;
-    Int dnext, ndrow2, p;
-    Int n_descendant = 0;
-    double score;
-
-    /* use h_Lx[0] to buffer the GPU-eligible descendants */
-    struct cholmod_descendant_score_t* scores =
-        (struct cholmod_descendant_score_t*) gpu_p->h_Lx[0];
-
-    double cpuref = 0.0;
-
-    int nreverse = 1;
-    int previousd;
-
-
-    d = Head[*locals];
-    prevd = -1;
-    firstcpu = -1;
-    *mapCreatedOnGpu = 0;
-
-    while ( d != EMPTY )
-    {
-
-        /* Get the parameters for the current descendant supernode */
-        kd1 = Super [d] ;       /* d contains cols kd1 to kd2-1 of L */
-        kd2 = Super [d+1] ;
-        ndcol = kd2 - kd1 ;     /* # of columns in all of d */
-        pdi = Lpi [d] ;         /* pointer to first row of d in Ls */
-        pdend = Lpi [d+1] ;     /* pointer just past last row of d in Ls */
-        p = Lpos [d] ;          /* offset of 1st row of d affecting s */
-        pdi1 = pdi + p ;        /* ptr to 1st row of d affecting s in Ls */
-        ndrow2 = pdend - pdi1;
-
-        nextd = Next[d];
-
-        /* compute a rough flops 'score' for this descendant supernode */
-        score = ndrow2 * ndcol;
-        if ( ndrow2*L_ENTRY >= CHOLMOD_ND_ROW_LIMIT &&
-             ndcol*L_ENTRY >= CHOLMOD_ND_COL_LIMIT ) {
-            score += Common->devBuffSize;
-        }
-
-        /* place in sort buffer */
-        scores[n_descendant].score = score;
-        scores[n_descendant].d = d;
-        n_descendant++;
-
-        d = nextd;
-
-    }
-
-    /* Sort the GPU-eligible supernodes */
-    qsort ( scores, n_descendant, sizeof(struct cholmod_descendant_score_t),
-            (__compar_fn_t) CHOLMOD(score_comp) );
-
-    /* Place sorted data back in descendant supernode linked list*/
-    if ( n_descendant > 0 ) {
-        Head[*locals] = scores[0].d;
-        if ( n_descendant > 1 ) {
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    if (n_descendant > 64)
-
-            for ( k=1; k<n_descendant; k++ ) {
-                Next[scores[k-1].d] = scores[k].d;
-            }
-        }
-        Next[scores[n_descendant-1].d] = firstcpu;
-    }
-
-    /* reverse the first CHOLMOD_HOST_SUPERNODE_BUFFERS to better hide PCIe
-       communications */
-
-    if ( Head[*locals] != EMPTY && Next[Head[*locals]] != EMPTY ) {
-        previousd = Head[*locals];
-        d = Next[Head[*locals]];
-        while ( d!=EMPTY && nreverse < CHOLMOD_HOST_SUPERNODE_BUFFERS ) {
-
-            kd1 = Super [d] ;       /* d contains cols kd1 to kd2-1 of L */
-            kd2 = Super [d+1] ;
-            ndcol = kd2 - kd1 ;     /* # of columns in all of d */
-            pdi = Lpi [d] ;         /* pointer to first row of d in Ls */
-            pdend = Lpi [d+1] ;     /* pointer just past last row of d in Ls */
-            p = Lpos [d] ;          /* offset of 1st row of d affecting s */
-            pdi1 = pdi + p ;        /* ptr to 1st row of d affecting s in Ls */
-            ndrow2 = pdend - pdi1;
-
-            nextd = Next[d];
-
-            nreverse++;
-
-            if ( ndrow2*L_ENTRY >= CHOLMOD_ND_ROW_LIMIT && ndcol*L_ENTRY >=
-                 CHOLMOD_ND_COL_LIMIT ) {
-                /* place this supernode at the front of the list */
-                Next[previousd] = Next[d];
-                Next[d] = Head[*locals];
-                Head[*locals] = d;
-            }
-            else {
-                previousd = d;
-            }
-            d = nextd;
-        }
-    }
-
-    /* create a 'previous' list so we can traverse backwards */
-    *ndescendants = 0;
-    if ( Head[*locals] != EMPTY ) {
-        Previous[Head[*locals]] = EMPTY;
-        for (d = Head [*locals] ; d != EMPTY ; d = dnext) {
-            (*ndescendants)++;
-            dnext = Next[d];
-            if ( dnext != EMPTY ) {
-                Previous[dnext] = d;
-            }
-            else {
-                *tail = d;
-            }
-        }
-    }
-
-    return;
-
-}
-
-/* ========================================================================== */
-/* === gpu_initialize_supernode ============================================= */
-/* ========================================================================== */
-
-/* C = L (k1:n-1, kd1:kd2-1) * L (k1:k2-1, kd1:kd2-1)', except that k1:n-1
- */
-
-void TEMPLATE2 (CHOLMOD (gpu_initialize_supernode))
-(
-    cholmod_common *Common,
-    Int nscol,
-    Int nsrow,
-    Int psi,
-    cholmod_gpu_pointers *gpu_p
-)
-{
-
-    cudaError_t cuErr;
-
-    /* initialize the device supernode assemby memory to zero */
-    cuErr = cudaMemset ( gpu_p->d_A[0], 0, nscol*nsrow*L_ENTRY*sizeof(double) );
-    CHOLMOD_HANDLE_CUDA_ERROR(cuErr,"cudaMemset(d_A)");
-
-    /* Create the Map on the device */
-    createMapOnDevice ( (Int *)(gpu_p->d_Map),
-                        (Int *)(gpu_p->d_Ls), psi, nsrow );
-
-    return;
-
-}
-
-
-/* ========================================================================== */
-/* === gpu_updateC ========================================================== */
-/* ========================================================================== */
-
-/* C = L (k1:n-1, kd1:kd2-1) * L (k1:k2-1, kd1:kd2-1)', except that k1:n-1
- * refers to all of the rows in L, but many of the rows are all zero.
- * Supernode d holds columns kd1 to kd2-1 of L.  Nonzero rows in the range
- * k1:k2-1 are in the list Ls [pdi1 ... pdi2-1], of size ndrow1.  Nonzero rows
- * in the range k2:n-1 are in the list Ls [pdi2 ... pdend], of size ndrow2.
- * Let L1 = L (Ls [pdi1 ... pdi2-1], kd1:kd2-1), and let L2 = L (Ls [pdi2 ...
- * pdend],  kd1:kd2-1).  C is ndrow2-by-ndrow1.  Let C1 be the first ndrow1
- * rows of C and let C2 be the last ndrow2-ndrow1 rows of C.  Only the lower
- * triangular part of C1 needs to be computed since C1 is symmetric.
- *
- * UpdateC is completely asynchronous w.r.t. the GPU.  Once the input buffer
- * d_Lx[] has been filled, all of the device operations are issues, and the
- * host can continue with filling the next input buffer / or start processing
- * all of the descendant supernodes which are not eligible for processing on
- * the device (since they are too small - will not fill the device).
- */
-
-int TEMPLATE2 (CHOLMOD (gpu_updateC))
-(
-    Int ndrow1,         /* C is ndrow2-by-ndrow2 */
-    Int ndrow2,
-    Int ndrow,          /* leading dimension of Lx */
-    Int ndcol,          /* L1 is ndrow1-by-ndcol */
-    Int nsrow,
-    Int pdx1,           /* L1 starts at Lx + L_ENTRY*pdx1 */
-    /* L2 starts at Lx + L_ENTRY*(pdx1 + ndrow1) */
-    Int pdi1,
-    double *Lx,
-    double *C,
-    cholmod_common *Common,
-    cholmod_gpu_pointers *gpu_p
-)
-{
-    double *devPtrLx, *devPtrC ;
-    double alpha, beta ;
-    cublasStatus_t cublasStatus ;
-    cudaError_t cudaStat [2] ;
-    Int ndrow3 ;
-    int icol, irow;
-    int iHostBuff, iDevBuff ;
-
-#ifndef NTIMER
-    double tstart = 0;
-#endif
-
-    if ((ndrow2*L_ENTRY < CHOLMOD_ND_ROW_LIMIT) ||
-        (ndcol*L_ENTRY <  CHOLMOD_ND_COL_LIMIT))
-    {
-        /* too small for the CUDA BLAS; use the CPU instead */
-        return (0) ;
-    }
-
-    ndrow3 = ndrow2 - ndrow1 ;
-
-#ifndef NTIMER
-    Common->syrkStart = SuiteSparse_time ( ) ;
-    Common->CHOLMOD_GPU_SYRK_CALLS++ ;
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace on the GPU */
-    /* ---------------------------------------------------------------------- */
-
-    iHostBuff = (Common->ibuffer)%CHOLMOD_HOST_SUPERNODE_BUFFERS;
-    iDevBuff = (Common->ibuffer)%CHOLMOD_DEVICE_STREAMS;
-
-    /* cycle the device Lx buffer, d_Lx, through CHOLMOD_DEVICE_STREAMS,
-       usually 2, so we can overlap the copy of this descendent supernode
-       with the compute of the previous descendant supernode */
-    devPtrLx = (double *)(gpu_p->d_Lx[iDevBuff]);
-    /* very little overlap between kernels for difference descendant supernodes
-       (since we enforce the supernodes must be large enough to fill the
-       device) so we only need one C buffer */
-    devPtrC = (double *)(gpu_p->d_C);
-
-    /* ---------------------------------------------------------------------- */
-    /* copy Lx to the GPU */
-    /* ---------------------------------------------------------------------- */
-
-    /* copy host data to pinned buffer first for better H2D bandwidth */
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS) if (ndcol > 32)
-    for ( icol=0; icol<ndcol; icol++ ) {
-        for ( irow=0; irow<ndrow2*L_ENTRY; irow++ ) {
-            gpu_p->h_Lx[iHostBuff][icol*ndrow2*L_ENTRY+irow] =
-                Lx[pdx1*L_ENTRY+icol*ndrow*L_ENTRY + irow];
-        }
-    }
-
-    cudaStat[0] = cudaMemcpyAsync ( devPtrLx,
-        gpu_p->h_Lx[iHostBuff],
-        ndrow2*ndcol*L_ENTRY*sizeof(devPtrLx[0]),
-        cudaMemcpyHostToDevice,
-        Common->gpuStream[iDevBuff] );
-
-    if ( cudaStat[0] ) {
-        CHOLMOD_GPU_PRINTF ((" ERROR cudaMemcpyAsync = %d \n", cudaStat[0]));
-        return (0);
-    }
-
-    /* make the current stream wait for kernels in previous streams */
-    cudaStreamWaitEvent ( Common->gpuStream[iDevBuff],
-                          Common->updateCKernelsComplete, 0 ) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* create the relative map for this descendant supernode */
-    /* ---------------------------------------------------------------------- */
-
-    createRelativeMapOnDevice ( (Int *)(gpu_p->d_Map),
-                                (Int *)(gpu_p->d_Ls),
-                                (Int *)(gpu_p->d_RelativeMap),
-                                pdi1, ndrow2,
-                                &(Common->gpuStream[iDevBuff]) );
-
-    /* ---------------------------------------------------------------------- */
-    /* do the CUDA SYRK */
-    /* ---------------------------------------------------------------------- */
-
-    cublasStatus = cublasSetStream (Common->cublasHandle,
-                                    Common->gpuStream[iDevBuff]) ;
-    if (cublasStatus != CUBLAS_STATUS_SUCCESS)
-    {
-        ERROR (CHOLMOD_GPU_PROBLEM, "GPU CUBLAS stream") ;
-    }
-
-    alpha  = 1.0 ;
-    beta   = 0.0 ;
-
-#ifdef REAL
-    cublasStatus = cublasDsyrk (Common->cublasHandle,
-        CUBLAS_FILL_MODE_LOWER,
-        CUBLAS_OP_N,
-        (int) ndrow1,
-        (int) ndcol,    /* N, K: L1 is ndrow1-by-ndcol */
-        &alpha,         /* ALPHA:  1 */
-        devPtrLx,
-        ndrow2,         /* A, LDA: L1, ndrow2 */
-        &beta,          /* BETA:   0 */
-        devPtrC,
-        ndrow2) ;       /* C, LDC: C1 */
-#else
-    cublasStatus = cublasZherk (Common->cublasHandle,
-        CUBLAS_FILL_MODE_LOWER,
-        CUBLAS_OP_N,
-        (int) ndrow1,
-        (int) ndcol,    /* N, K: L1 is ndrow1-by-ndcol*/
-        &alpha,         /* ALPHA:  1 */
-        (const cuDoubleComplex *) devPtrLx,
-        ndrow2,         /* A, LDA: L1, ndrow2 */
-        &beta,          /* BETA:   0 */
-        (cuDoubleComplex *) devPtrC,
-        ndrow2) ;       /* C, LDC: C1 */
-#endif
-
-    if (cublasStatus != CUBLAS_STATUS_SUCCESS)
-    {
-        ERROR (CHOLMOD_GPU_PROBLEM, "GPU CUBLAS routine failure") ;
-    }
-
-#ifndef NTIMER
-    Common->CHOLMOD_GPU_SYRK_TIME += SuiteSparse_time() - Common->syrkStart;
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* compute remaining (ndrow2-ndrow1)-by-ndrow1 block of C, C2 = L2*L1'    */
-    /* ---------------------------------------------------------------------- */
-
-#ifndef NTIMER
-    Common->CHOLMOD_GPU_GEMM_CALLS++ ;
-    tstart = SuiteSparse_time();
-#endif
-
-    if (ndrow3 > 0)
-    {
-#ifndef REAL
-        cuDoubleComplex calpha  = {1.0,0.0} ;
-        cuDoubleComplex cbeta   = {0.0,0.0} ;
-#endif
-
-        /* ------------------------------------------------------------------ */
-        /* do the CUDA BLAS dgemm */
-        /* ------------------------------------------------------------------ */
-
-#ifdef REAL
-        alpha  = 1.0 ;
-        beta   = 0.0 ;
-        cublasStatus = cublasDgemm (Common->cublasHandle,
-            CUBLAS_OP_N, CUBLAS_OP_T,
-            ndrow3, ndrow1, ndcol,          /* M, N, K */
-            &alpha,                         /* ALPHA:  1 */
-            devPtrLx + L_ENTRY*(ndrow1),    /* A, LDA: L2*/
-            ndrow2,                         /* ndrow */
-            devPtrLx,                       /* B, LDB: L1 */
-            ndrow2,                         /* ndrow */
-            &beta,                          /* BETA:   0 */
-            devPtrC + L_ENTRY*ndrow1,       /* C, LDC: C2 */
-            ndrow2) ;
-#else
-        cublasStatus = cublasZgemm (Common->cublasHandle,
-            CUBLAS_OP_N, CUBLAS_OP_C,
-            ndrow3, ndrow1, ndcol,          /* M, N, K */
-            &calpha,                        /* ALPHA:  1 */
-            (const cuDoubleComplex*) devPtrLx + ndrow1,
-            ndrow2,                         /* ndrow */
-            (const cuDoubleComplex *) devPtrLx,
-            ndrow2,                         /* ndrow */
-            &cbeta,                         /* BETA:   0 */
-            (cuDoubleComplex *)devPtrC + ndrow1,
-            ndrow2) ;
-#endif
-
-        if (cublasStatus != CUBLAS_STATUS_SUCCESS)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "GPU CUBLAS routine failure") ;
-        }
-
-    }
-
-#ifndef NTIMER
-    Common->CHOLMOD_GPU_GEMM_TIME += SuiteSparse_time() - tstart;
-#endif
-
-    /* ------------------------------------------------------------------ */
-    /* Assemble the update C on the device using the d_RelativeMap */
-    /* ------------------------------------------------------------------ */
-
-#ifdef REAL
-    addUpdateOnDevice ( gpu_p->d_A[0], devPtrC,
-        gpu_p->d_RelativeMap, ndrow1, ndrow2, nsrow,
-        &(Common->gpuStream[iDevBuff]) );
-#else
-    addComplexUpdateOnDevice ( gpu_p->d_A[0], devPtrC,
-        gpu_p->d_RelativeMap, ndrow1, ndrow2, nsrow,
-        &(Common->gpuStream[iDevBuff]) );
-#endif
-
-    /* Record an event indicating that kernels for
-       this descendant are complete */
-    cudaEventRecord ( Common->updateCKernelsComplete,
-                      Common->gpuStream[iDevBuff]);
-    cudaEventRecord ( Common->updateCBuffersFree[iHostBuff],
-                      Common->gpuStream[iDevBuff]);
-
-    return (1) ;
-}
-
-/* ========================================================================== */
-/* === gpu_final_assembly =================================================== */
-/* ========================================================================== */
-
-/* If the supernode was assembled on both the CPU and the GPU, this will
- * complete the supernode assembly on both the GPU and CPU.
- */
-
-void TEMPLATE2 (CHOLMOD (gpu_final_assembly))
-(
-    cholmod_common *Common,
-    double *Lx,
-    Int psx,
-    Int nscol,
-    Int nsrow,
-    int supernodeUsedGPU,
-    int *iHostBuff,
-    int *iDevBuff,
-    cholmod_gpu_pointers *gpu_p
-)
-{
-    Int iidx, i, j;
-    Int iHostBuff2 ;
-    Int iDevBuff2 ;
-
-    if ( supernodeUsedGPU ) {
-
-        /* ------------------------------------------------------------------ */
-        /* Apply all of the Shur-complement updates, computed on the gpu, to */
-        /* the supernode. */
-        /* ------------------------------------------------------------------ */
-
-        *iHostBuff = (Common->ibuffer)%CHOLMOD_HOST_SUPERNODE_BUFFERS;
-        *iDevBuff = (Common->ibuffer)%CHOLMOD_DEVICE_STREAMS;
-
-        if ( nscol * L_ENTRY >= CHOLMOD_POTRF_LIMIT ) {
-
-            /* If this supernode is going to be factored using the GPU (potrf)
-             * then it will need the portion of the update assembled ont the
-             * CPU.  So copy that to a pinned buffer an H2D copy to device. */
-
-            /* wait until a buffer is free */
-            cudaEventSynchronize ( Common->updateCBuffersFree[*iHostBuff] );
-
-            /* copy update assembled on CPU to a pinned buffer */
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    private(iidx) if (nscol>32)
-
-            for ( j=0; j<nscol; j++ ) {
-                for ( i=j; i<nsrow*L_ENTRY; i++ ) {
-                    iidx = j*nsrow*L_ENTRY+i;
-                    gpu_p->h_Lx[*iHostBuff][iidx] = Lx[psx*L_ENTRY+iidx];
-                }
-            }
-
-            /* H2D transfer of update assembled on CPU */
-            cudaMemcpyAsync ( gpu_p->d_A[1], gpu_p->h_Lx[*iHostBuff],
-                              nscol*nsrow*L_ENTRY*sizeof(double),
-                              cudaMemcpyHostToDevice,
-                              Common->gpuStream[*iDevBuff] );
-        }
-
-        Common->ibuffer++;
-
-        iHostBuff2 = (Common->ibuffer)%CHOLMOD_HOST_SUPERNODE_BUFFERS;
-        iDevBuff2 = (Common->ibuffer)%CHOLMOD_DEVICE_STREAMS;
-
-        /* wait for all kernels to complete */
-        cudaEventSynchronize( Common->updateCKernelsComplete );
-
-        /* copy assembled Schur-complement updates computed on GPU */
-        cudaMemcpyAsync ( gpu_p->h_Lx[iHostBuff2], gpu_p->d_A[0],
-                          nscol*nsrow*L_ENTRY*sizeof(double),
-                          cudaMemcpyDeviceToHost,
-                          Common->gpuStream[iDevBuff2] );
-
-        if ( nscol * L_ENTRY >= CHOLMOD_POTRF_LIMIT ) {
-
-            /* with the current implementation, potrf still uses data from the
-             * CPU - so put the fully assembled supernode in a pinned buffer for
-             * fastest access */
-
-            /* need both H2D and D2H copies to be complete */
-            cudaDeviceSynchronize();
-
-            /* sum updates from cpu and device on device */
-#ifdef REAL
-            sumAOnDevice ( gpu_p->d_A[1], gpu_p->d_A[0], -1.0, nsrow, nscol );
-#else
-            sumComplexAOnDevice ( gpu_p->d_A[1], gpu_p->d_A[0],
-                                  -1.0, nsrow, nscol );
-#endif
-
-            /* place final assembled supernode in pinned buffer */
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    private(iidx) if (nscol>32)
-
-            for ( j=0; j<nscol; j++ ) {
-                for ( i=j*L_ENTRY; i<nscol*L_ENTRY; i++ ) {
-                    iidx = j*nsrow*L_ENTRY+i;
-                    gpu_p->h_Lx[*iHostBuff][iidx] -=
-                        gpu_p->h_Lx[iHostBuff2][iidx];
-                }
-            }
-
-        }
-        else
-        {
-
-            /* assemble with CPU updates */
-            cudaDeviceSynchronize();
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    private(iidx) if (nscol>32)
-
-            for ( j=0; j<nscol; j++ ) {
-                for ( i=j*L_ENTRY; i<nsrow*L_ENTRY; i++ ) {
-                    iidx = j*nsrow*L_ENTRY+i;
-                    Lx[psx*L_ENTRY+iidx] -= gpu_p->h_Lx[iHostBuff2][iidx];
-                }
-            }
-        }
-    }
-    return;
-}
-
-
-/* ========================================================================== */
-/* === gpu_lower_potrf ====================================================== */
-/* ========================================================================== */
-
-/* Cholesky factorzation (dpotrf) of a matrix S, operating on the lower
- * triangular part only.   S is nscol2-by-nscol2 with leading dimension nsrow.
- *
- * S is the top part of the supernode (the lower triangular matrx).
- * This function also copies the bottom rectangular part of the supernode (B)
- * onto the GPU, in preparation for gpu_triangular_solve.
- */
-
-/*
- * On entry, d_A[1] contains the fully assembled supernode
- */
-
-int TEMPLATE2 (CHOLMOD (gpu_lower_potrf))
-(
-    Int nscol2,     /* S is nscol2-by-nscol2 */
-    Int nsrow,      /* leading dimension of S */
-    Int psx,        /* S is located at Lx + L_ENTRY*psx */
-    double *Lx,     /* contains S; overwritten with Cholesky factor */
-    Int *info,      /* BLAS info return value */
-    cholmod_common *Common,
-    cholmod_gpu_pointers *gpu_p
-)
-{
-    double *devPtrA, *devPtrB, *A ;
-    double alpha, beta ;
-    cudaError_t cudaStat ;
-    cublasStatus_t cublasStatus ;
-    Int j, nsrow2, nb, n, gpu_lda, lda, gpu_ldb ;
-    int ilda, ijb, iinfo ;
-#ifndef NTIMER
-    double tstart ;
-#endif
-
-    if (nscol2 * L_ENTRY < CHOLMOD_POTRF_LIMIT)
-    {
-        /* too small for the CUDA BLAS; use the CPU instead */
-        return (0) ;
-    }
-
-#ifndef NTIMER
-    tstart = SuiteSparse_time ( ) ;
-    Common->CHOLMOD_GPU_POTRF_CALLS++ ;
-#endif
-
-    nsrow2 = nsrow - nscol2 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* heuristic to get the block size depending of the problem size */
-    /* ---------------------------------------------------------------------- */
-
-    nb = 128 ;
-    if (nscol2 > 4096) nb = 256 ;
-    if (nscol2 > 8192) nb = 384 ;
-    n  = nscol2 ;
-    gpu_lda = ((nscol2+31)/32)*32 ;
-    lda = nsrow ;
-
-    A = gpu_p->h_Lx[(Common->ibuffer+CHOLMOD_HOST_SUPERNODE_BUFFERS-1)%
-                    CHOLMOD_HOST_SUPERNODE_BUFFERS];
-
-    /* ---------------------------------------------------------------------- */
-    /* determine the GPU leading dimension of B */
-    /* ---------------------------------------------------------------------- */
-
-    gpu_ldb = 0 ;
-    if (nsrow2 > 0)
-    {
-        gpu_ldb = ((nsrow2+31)/32)*32 ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* remember where device memory is, to be used by triangular solve later */
-    /* ---------------------------------------------------------------------- */
-
-    devPtrA = gpu_p->d_Lx[0];
-    devPtrB = gpu_p->d_Lx[1];
-
-    /* ---------------------------------------------------------------------- */
-    /* copy A from device to device */
-    /* ---------------------------------------------------------------------- */
-
-    cudaStat = cudaMemcpy2DAsync ( devPtrA,
-       gpu_lda * L_ENTRY * sizeof (devPtrA[0]),
-       gpu_p->d_A[1],
-       nsrow * L_ENTRY * sizeof (Lx[0]),
-       nscol2 * L_ENTRY * sizeof (devPtrA[0]),
-       nscol2,
-       cudaMemcpyDeviceToDevice,
-       Common->gpuStream[0] );
-
-    if ( cudaStat ) {
-        ERROR ( CHOLMOD_GPU_PROBLEM, "GPU memcopy device to device");
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* copy B in advance, for gpu_triangular_solve */
-    /* ---------------------------------------------------------------------- */
-
-    if (nsrow2 > 0)
-    {
-        cudaStat = cudaMemcpy2DAsync (devPtrB,
-            gpu_ldb * L_ENTRY * sizeof (devPtrB [0]),
-            gpu_p->d_A[1] + L_ENTRY*nscol2,
-            nsrow * L_ENTRY * sizeof (Lx [0]),
-            nsrow2 * L_ENTRY * sizeof (devPtrB [0]),
-            nscol2,
-            cudaMemcpyDeviceToDevice,
-            Common->gpuStream[0]) ;
-        if (cudaStat)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "GPU memcopy to device") ;
-        }
-    }
-
-    /* ------------------------------------------------------------------ */
-    /* define the dpotrf stream */
-    /* ------------------------------------------------------------------ */
-
-    cublasStatus = cublasSetStream (Common->cublasHandle,
-                                    Common->gpuStream [0]) ;
-    if (cublasStatus != CUBLAS_STATUS_SUCCESS) {
-        ERROR (CHOLMOD_GPU_PROBLEM, "GPU CUBLAS stream") ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* block Cholesky factorization of S */
-    /* ---------------------------------------------------------------------- */
-
-    for (j = 0 ; j < n ; j += nb)
-    {
-        Int jb = nb < (n-j) ? nb : (n-j) ;
-
-        /* ------------------------------------------------------------------ */
-        /* do the CUDA BLAS dsyrk */
-        /* ------------------------------------------------------------------ */
-
-        alpha = -1.0 ;
-        beta  = 1.0 ;
-#ifdef REAL
-        cublasStatus = cublasDsyrk (Common->cublasHandle,
-            CUBLAS_FILL_MODE_LOWER, CUBLAS_OP_N, jb, j,
-            &alpha, devPtrA + j, gpu_lda,
-            &beta,  devPtrA + j + j*gpu_lda, gpu_lda) ;
-
-#else
-        cublasStatus = cublasZherk (Common->cublasHandle,
-            CUBLAS_FILL_MODE_LOWER, CUBLAS_OP_N, jb, j,
-            &alpha, (cuDoubleComplex*)devPtrA + j,
-            gpu_lda,
-            &beta,
-            (cuDoubleComplex*)devPtrA + j + j*gpu_lda,
-            gpu_lda) ;
-#endif
-
-        if (cublasStatus != CUBLAS_STATUS_SUCCESS)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "GPU CUBLAS routine failure") ;
-        }
-
-        /* ------------------------------------------------------------------ */
-
-        cudaStat = cudaEventRecord (Common->cublasEventPotrf [0],
-                                    Common->gpuStream [0]) ;
-        if (cudaStat)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "CUDA event failure") ;
-        }
-
-        cudaStat = cudaStreamWaitEvent (Common->gpuStream [1],
-                                        Common->cublasEventPotrf [0], 0) ;
-        if (cudaStat)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "CUDA event failure") ;
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* copy back the jb columns on two different streams */
-        /* ------------------------------------------------------------------ */
-
-        cudaStat = cudaMemcpy2DAsync (A + L_ENTRY*(j + j*lda),
-            lda * L_ENTRY * sizeof (double),
-            devPtrA + L_ENTRY*(j + j*gpu_lda),
-            gpu_lda * L_ENTRY * sizeof (double),
-            L_ENTRY * sizeof (double)*jb,
-            jb,
-            cudaMemcpyDeviceToHost,
-            Common->gpuStream [1]) ;
-
-        if (cudaStat)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "GPU memcopy from device") ;
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* do the CUDA BLAS dgemm */
-        /* ------------------------------------------------------------------ */
-
-        if ((j+jb) < n)
-        {
-
-#ifdef REAL
-            alpha = -1.0 ;
-            beta  = 1.0 ;
-            cublasStatus = cublasDgemm (Common->cublasHandle,
-                CUBLAS_OP_N, CUBLAS_OP_T,
-                (n-j-jb), jb, j,
-                &alpha,
-                devPtrA + (j+jb), gpu_lda,
-                devPtrA + (j)  , gpu_lda,
-                &beta,
-                devPtrA + (j+jb + j*gpu_lda), gpu_lda) ;
-
-#else
-            cuDoubleComplex calpha = {-1.0,0.0} ;
-            cuDoubleComplex cbeta  = { 1.0,0.0} ;
-            cublasStatus = cublasZgemm (Common->cublasHandle,
-                CUBLAS_OP_N, CUBLAS_OP_C,
-                (n-j-jb), jb, j,
-                &calpha,
-                (cuDoubleComplex*)devPtrA + (j+jb),
-                gpu_lda,
-                (cuDoubleComplex*)devPtrA + (j),
-                gpu_lda,
-                &cbeta,
-                (cuDoubleComplex*)devPtrA +
-                (j+jb + j*gpu_lda),
-                gpu_lda ) ;
-#endif
-
-            if (cublasStatus != CUBLAS_STATUS_SUCCESS)
-            {
-                ERROR (CHOLMOD_GPU_PROBLEM, "GPU CUBLAS routine failure") ;
-            }
-        }
-
-        cudaStat = cudaStreamSynchronize (Common->gpuStream [1]) ;
-        if (cudaStat)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "GPU memcopy to device") ;
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* compute the Cholesky factorization of the jbxjb block on the CPU */
-        /* ------------------------------------------------------------------ */
-
-        ilda = (int) lda ;
-        ijb  = jb ;
-#ifdef REAL
-        LAPACK_DPOTRF ("L", &ijb, A + L_ENTRY * (j + j*lda), &ilda, &iinfo) ;
-#else
-        LAPACK_ZPOTRF ("L", &ijb, A + L_ENTRY * (j + j*lda), &ilda, &iinfo) ;
-#endif
-        *info = iinfo ;
-
-        if (*info != 0)
-        {
-            *info = *info + j ;
-            break ;
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* copy the result back to the GPU */
-        /* ------------------------------------------------------------------ */
-
-        cudaStat = cudaMemcpy2DAsync (devPtrA + L_ENTRY*(j + j*gpu_lda),
-            gpu_lda * L_ENTRY * sizeof (double),
-            A + L_ENTRY * (j + j*lda),
-            lda * L_ENTRY * sizeof (double),
-            L_ENTRY * sizeof (double) * jb,
-            jb,
-            cudaMemcpyHostToDevice,
-            Common->gpuStream [0]) ;
-
-        if (cudaStat)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "GPU memcopy to device") ;
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* do the CUDA BLAS dtrsm */
-        /* ------------------------------------------------------------------ */
-
-        if ((j+jb) < n)
-        {
-
-#ifdef REAL
-            alpha  = 1.0 ;
-            cublasStatus = cublasDtrsm (Common->cublasHandle,
-                CUBLAS_SIDE_RIGHT,
-                CUBLAS_FILL_MODE_LOWER,
-                CUBLAS_OP_T, CUBLAS_DIAG_NON_UNIT,
-                (n-j-jb), jb,
-                &alpha,
-                devPtrA + (j + j*gpu_lda), gpu_lda,
-                devPtrA + (j+jb + j*gpu_lda), gpu_lda) ;
-#else
-            cuDoubleComplex calpha  = {1.0,0.0};
-            cublasStatus = cublasZtrsm (Common->cublasHandle,
-                CUBLAS_SIDE_RIGHT,
-                CUBLAS_FILL_MODE_LOWER,
-                CUBLAS_OP_C, CUBLAS_DIAG_NON_UNIT,
-                (n-j-jb), jb,
-                &calpha,
-                (cuDoubleComplex *)devPtrA +
-                (j + j*gpu_lda),
-                gpu_lda,
-                (cuDoubleComplex *)devPtrA +
-                (j+jb + j*gpu_lda),
-                gpu_lda) ;
-#endif
-
-            if (cublasStatus != CUBLAS_STATUS_SUCCESS)
-            {
-                ERROR (CHOLMOD_GPU_PROBLEM, "GPU CUBLAS routine failure") ;
-            }
-
-            /* -------------------------------------------------------------- */
-            /* Copy factored column back to host.                             */
-            /* -------------------------------------------------------------- */
-
-            cudaStat = cudaEventRecord (Common->cublasEventPotrf[2],
-                                        Common->gpuStream[0]) ;
-            if (cudaStat)
-            {
-                ERROR (CHOLMOD_GPU_PROBLEM, "CUDA event failure") ;
-            }
-
-            cudaStat = cudaStreamWaitEvent (Common->gpuStream[1],
-                                            Common->cublasEventPotrf[2], 0) ;
-            if (cudaStat)
-            {
-                ERROR (CHOLMOD_GPU_PROBLEM, "CUDA event failure") ;
-            }
-
-            cudaStat = cudaMemcpy2DAsync (A + L_ENTRY*(j + jb + j * lda),
-                  lda * L_ENTRY * sizeof (double),
-                  devPtrA + L_ENTRY*
-                  (j + jb + j * gpu_lda),
-                  gpu_lda * L_ENTRY * sizeof (double),
-                  L_ENTRY * sizeof (double)*
-                  (n - j - jb), jb,
-                  cudaMemcpyDeviceToHost,
-                  Common->gpuStream[1]) ;
-
-            if (cudaStat)
-            {
-                ERROR (CHOLMOD_GPU_PROBLEM, "GPU memcopy to device") ;
-            }
-        }
-    }
-
-#ifndef NTIMER
-    Common->CHOLMOD_GPU_POTRF_TIME += SuiteSparse_time ( ) - tstart ;
-#endif
-
-    return (1) ;
-}
-
-
-/* ========================================================================== */
-/* === gpu_triangular_solve ================================================= */
-/* ========================================================================== */
-
-/* The current supernode is columns k1 to k2-1 of L.  Let L1 be the diagonal
- * block (factorized by dpotrf/zpotrf above; rows/cols k1:k2-1), and L2 be rows
- * k2:n-1 and columns k1:k2-1 of L.  The triangular system to solve is L2*L1' =
- * S2, where S2 is overwritten with L2.  More precisely, L2 = S2 / L1' in
- * MATLAB notation.
- */
-
-/* Version with pre-allocation in POTRF */
-
-int TEMPLATE2 (CHOLMOD (gpu_triangular_solve))
-(
-    Int nsrow2,     /* L1 and S2 are nsrow2-by-nscol2 */
-    Int nscol2,     /* L1 is nscol2-by-nscol2 */
-    Int nsrow,      /* leading dimension of L1, L2, and S2 */
-    Int psx,        /* L1 is at Lx+L_ENTRY*psx;
-                     * L2 at Lx+L_ENTRY*(psx+nscol2)*/
-    double *Lx,     /* holds L1, L2, and S2 */
-    cholmod_common *Common,
-    cholmod_gpu_pointers *gpu_p
-)
-{
-    double *devPtrA, *devPtrB ;
-    cudaError_t cudaStat ;
-    cublasStatus_t cublasStatus ;
-    Int gpu_lda, gpu_ldb, gpu_rowstep ;
-
-    Int gpu_row_start = 0 ;
-    Int gpu_row_max_chunk, gpu_row_chunk;
-    int ibuf = 0;
-    int iblock = 0;
-    int iHostBuff = (Common->ibuffer+CHOLMOD_HOST_SUPERNODE_BUFFERS-1) %
-        CHOLMOD_HOST_SUPERNODE_BUFFERS;
-    int i, j;
-    Int iidx;
-    int iwrap;
-
-#ifndef NTIMER
-    double tstart ;
-#endif
-
-#ifdef REAL
-    double alpha  = 1.0 ;
-    gpu_row_max_chunk = 768;
-#else
-    cuDoubleComplex calpha  = {1.0,0.0} ;
-    gpu_row_max_chunk = 256;
-#endif
-
-    if ( nsrow2 <= 0 )
-    {
-        return (0) ;
-    }
-
-#ifndef NTIMER
-    tstart = SuiteSparse_time ( ) ;
-    Common->CHOLMOD_GPU_TRSM_CALLS++ ;
-#endif
-
-    gpu_lda = ((nscol2+31)/32)*32 ;
-    gpu_ldb = ((nsrow2+31)/32)*32 ;
-
-    devPtrA = gpu_p->d_Lx[0];
-    devPtrB = gpu_p->d_Lx[1];
-
-    /* make sure the copy of B has completed */
-    cudaStreamSynchronize( Common->gpuStream[0] );
-
-    /* ---------------------------------------------------------------------- */
-    /* do the CUDA BLAS dtrsm */
-    /* ---------------------------------------------------------------------- */
-
-    while ( gpu_row_start < nsrow2 )
-    {
-
-        gpu_row_chunk = nsrow2 - gpu_row_start;
-        if ( gpu_row_chunk  > gpu_row_max_chunk ) {
-            gpu_row_chunk = gpu_row_max_chunk;
-        }
-
-        cublasStatus = cublasSetStream ( Common->cublasHandle,
-                                         Common->gpuStream[ibuf] );
-
-        if ( cublasStatus != CUBLAS_STATUS_SUCCESS )
-        {
-            ERROR ( CHOLMOD_GPU_PROBLEM, "GPU CUBLAS stream");
-        }
-
-#ifdef REAL
-        cublasStatus = cublasDtrsm (Common->cublasHandle,
-                                    CUBLAS_SIDE_RIGHT,
-                                    CUBLAS_FILL_MODE_LOWER,
-                                    CUBLAS_OP_T,
-                                    CUBLAS_DIAG_NON_UNIT,
-                                    gpu_row_chunk,
-                                    nscol2,
-                                    &alpha,
-                                    devPtrA,
-                                    gpu_lda,
-                                    devPtrB + gpu_row_start,
-                                    gpu_ldb) ;
-#else
-        cublasStatus = cublasZtrsm (Common->cublasHandle,
-                                    CUBLAS_SIDE_RIGHT,
-                                    CUBLAS_FILL_MODE_LOWER,
-                                    CUBLAS_OP_C,
-                                    CUBLAS_DIAG_NON_UNIT,
-                                    gpu_row_chunk,
-                                    nscol2,
-                                    &calpha,
-                                    (const cuDoubleComplex *) devPtrA,
-                                    gpu_lda,
-                                    (cuDoubleComplex *)devPtrB + gpu_row_start ,
-                                    gpu_ldb) ;
-#endif
-        if (cublasStatus != CUBLAS_STATUS_SUCCESS)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "GPU CUBLAS routine failure") ;
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* copy result back to the CPU */
-        /* ------------------------------------------------------------------ */
-
-        cudaStat = cudaMemcpy2DAsync (
-            gpu_p->h_Lx[iHostBuff] +
-            L_ENTRY*(nscol2+gpu_row_start),
-            nsrow * L_ENTRY * sizeof (Lx [0]),
-            devPtrB + L_ENTRY*gpu_row_start,
-            gpu_ldb * L_ENTRY * sizeof (devPtrB [0]),
-            gpu_row_chunk * L_ENTRY *
-            sizeof (devPtrB [0]),
-            nscol2,
-            cudaMemcpyDeviceToHost,
-            Common->gpuStream[ibuf]);
-
-        if (cudaStat)
-        {
-            ERROR (CHOLMOD_GPU_PROBLEM, "GPU memcopy from device") ;
-        }
-
-        cudaEventRecord ( Common->updateCBuffersFree[ibuf],
-                          Common->gpuStream[ibuf] );
-
-        gpu_row_start += gpu_row_chunk;
-        ibuf++;
-        ibuf = ibuf % CHOLMOD_HOST_SUPERNODE_BUFFERS;
-
-        iblock ++;
-
-        if ( iblock >= CHOLMOD_HOST_SUPERNODE_BUFFERS )
-        {
-            Int gpu_row_start2 ;
-            Int gpu_row_end ;
-
-            /* then CHOLMOD_HOST_SUPERNODE_BUFFERS worth of work has been
-             *  scheduled, so check for completed events and copy result into
-             *  Lx before continuing. */
-            cudaEventSynchronize ( Common->updateCBuffersFree
-                                   [iblock%CHOLMOD_HOST_SUPERNODE_BUFFERS] );
-
-            /* copy into Lx */
-            gpu_row_start2 = nscol2 +
-                (iblock-CHOLMOD_HOST_SUPERNODE_BUFFERS)
-                *gpu_row_max_chunk;
-            gpu_row_end = gpu_row_start2+gpu_row_max_chunk;
-
-            if ( gpu_row_end > nsrow ) gpu_row_end = nsrow;
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    private(iidx) if ( nscol2 > 32 )
-
-            for ( j=0; j<nscol2; j++ ) {
-                for ( i=gpu_row_start2*L_ENTRY; i<gpu_row_end*L_ENTRY; i++ ) {
-                    iidx = j*nsrow*L_ENTRY+i;
-                    Lx[psx*L_ENTRY+iidx] = gpu_p->h_Lx[iHostBuff][iidx];
-                }
-            }
-        }
-    }
-
-    /* Convenient to copy the L1 block here */
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-private ( iidx ) if ( nscol2 > 32 )
-
-    for ( j=0; j<nscol2; j++ ) {
-        for ( i=j*L_ENTRY; i<nscol2*L_ENTRY; i++ ) {
-            iidx = j*nsrow*L_ENTRY + i;
-            Lx[psx*L_ENTRY+iidx] = gpu_p->h_Lx[iHostBuff][iidx];
-        }
-    }
-
-    /* now account for the last HSTREAMS buffers */
-    for ( iwrap=0; iwrap<CHOLMOD_HOST_SUPERNODE_BUFFERS; iwrap++ )
-    {
-        int i, j;
-        Int gpu_row_start2 = nscol2 + (iblock-CHOLMOD_HOST_SUPERNODE_BUFFERS)
-            *gpu_row_max_chunk;
-        if (iblock-CHOLMOD_HOST_SUPERNODE_BUFFERS >= 0 &&
-            gpu_row_start2 < nsrow )
-        {
-            Int iidx;
-            Int gpu_row_end = gpu_row_start2+gpu_row_max_chunk;
-            if ( gpu_row_end > nsrow ) gpu_row_end = nsrow;
-            cudaEventSynchronize ( Common->updateCBuffersFree
-                                   [iblock%CHOLMOD_HOST_SUPERNODE_BUFFERS] );
-            /* copy into Lx */
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    private(iidx) if ( nscol2 > 32 )
-
-            for ( j=0; j<nscol2; j++ ) {
-                for ( i=gpu_row_start2*L_ENTRY; i<gpu_row_end*L_ENTRY; i++ ) {
-                    iidx = j*nsrow*L_ENTRY+i;
-                    Lx[psx*L_ENTRY+iidx] = gpu_p->h_Lx[iHostBuff][iidx];
-                }
-            }
-        }
-        iblock++;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return */
-    /* ---------------------------------------------------------------------- */
-
-#ifndef NTIMER
-    Common->CHOLMOD_GPU_TRSM_TIME += SuiteSparse_time ( ) - tstart ;
-#endif
-
-    return (1) ;
-}
-
-/* ========================================================================== */
-/* === gpu_copy_supernode =================================================== */
-/* ========================================================================== */
-/*
- * In the event gpu_triangular_sovle is not needed / called, this routine
- * copies the factored diagonal block from the GPU to the CPU.
- */
-
-void TEMPLATE2 (CHOLMOD (gpu_copy_supernode))
-(
-    cholmod_common *Common,
-    double *Lx,
-    Int psx,
-    Int nscol,
-    Int nscol2,
-    Int nsrow,
-    int supernodeUsedGPU,
-    int iHostBuff,
-    cholmod_gpu_pointers *gpu_p
-)
-{
-    Int iidx, i, j;
-    if ( supernodeUsedGPU && nscol2 * L_ENTRY >= CHOLMOD_POTRF_LIMIT ) {
-        cudaDeviceSynchronize();
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    private(iidx,i,j) if (nscol>32)
-
-        for ( j=0; j<nscol; j++ ) {
-            for ( i=j*L_ENTRY; i<nscol*L_ENTRY; i++ ) {
-                iidx = j*nsrow*L_ENTRY+i;
-                Lx[psx*L_ENTRY+iidx] = gpu_p->h_Lx[iHostBuff][iidx];
-            }
-        }
-    }
-    return;
-}
-
-#endif
-
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/License.txt b/src/C/SuiteSparse/CHOLMOD/Include/License.txt
deleted file mode 100644
index ea2c374..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/License.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-CHOLMOD/Include/* files.
-Copyright (C) 2005-2006, either Univ. of Florida or T. Davis,
-depending on the file.
-
-Refer to each include file in this directory; each file is licensed
-separately, according to the Module for which it contains definitions
-and prototypes.
-
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/README.txt b/src/C/SuiteSparse/CHOLMOD/Include/README.txt
deleted file mode 100644
index ec68624..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/README.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-CHOLMOD: a sparse Cholesky factorization package.  http://www.suitesparse.com
-
-The Include/*.h files in this directory provide a basic documentation of all
-user-callable routines and user-visible data structures in the CHOLMOD
-package.  Start with cholmod.h, which describes the general structure of
-the parameter lists of CHOLMOD routines.  cholmod_core.h describes the
-data structures and basic operations on them (creating and deleting them).
-
-cholmod.h		single include file for all user programs
-cholmod_config.h	CHOLMOD compile-time configuration
-
-cholmod_core.h		Core module: data structures and basic support routines
-cholmod_check.h		Check module: check/print CHOLMOD data structures
-cholmod_cholesky.h	Cholesky module: LL' and LDL' factorization
-cholmod_matrixops.h	MatrixOps module: sparse matrix operators (add, mult,..)
-cholmod_modify.h	Modify module: update/downdate/...
-cholmod_partition.h	Partition module: nested dissection ordering
-cholmod_supernodal.h	Supernodal module: supernodal Cholesky
-
-These include files are not used in user programs, but in CHOLMOD only:
-
-cholmod_blas.h		BLAS definitions
-cholmod_complexity.h	complex arithmetic
-cholmod_template.h	complex arithmetic for template routines
-cholmod_internal.h	internal definitions, not visible to user program
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod.h
deleted file mode 100644
index 21d3ed2..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod.h ==================================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod.h.
- * Copyright (C) 2005-2013, Univ. of Florida.  Author: Timothy A. Davis
- * CHOLMOD/Include/cholmod.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * http://www.suitesparse.com
- *
- * Portions of CHOLMOD (the Core and Partition Modules) are copyrighted by the
- * University of Florida.  The Modify Module is co-authored by William W.
- * Hager, Univ. of Florida.
- *
- * Acknowledgements:  this work was supported in part by the National Science
- * Foundation (NFS CCR-0203270 and DMS-9803599), and a grant from Sandia
- * National Laboratories (Dept. of Energy) which supported the development of
- * CHOLMOD's Partition Module.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD include file, for inclusion user programs.
- *
- * The include files listed below include a short description of each user-
- * callable routine.  Each routine in CHOLMOD has a consistent interface.
- * More details about the CHOLMOD data types is in the cholmod_core.h file.
- *
- * Naming convention:
- * ------------------
- *
- *	All routine names, data types, and CHOLMOD library files use the
- *	cholmod_ prefix.  All macros and other #define's use the CHOLMOD
- *	prefix.
- * 
- * Return value:
- * -------------
- *
- *	Most CHOLMOD routines return an int (TRUE (1) if successful, or FALSE
- *	(0) otherwise.  A SuiteSparse_long or double return value is >= 0 if
- *	successful, or -1 otherwise.  A size_t return value is > 0 if
- *	successful, or 0 otherwise.
- *
- *	If a routine returns a pointer, it is a pointer to a newly allocated
- *	object or NULL if a failure occured, with one exception.  cholmod_free
- *	always returns NULL.
- *
- * "Common" parameter:
- * ------------------
- *
- *	The last parameter in all CHOLMOD routines is a pointer to the CHOLMOD
- *	"Common" object.  This contains control parameters, statistics, and
- *	workspace used between calls to CHOLMOD.  It is always an input/output
- *	parameter.
- *
- * Input, Output, and Input/Output parameters:
- * -------------------------------------------
- *
- *	Input parameters are listed first.  They are not modified by CHOLMOD.
- *
- *	Input/output are listed next.  They must be defined on input, and
- *	are modified on output.
- *
- *	Output parameters are listed next.  If they are pointers, they must
- *	point to allocated space on input, but their contents are not defined
- *	on input.
- *
- *	Workspace parameters appear next.  They are used in only two routines
- *	in the Supernodal module.
- *
- *	The cholmod_common *Common parameter always appears as the last
- *	parameter.  It is always an input/output parameter.
- */
-
-#ifndef CHOLMOD_H
-#define CHOLMOD_H
-
-/* make it easy for C++ programs to include CHOLMOD */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* assume large file support.  If problems occur, compile with -DNLARGEFILE */
-#include "cholmod_io64.h"
-
-#include "SuiteSparse_config.h"
-
-#include "cholmod_config.h"
-
-
-/* CHOLMOD always includes the Core module. */
-#include "cholmod_core.h"
-
-#ifndef NCHECK
-#include "cholmod_check.h"
-#endif
-
-#ifndef NCHOLESKY
-#include "cholmod_cholesky.h"
-#endif
-
-#ifndef NMATRIXOPS
-#include "cholmod_matrixops.h"
-#endif
-
-#ifndef NMODIFY
-#include "cholmod_modify.h"
-#endif
-
-#ifndef NCAMD
-#include "cholmod_camd.h"
-#endif
-
-#ifndef NPARTITION
-#include "cholmod_partition.h"
-#endif
-
-#ifndef NSUPERNODAL
-#include "cholmod_supernodal.h"
-#endif
-
-#ifdef GPU_BLAS
-#include "cholmod_gpu.h"
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_blas.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_blas.h
deleted file mode 100644
index f99e04d..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_blas.h
+++ /dev/null
@@ -1,455 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_blas.h =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_blas.h.
- * Copyright (C) 2005-2006, Univ. of Florida.  Author: Timothy A. Davis
- * CHOLMOD/Include/cholmod_blas.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* This does not need to be included in the user's program. */
-
-#ifndef CHOLMOD_BLAS_H
-#define CHOLMOD_BLAS_H
-
-/* ========================================================================== */
-/* === Architecture ========================================================= */
-/* ========================================================================== */
-
-#if defined (__sun) || defined (MSOL2) || defined (ARCH_SOL2)
-#define CHOLMOD_SOL2
-#define CHOLMOD_ARCHITECTURE "Sun Solaris"
-
-#elif defined (__sgi) || defined (MSGI) || defined (ARCH_SGI)
-#define CHOLMOD_SGI
-#define CHOLMOD_ARCHITECTURE "SGI Irix"
-
-#elif defined (__linux) || defined (MGLNX86) || defined (ARCH_GLNX86)
-#define CHOLMOD_LINUX
-#define CHOLMOD_ARCHITECTURE "Linux"
-
-#elif defined (__APPLE__)
-#define CHOLMOD_MAC
-#define CHOLMOD_ARCHITECTURE "Mac"
-
-#elif defined (_AIX) || defined (MIBM_RS) || defined (ARCH_IBM_RS)
-#define CHOLMOD_AIX
-#define CHOLMOD_ARCHITECTURE "IBM AIX"
-/* recent reports from IBM AIX seem to indicate that this is not needed: */
-/* #define BLAS_NO_UNDERSCORE */
-
-#elif defined (__alpha) || defined (MALPHA) || defined (ARCH_ALPHA)
-#define CHOLMOD_ALPHA
-#define CHOLMOD_ARCHITECTURE "Compaq Alpha"
-
-#elif defined (_WIN32) || defined (WIN32) || defined (_WIN64) || defined (WIN64)
-#if defined (__MINGW32__) || defined (__MINGW32__)
-#define CHOLMOD_MINGW
-#elif defined (__CYGWIN32__) || defined (__CYGWIN32__)
-#define CHOLMOD_CYGWIN
-#else
-#define CHOLMOD_WINDOWS
-#define BLAS_NO_UNDERSCORE
-#endif
-#define CHOLMOD_ARCHITECTURE "Microsoft Windows"
-
-#elif defined (__hppa) || defined (__hpux) || defined (MHPUX) || defined (ARCH_HPUX)
-#define CHOLMOD_HP
-#define CHOLMOD_ARCHITECTURE "HP Unix"
-#define BLAS_NO_UNDERSCORE
-
-#elif defined (__hp700) || defined (MHP700) || defined (ARCH_HP700)
-#define CHOLMOD_HP
-#define CHOLMOD_ARCHITECTURE "HP 700 Unix"
-#define BLAS_NO_UNDERSCORE
-
-#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 CHOLMOD_ARCHITECTURE "unknown"
-#endif
-
-/* ========================================================================== */
-/* === BLAS and LAPACK names ================================================ */
-/* ========================================================================== */
-
-/* Prototypes for the various versions of the BLAS.  */
-
-/* Determine if the 64-bit Sun Performance BLAS is to be used */
-#if defined(CHOLMOD_SOL2) && !defined(NSUNPERF) && defined(BLAS64)
-#define SUN64
-#endif
-
-#ifdef SUN64
-
-#define BLAS_DTRSV dtrsv_64_
-#define BLAS_DGEMV dgemv_64_
-#define BLAS_DTRSM dtrsm_64_
-#define BLAS_DGEMM dgemm_64_
-#define BLAS_DSYRK dsyrk_64_
-#define BLAS_DGER  dger_64_
-#define BLAS_DSCAL dscal_64_
-#define LAPACK_DPOTRF dpotrf_64_
-
-#define BLAS_ZTRSV ztrsv_64_
-#define BLAS_ZGEMV zgemv_64_
-#define BLAS_ZTRSM ztrsm_64_
-#define BLAS_ZGEMM zgemm_64_
-#define BLAS_ZHERK zherk_64_
-#define BLAS_ZGER  zgeru_64_
-#define BLAS_ZSCAL zscal_64_
-#define LAPACK_ZPOTRF zpotrf_64_
-
-#elif defined (BLAS_NO_UNDERSCORE)
-
-#define BLAS_DTRSV dtrsv
-#define BLAS_DGEMV dgemv
-#define BLAS_DTRSM dtrsm
-#define BLAS_DGEMM dgemm
-#define BLAS_DSYRK dsyrk
-#define BLAS_DGER  dger
-#define BLAS_DSCAL dscal
-#define LAPACK_DPOTRF dpotrf
-
-#define BLAS_ZTRSV ztrsv
-#define BLAS_ZGEMV zgemv
-#define BLAS_ZTRSM ztrsm
-#define BLAS_ZGEMM zgemm
-#define BLAS_ZHERK zherk
-#define BLAS_ZGER  zgeru
-#define BLAS_ZSCAL zscal
-#define LAPACK_ZPOTRF zpotrf
-
-#else
-
-#define BLAS_DTRSV dtrsv_
-#define BLAS_DGEMV dgemv_
-#define BLAS_DTRSM dtrsm_
-#define BLAS_DGEMM dgemm_
-#define BLAS_DSYRK dsyrk_
-#define BLAS_DGER  dger_
-#define BLAS_DSCAL dscal_
-#define LAPACK_DPOTRF dpotrf_
-
-#define BLAS_ZTRSV ztrsv_
-#define BLAS_ZGEMV zgemv_
-#define BLAS_ZTRSM ztrsm_
-#define BLAS_ZGEMM zgemm_
-#define BLAS_ZHERK zherk_
-#define BLAS_ZGER  zgeru_
-#define BLAS_ZSCAL zscal_
-#define LAPACK_ZPOTRF zpotrf_
-
-#endif
-
-/* ========================================================================== */
-/* === BLAS and LAPACK integer arguments ==================================== */
-/* ========================================================================== */
-
-/* Compile CHOLMOD, UMFPACK, and SPQR with -DBLAS64 if you have a BLAS that
- * uses 64-bit integers */
-
-#if defined (LONGBLAS) || defined (BLAS64)
-#define BLAS_INT SuiteSparse_long
-#else
-#define BLAS_INT int
-#endif
-
-/* If the BLAS integer is smaller than the basic CHOLMOD integer, then we need
- * to check for integer overflow when converting from Int to BLAS_INT.  If
- * any integer overflows, the externally-defined BLAS_OK variable is
- * set to FALSE.  BLAS_OK should be set to TRUE before calling any
- * BLAS_* macro.
- */
-
-#define CHECK_BLAS_INT (sizeof (BLAS_INT) < sizeof (Int))
-#define EQ(K,k) (((BLAS_INT) K) == ((Int) k))
-
-/* ========================================================================== */
-/* === BLAS and LAPACK prototypes and macros ================================ */
-/* ========================================================================== */
-
-void BLAS_DGEMV (char *trans, BLAS_INT *m, BLAS_INT *n, double *alpha,
-	double *A, BLAS_INT *lda, double *X, BLAS_INT *incx, double *beta,
-	double *Y, BLAS_INT *incy) ;
-
-#define BLAS_dgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, INCX = incx, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-        EQ (INCX,incx) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DGEMV (trans, &M, &N, alpha, A, &LDA, X, &INCX, beta, Y, &INCY) ; \
-    } \
-}
-
-void BLAS_ZGEMV (char *trans, BLAS_INT *m, BLAS_INT *n, double *alpha,
-	double *A, BLAS_INT *lda, double *X, BLAS_INT *incx, double *beta,
-	double *Y, BLAS_INT *incy) ;
-
-#define BLAS_zgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, INCX = incx, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-        EQ (INCX,incx) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZGEMV (trans, &M, &N, alpha, A, &LDA, X, &INCX, beta, Y, &INCY) ; \
-    } \
-}
-
-void BLAS_DTRSV (char *uplo, char *trans, char *diag, BLAS_INT *n, double *A,
-	BLAS_INT *lda, double *X, BLAS_INT *incx) ;
-
-#define BLAS_dtrsv(uplo,trans,diag,n,A,lda,X,incx) \
-{ \
-    BLAS_INT N = n, LDA = lda, INCX = incx ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (LDA,lda) && EQ (INCX,incx))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DTRSV (uplo, trans, diag, &N, A, &LDA, X, &INCX) ; \
-    } \
-}
-
-void BLAS_ZTRSV (char *uplo, char *trans, char *diag, BLAS_INT *n, double *A,
-	BLAS_INT *lda, double *X, BLAS_INT *incx) ;
-
-#define BLAS_ztrsv(uplo,trans,diag,n,A,lda,X,incx) \
-{ \
-    BLAS_INT N = n, LDA = lda, INCX = incx ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (LDA,lda) && EQ (INCX,incx))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZTRSV (uplo, trans, diag, &N, A, &LDA, X, &INCX) ; \
-    } \
-}
-
-void BLAS_DTRSM (char *side, char *uplo, char *transa, char *diag, BLAS_INT *m,
-	BLAS_INT *n, double *alpha, double *A, BLAS_INT *lda, double *B,
-	BLAS_INT *ldb) ;
-
-#define BLAS_dtrsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, LDB = ldb ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-        EQ (LDB,ldb))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DTRSM (side, uplo, transa, diag, &M, &N, alpha, A, &LDA, B, &LDB);\
-    } \
-}
-
-void BLAS_ZTRSM (char *side, char *uplo, char *transa, char *diag, BLAS_INT *m,
-	BLAS_INT *n, double *alpha, double *A, BLAS_INT *lda, double *B,
-	BLAS_INT *ldb) ;
-
-#define BLAS_ztrsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, LDB = ldb ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-        EQ (LDB,ldb))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZTRSM (side, uplo, transa, diag, &M, &N, alpha, A, &LDA, B, &LDB);\
-    } \
-}
-
-void BLAS_DGEMM (char *transa, char *transb, BLAS_INT *m, BLAS_INT *n,
-	BLAS_INT *k, double *alpha, double *A, BLAS_INT *lda, double *B,
-	BLAS_INT *ldb, double *beta, double *C, BLAS_INT *ldc) ;
-
-#define BLAS_dgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc) \
-{ \
-    BLAS_INT M = m, N = n, K = k, LDA = lda, LDB = ldb, LDC = ldc ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (K,k) && \
-        EQ (LDA,lda) && EQ (LDB,ldb) && EQ (LDC,ldc))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DGEMM (transa, transb, &M, &N, &K, alpha, A, &LDA, B, &LDB, beta, \
-	    C, &LDC) ; \
-    } \
-}
-
-void BLAS_ZGEMM (char *transa, char *transb, BLAS_INT *m, BLAS_INT *n,
-	BLAS_INT *k, double *alpha, double *A, BLAS_INT *lda, double *B,
-	BLAS_INT *ldb, double *beta, double *C, BLAS_INT *ldc) ;
-
-#define BLAS_zgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc) \
-{ \
-    BLAS_INT M = m, N = n, K = k, LDA = lda, LDB = ldb, LDC = ldc ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (K,k) && \
-        EQ (LDA,lda) && EQ (LDB,ldb) && EQ (LDC,ldc))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZGEMM (transa, transb, &M, &N, &K, alpha, A, &LDA, B, &LDB, beta, \
-	    C, &LDC) ; \
-    } \
-}
-
-void BLAS_DSYRK (char *uplo, char *trans, BLAS_INT *n, BLAS_INT *k,
-	double *alpha, double *A, BLAS_INT *lda, double *beta, double *C,
-	BLAS_INT *ldc) ;
-
-#define BLAS_dsyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc) \
-{ \
-    BLAS_INT N = n, K = k, LDA = lda, LDC = ldc ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (K,k) && EQ (LDA,lda) && \
-        EQ (LDC,ldc))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DSYRK (uplo, trans, &N, &K, alpha, A, &LDA, beta, C, &LDC) ; \
-    } \
-} \
-
-void BLAS_ZHERK (char *uplo, char *trans, BLAS_INT *n, BLAS_INT *k,
-	double *alpha, double *A, BLAS_INT *lda, double *beta, double *C,
-	BLAS_INT *ldc) ;
-
-#define BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc) \
-{ \
-    BLAS_INT N = n, K = k, LDA = lda, LDC = ldc ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (K,k) && EQ (LDA,lda) && \
-        EQ (LDC,ldc))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZHERK (uplo, trans, &N, &K, alpha, A, &LDA, beta, C, &LDC) ; \
-    } \
-} \
-
-void LAPACK_DPOTRF (char *uplo, BLAS_INT *n, double *A, BLAS_INT *lda,
-	BLAS_INT *info) ;
-
-#define LAPACK_dpotrf(uplo,n,A,lda,info) \
-{ \
-    BLAS_INT N = n, LDA = lda, INFO = 1 ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (LDA,lda))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	LAPACK_DPOTRF (uplo, &N, A, &LDA, &INFO) ; \
-    } \
-    info = INFO ; \
-}
-
-void LAPACK_ZPOTRF (char *uplo, BLAS_INT *n, double *A, BLAS_INT *lda,
-	BLAS_INT *info) ;
-
-#define LAPACK_zpotrf(uplo,n,A,lda,info) \
-{ \
-    BLAS_INT N = n, LDA = lda, INFO = 1 ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (LDA,lda))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	LAPACK_ZPOTRF (uplo, &N, A, &LDA, &INFO) ; \
-    } \
-    info = INFO ; \
-}
-
-/* ========================================================================== */
-
-void BLAS_DSCAL (BLAS_INT *n, double *alpha, double *Y, BLAS_INT *incy) ;
-
-#define BLAS_dscal(n,alpha,Y,incy) \
-{ \
-    BLAS_INT N = n, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DSCAL (&N, alpha, Y, &INCY) ; \
-    } \
-}
-
-void BLAS_ZSCAL (BLAS_INT *n, double *alpha, double *Y, BLAS_INT *incy) ;
-
-#define BLAS_zscal(n,alpha,Y,incy) \
-{ \
-    BLAS_INT N = n, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZSCAL (&N, alpha, Y, &INCY) ; \
-    } \
-}
-
-void BLAS_DGER (BLAS_INT *m, BLAS_INT *n, double *alpha,
-	double *X, BLAS_INT *incx, double *Y, BLAS_INT *incy,
-	double *A, BLAS_INT *lda) ;
-
-#define BLAS_dger(m,n,alpha,X,incx,Y,incy,A,lda) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, INCX = incx, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-          EQ (INCX,incx) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DGER (&M, &N, alpha, X, &INCX, Y, &INCY, A, &LDA) ; \
-    } \
-}
-
-void BLAS_ZGER (BLAS_INT *m, BLAS_INT *n, double *alpha,
-	double *X, BLAS_INT *incx, double *Y, BLAS_INT *incy,
-	double *A, BLAS_INT *lda) ;
-
-#define BLAS_zgeru(m,n,alpha,X,incx,Y,incy,A,lda) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, INCX = incx, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-          EQ (INCX,incx) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZGER (&M, &N, alpha, X, &INCX, Y, &INCY, A, &LDA) ; \
-    } \
-}
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_camd.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_camd.h
deleted file mode 100644
index 3e1bf8d..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_camd.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_camd.h =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_camd.h.
- * Copyright (C) 2005-2013, Univ. of Florida.  Author: Timothy A. Davis
- * CHOLMOD/Include/cholmod_partition.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD Partition module, interface to CAMD, CCOLAMD, and CSYMAMD
- *
- * An interface to CCOLAMD and CSYMAMD, constrained minimum degree ordering
- * methods which order a matrix following constraints determined via nested
- * dissection.
- *
- * These functions do not require METIS.  They are installed unless NCAMD
- * is defined:
- * cholmod_ccolamd		interface to CCOLAMD ordering
- * cholmod_csymamd		interface to CSYMAMD ordering
- * cholmod_camd			interface to CAMD ordering
- *
- * Requires the Core and Cholesky modules, and two packages: CAMD,
- * and CCOLAMD.  Used by functions in the Partition Module.
- */
-
-#ifndef CHOLMOD_CAMD_H
-#define CHOLMOD_CAMD_H
-
-#include "cholmod_core.h"
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_ccolamd */
-/* -------------------------------------------------------------------------- */
-
-/* Order AA' or A(:,f)*A(:,f)' using CCOLAMD. */
-
-int cholmod_ccolamd
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int *Cmember,	/* size A->nrow.  Cmember [i] = c if row i is in the
-			 * constraint set c.  c must be >= 0.  The # of
-			 * constraint sets is max (Cmember) + 1.  If Cmember is
-			 * NULL, then it is interpretted as Cmember [i] = 0 for
-			 * all i */
-    /* ---- output --- */
-    int *Perm,		/* size A->nrow, output permutation */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_ccolamd (cholmod_sparse *, SuiteSparse_long *, size_t,
-    SuiteSparse_long *, SuiteSparse_long *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_csymamd */
-/* -------------------------------------------------------------------------- */
-
-/* Order A using CSYMAMD. */
-
-int cholmod_csymamd
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    /* ---- output --- */
-    int *Cmember,	/* size nrow.  see cholmod_ccolamd above */
-    int *Perm,		/* size A->nrow, output permutation */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_csymamd (cholmod_sparse *, SuiteSparse_long *,
-    SuiteSparse_long *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_camd */
-/* -------------------------------------------------------------------------- */
-
-/* Order A using CAMD. */
-
-int cholmod_camd
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- output --- */
-    int *Cmember,	/* size nrow.  see cholmod_ccolamd above */
-    int *Perm,		/* size A->nrow, output permutation */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_camd (cholmod_sparse *, SuiteSparse_long *, size_t,
-    SuiteSparse_long *, SuiteSparse_long *, cholmod_common *) ;
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_check.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_check.h
deleted file mode 100644
index e75c415..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_check.h
+++ /dev/null
@@ -1,427 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_check.h ============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_check.h.  Copyright (C) 2005-2006, Timothy A. Davis
- * CHOLMOD/Include/cholmod_check.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * http://www.suitesparse.com
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD Check module.
- *
- * Routines that check and print the 5 basic data types in CHOLMOD, and 3 kinds
- * of integer vectors (subset, perm, and parent), and read in matrices from a
- * file:
- *
- * cholmod_check_common	    check/print the Common object
- * cholmod_print_common
- *
- * cholmod_check_sparse	    check/print a sparse matrix in column-oriented form
- * cholmod_print_sparse
- *
- * cholmod_check_dense	    check/print a dense matrix
- * cholmod_print_dense
- *
- * cholmod_check_factor	    check/print a Cholesky factorization
- * cholmod_print_factor
- *
- * cholmod_check_triplet    check/print a sparse matrix in triplet form
- * cholmod_print_triplet
- *
- * cholmod_check_subset	    check/print a subset (integer vector in given range)
- * cholmod_print_subset
- *
- * cholmod_check_perm	    check/print a permutation (an integer vector)
- * cholmod_print_perm
- *
- * cholmod_check_parent	    check/print an elimination tree (an integer vector)
- * cholmod_print_parent
- *
- * cholmod_read_triplet	    read a matrix in triplet form (any Matrix Market
- *			    "coordinate" format, or a generic triplet format).
- *
- * cholmod_read_sparse	    read a matrix in sparse form (same file format as
- *			    cholmod_read_triplet).
- *
- * cholmod_read_dense	    read a dense matrix (any Matrix Market "array"
- *			    format, or a generic dense format).
- *
- * cholmod_write_sparse	    write a sparse matrix to a Matrix Market file.
- *
- * cholmod_write_dense	    write a dense matrix to a Matrix Market file.
- *
- * cholmod_print_common and cholmod_check_common are the only two routines that
- * you may call after calling cholmod_finish.
- *
- * Requires the Core module.  Not required by any CHOLMOD module, except when
- * debugging is enabled (in which case all modules require the Check module).
- *
- * See cholmod_read.c for a description of the file formats supported by the
- * cholmod_read_* routines.
- */
-
-#ifndef CHOLMOD_CHECK_H
-#define CHOLMOD_CHECK_H
-
-#include "cholmod_core.h"
-#include <stdio.h>
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_check_common:  check the Common object */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_check_common
-(
-    cholmod_common *Common
-) ;
-
-int cholmod_l_check_common (cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_print_common:  print the Common object */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_print_common
-(
-    /* ---- input ---- */
-    const char *name,	/* printed name of Common object */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_print_common (const char *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_gpu_stats:  print the GPU / CPU statistics */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_gpu_stats   (cholmod_common *) ;
-int cholmod_l_gpu_stats (cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_check_sparse:  check a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_check_sparse
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* sparse matrix to check */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_check_sparse (cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_print_sparse */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_print_sparse
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* sparse matrix to print */
-    const char *name,	/* printed name of sparse matrix */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_print_sparse (cholmod_sparse *, const char *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_check_dense:  check a dense matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_check_dense
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* dense matrix to check */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_check_dense (cholmod_dense *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_print_dense:  print a dense matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_print_dense
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* dense matrix to print */
-    const char *name,	/* printed name of dense matrix */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_print_dense (cholmod_dense *, const char *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_check_factor:  check a factor */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_check_factor
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to check */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_check_factor (cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_print_factor:  print a factor */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_print_factor
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to print */
-    const char *name,	/* printed name of factor */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_print_factor (cholmod_factor *, const char *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_check_triplet:  check a sparse matrix in triplet form */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_check_triplet
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* triplet matrix to check */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_check_triplet (cholmod_triplet *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_print_triplet:  print a triplet matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_print_triplet
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* triplet matrix to print */
-    const char *name,	/* printed name of triplet matrix */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_print_triplet (cholmod_triplet *, const char *, cholmod_common *);
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_check_subset:  check a subset */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_check_subset
-(
-    /* ---- input ---- */
-    int *Set,		/* Set [0:len-1] is a subset of 0:n-1.  Duplicates OK */
-    SuiteSparse_long len,   /* size of Set (an integer array) */
-    size_t n,		/* 0:n-1 is valid range */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_check_subset (SuiteSparse_long *, SuiteSparse_long, size_t,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_print_subset:  print a subset */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_print_subset
-(
-    /* ---- input ---- */
-    int *Set,		/* Set [0:len-1] is a subset of 0:n-1.  Duplicates OK */
-    SuiteSparse_long len,   /* size of Set (an integer array) */
-    size_t n,		/* 0:n-1 is valid range */
-    const char *name,	/* printed name of Set */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_print_subset (SuiteSparse_long *, SuiteSparse_long, size_t,
-    const char *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_check_perm:  check a permutation */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_check_perm
-(
-    /* ---- input ---- */
-    int *Perm,		/* Perm [0:len-1] is a permutation of subset of 0:n-1 */
-    size_t len,		/* size of Perm (an integer array) */
-    size_t n,		/* 0:n-1 is valid range */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_check_perm (SuiteSparse_long *, size_t, size_t, cholmod_common *);
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_print_perm:  print a permutation vector */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_print_perm
-(
-    /* ---- input ---- */
-    int *Perm,		/* Perm [0:len-1] is a permutation of subset of 0:n-1 */
-    size_t len,		/* size of Perm (an integer array) */
-    size_t n,		/* 0:n-1 is valid range */
-    const char *name,	/* printed name of Perm */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_print_perm (SuiteSparse_long *, size_t, size_t, const char *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_check_parent:  check an elimination tree */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_check_parent
-(
-    /* ---- input ---- */
-    int *Parent,	/* Parent [0:n-1] is an elimination tree */
-    size_t n,		/* size of Parent */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_check_parent (SuiteSparse_long *, size_t, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_print_parent */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_print_parent
-(
-    /* ---- input ---- */
-    int *Parent,	/* Parent [0:n-1] is an elimination tree */
-    size_t n,		/* size of Parent */
-    const char *name,	/* printed name of Parent */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_print_parent (SuiteSparse_long *, size_t, const char *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_read_sparse: read a sparse matrix from a file */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_read_sparse
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from, must already be open */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_read_sparse (FILE *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_read_triplet: read a triplet matrix from a file */
-/* -------------------------------------------------------------------------- */
-
-cholmod_triplet *cholmod_read_triplet
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from, must already be open */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_triplet *cholmod_l_read_triplet (FILE *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_read_dense: read a dense matrix from a file */
-/* -------------------------------------------------------------------------- */
-
-cholmod_dense *cholmod_read_dense
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from, must already be open */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_read_dense (FILE *, cholmod_common *) ; 
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_read_matrix: read a sparse or dense matrix from a file */
-/* -------------------------------------------------------------------------- */
-
-void *cholmod_read_matrix
-(
-    /* ---- input ---- */
-    FILE *f,		/* file to read from, must already be open */
-    int prefer,		/* If 0, a sparse matrix is always return as a
-			 *	cholmod_triplet form.  It can have any stype
-			 *	(symmetric-lower, unsymmetric, or
-			 *	symmetric-upper).
-			 * If 1, a sparse matrix is returned as an unsymmetric
-			 *	cholmod_sparse form (A->stype == 0), with both
-			 *	upper and lower triangular parts present.
-			 *	This is what the MATLAB mread mexFunction does,
-			 *	since MATLAB does not have an stype.
-			 * If 2, a sparse matrix is returned with an stype of 0
-			 *	or 1 (unsymmetric, or symmetric with upper part
-			 *	stored).
-			 * This argument has no effect for dense matrices.
-			 */
-    /* ---- output---- */
-    int *mtype,		/* CHOLMOD_TRIPLET, CHOLMOD_SPARSE or CHOLMOD_DENSE */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-void *cholmod_l_read_matrix (FILE *, int, int *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_write_sparse: write a sparse matrix to a file */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_write_sparse
-(
-    /* ---- input ---- */
-    FILE *f,		    /* file to write to, must already be open */
-    cholmod_sparse *A,	    /* matrix to print */
-    cholmod_sparse *Z,	    /* optional matrix with pattern of explicit zeros */
-    const char *comments,    /* optional filename of comments to include */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_write_sparse (FILE *, cholmod_sparse *, cholmod_sparse *,
-    const char *c, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_write_dense: write a dense matrix to a file */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_write_dense
-(
-    /* ---- input ---- */
-    FILE *f,		    /* file to write to, must already be open */
-    cholmod_dense *X,	    /* matrix to print */
-    const char *comments,    /* optional filename of comments to include */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_write_dense (FILE *, cholmod_dense *, const char *,
-    cholmod_common *) ;
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_cholesky.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_cholesky.h
deleted file mode 100644
index a6d6038..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_cholesky.h
+++ /dev/null
@@ -1,589 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_cholesky.h =========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_cholesky.h. Copyright (C) 2005-2013, Timothy A. Davis
- * CHOLMOD/Include/cholmod_cholesky.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * http://www.suitesparse.com
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD Cholesky module.
- *
- * Sparse Cholesky routines: analysis, factorization, and solve.
- *
- * The primary routines are all that a user requires to order, analyze, and
- * factorize a sparse symmetric positive definite matrix A (or A*A'), and
- * to solve Ax=b (or A*A'x=b).  The primary routines rely on the secondary
- * routines, the CHOLMOD Core module, and the AMD and COLAMD packages.  They
- * make optional use of the CHOLMOD Supernodal and Partition modules, the
- * METIS package, and the CCOLAMD package.
- *
- * Primary routines:
- * -----------------
- *
- * cholmod_analyze		order and analyze (simplicial or supernodal)
- * cholmod_factorize		simplicial or supernodal Cholesky factorization
- * cholmod_solve		solve a linear system (simplicial or supernodal)
- * cholmod_solve2		like cholmod_solve, but reuse workspace
- * cholmod_spsolve		solve a linear system (sparse x and b)
- *
- * Secondary routines:
- * ------------------
- *
- * cholmod_analyze_p		analyze, with user-provided permutation or f set
- * cholmod_factorize_p		factorize, with user-provided permutation or f
- * cholmod_analyze_ordering	analyze a fill-reducing ordering
- * cholmod_etree		find the elimination tree
- * cholmod_rowcolcounts		compute the row/column counts of L
- * cholmod_amd			order using AMD
- * cholmod_colamd		order using COLAMD
- * cholmod_rowfac		incremental simplicial factorization
- * cholmod_rowfac_mask		rowfac, specific to LPDASA
- * cholmod_rowfac_mask2         rowfac, specific to LPDASA
- * cholmod_row_subtree		find the nonzero pattern of a row of L
- * cholmod_resymbol		recompute the symbolic pattern of L
- * cholmod_resymbol_noperm	recompute the symbolic pattern of L, no L->Perm
- * cholmod_postorder		postorder a tree
- *
- * Requires the Core module, and two packages: AMD and COLAMD.
- * Optionally uses the Supernodal and Partition modules.
- * Required by the Partition module.
- */
-
-#ifndef CHOLMOD_CHOLESKY_H
-#define CHOLMOD_CHOLESKY_H
-
-#include "cholmod_config.h"
-#include "cholmod_core.h"
-
-#ifndef NPARTITION
-#include "cholmod_partition.h"
-#endif
-
-#ifndef NSUPERNODAL
-#include "cholmod_supernodal.h"
-#endif
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_analyze:  order and analyze (simplicial or supernodal) */
-/* -------------------------------------------------------------------------- */
-
-/* Orders and analyzes A, AA', PAP', or PAA'P' and returns a symbolic factor
- * that can later be passed to cholmod_factorize. */
-
-cholmod_factor *cholmod_analyze 
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order and analyze */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_factor *cholmod_l_analyze (cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_analyze_p:  analyze, with user-provided permutation or f set */
-/* -------------------------------------------------------------------------- */
-
-/* Orders and analyzes A, AA', PAP', PAA'P', FF', or PFF'P and returns a
- * symbolic factor that can later be passed to cholmod_factorize, where
- * F = A(:,fset) if fset is not NULL and A->stype is zero.
- * UserPerm is tried if non-NULL.  */
-
-cholmod_factor *cholmod_analyze_p
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order and analyze */
-    int *UserPerm,	/* user-provided permutation, size A->nrow */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_factor *cholmod_l_analyze_p (cholmod_sparse *, SuiteSparse_long *,
-    SuiteSparse_long *, size_t, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_analyze_p2:  analyze for sparse Cholesky or sparse QR */
-/* -------------------------------------------------------------------------- */
-
-cholmod_factor *cholmod_analyze_p2
-(
-    /* ---- input ---- */
-    int for_whom,       /* FOR_SPQR     (0): for SPQR but not GPU-accelerated
-                           FOR_CHOLESKY (1): for Cholesky (GPU or not)
-                           FOR_SPQRGPU  (2): for SPQR with GPU acceleration */
-    cholmod_sparse *A,	/* matrix to order and analyze */
-    int *UserPerm,	/* user-provided permutation, size A->nrow */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_factor *cholmod_l_analyze_p2 (int, cholmod_sparse *, SuiteSparse_long *,
-    SuiteSparse_long *, size_t, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_factorize:  simplicial or supernodal Cholesky factorization */
-/* -------------------------------------------------------------------------- */
-
-/* Factorizes PAP' (or PAA'P' if A->stype is 0), using a factor obtained
- * from cholmod_analyze.  The analysis can be re-used simply by calling this
- * routine a second time with another matrix.  A must have the same nonzero
- * pattern as that passed to cholmod_analyze. */
-
-int cholmod_factorize 
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* resulting factorization */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_factorize (cholmod_sparse *, cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_factorize_p:  factorize, with user-provided permutation or fset */
-/* -------------------------------------------------------------------------- */
-
-/* Same as cholmod_factorize, but with more options. */
-
-int cholmod_factorize_p
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    double beta [2],	/* factorize beta*I+A or beta*I+A'*A */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* resulting factorization */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_factorize_p (cholmod_sparse *, double *, SuiteSparse_long *,
-    size_t, cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_solve:  solve a linear system (simplicial or supernodal) */
-/* -------------------------------------------------------------------------- */
-
-/* Solves one of many linear systems with a dense right-hand-side, using the
- * factorization from cholmod_factorize (or as modified by any other CHOLMOD
- * routine).  D is identity for LL' factorizations. */
-
-#define CHOLMOD_A    0		/* solve Ax=b */
-#define CHOLMOD_LDLt 1		/* solve LDL'x=b */
-#define CHOLMOD_LD   2		/* solve LDx=b */
-#define CHOLMOD_DLt  3		/* solve DL'x=b */
-#define CHOLMOD_L    4		/* solve Lx=b */
-#define CHOLMOD_Lt   5		/* solve L'x=b */
-#define CHOLMOD_D    6		/* solve Dx=b */
-#define CHOLMOD_P    7		/* permute x=Px */
-#define CHOLMOD_Pt   8		/* permute x=P'x */
-
-cholmod_dense *cholmod_solve	/* returns the solution X */
-(
-    /* ---- input ---- */
-    int sys,		/* system to solve */
-    cholmod_factor *L,	/* factorization to use */
-    cholmod_dense *B,	/* right-hand-side */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_solve (int, cholmod_factor *, cholmod_dense *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_solve2:  like cholmod_solve, but with reusable workspace */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_solve2     /* returns TRUE on success, FALSE on failure */
-(
-    /* ---- input ---- */
-    int sys,		            /* system to solve */
-    cholmod_factor *L,	            /* factorization to use */
-    cholmod_dense *B,               /* right-hand-side */
-    cholmod_sparse *Bset,
-    /* ---- output --- */
-    cholmod_dense **X_Handle,       /* solution, allocated if need be */
-    cholmod_sparse **Xset_Handle,
-    /* ---- workspace  */
-    cholmod_dense **Y_Handle,       /* workspace, or NULL */
-    cholmod_dense **E_Handle,       /* workspace, or NULL */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_solve2 (int, cholmod_factor *, cholmod_dense *, cholmod_sparse *,
-    cholmod_dense **, cholmod_sparse **, cholmod_dense **, cholmod_dense **,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_spsolve:  solve a linear system with a sparse right-hand-side */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_spsolve
-(
-    /* ---- input ---- */
-    int sys,		/* system to solve */
-    cholmod_factor *L,	/* factorization to use */
-    cholmod_sparse *B,	/* right-hand-side */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_spsolve (int, cholmod_factor *, cholmod_sparse *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_etree: find the elimination tree of A or A'*A */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_etree
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,
-    /* ---- output --- */
-    int *Parent,	/* size ncol.  Parent [j] = p if p is the parent of j */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_etree (cholmod_sparse *, SuiteSparse_long *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowcolcounts: compute the row/column counts of L */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_rowcolcounts
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int *Parent,	/* size nrow.  Parent [i] = p if p is the parent of i */
-    int *Post,		/* size nrow.  Post [k] = i if i is the kth node in
-			 * the postordered etree. */
-    /* ---- output --- */
-    int *RowCount,	/* size nrow. RowCount [i] = # entries in the ith row of
-			 * L, including the diagonal. */
-    int *ColCount,	/* size nrow. ColCount [i] = # entries in the ith
-			 * column of L, including the diagonal. */
-    int *First,		/* size nrow.  First [i] = k is the least postordering
-			 * of any descendant of i. */
-    int *Level,		/* size nrow.  Level [i] is the length of the path from
-			 * i to the root, with Level [root] = 0. */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowcolcounts (cholmod_sparse *, SuiteSparse_long *, size_t,
-    SuiteSparse_long *, SuiteSparse_long *, SuiteSparse_long *,
-    SuiteSparse_long *, SuiteSparse_long *, SuiteSparse_long *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_analyze_ordering:  analyze a fill-reducing ordering */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_analyze_ordering
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    int ordering,	/* ordering method used */
-    int *Perm,		/* size n, fill-reducing permutation to analyze */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- output --- */
-    int *Parent,	/* size n, elimination tree */
-    int *Post,		/* size n, postordering of elimination tree */
-    int *ColCount,	/* size n, nnz in each column of L */
-    /* ---- workspace  */
-    int *First,		/* size nworkspace for cholmod_postorder */
-    int *Level,		/* size n workspace for cholmod_postorder */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_analyze_ordering (cholmod_sparse *, int, SuiteSparse_long *,
-    SuiteSparse_long *, size_t, SuiteSparse_long *, SuiteSparse_long *,
-    SuiteSparse_long *, SuiteSparse_long *, SuiteSparse_long *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_amd:  order using AMD */
-/* -------------------------------------------------------------------------- */
-
-/* Finds a permutation P to reduce fill-in in the factorization of P*A*P'
- * or P*A*A'P' */
-
-int cholmod_amd
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- output --- */
-    int *Perm,		/* size A->nrow, output permutation */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_amd (cholmod_sparse *, SuiteSparse_long *, size_t,
-    SuiteSparse_long *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_colamd:  order using COLAMD */
-/* -------------------------------------------------------------------------- */
-
-/* Finds a permutation P to reduce fill-in in the factorization of P*A*A'*P'.
- * Orders F*F' where F = A (:,fset) if fset is not NULL */
-
-int cholmod_colamd
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int postorder,	/* if TRUE, follow with a coletree postorder */
-    /* ---- output --- */
-    int *Perm,		/* size A->nrow, output permutation */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_colamd (cholmod_sparse *, SuiteSparse_long *, size_t, int,
-    SuiteSparse_long *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowfac:  incremental simplicial factorization */
-/* -------------------------------------------------------------------------- */
-
-/* Partial or complete simplicial factorization.  Rows and columns kstart:kend-1
- * of L and D must be initially equal to rows/columns kstart:kend-1 of the
- * identity matrix.   Row k can only be factorized if all descendants of node
- * k in the elimination tree have been factorized. */
-
-int cholmod_rowfac
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,fset)' */
-    double beta [2],	/* factorize beta*I+A or beta*I+A'*A */
-    size_t kstart,	/* first row to factorize */
-    size_t kend,	/* last row to factorize is kend-1 */
-    /* ---- in/out --- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowfac (cholmod_sparse *, cholmod_sparse *, double *, size_t,
-    size_t, cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowfac_mask:  incremental simplicial factorization */
-/* -------------------------------------------------------------------------- */
-
-/* cholmod_rowfac_mask is a version of cholmod_rowfac that is specific to
- * LPDASA.  It is unlikely to be needed by any other application. */
-
-int cholmod_rowfac_mask
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,fset)' */
-    double beta [2],	/* factorize beta*I+A or beta*I+A'*A */
-    size_t kstart,	/* first row to factorize */
-    size_t kend,	/* last row to factorize is kend-1 */
-    int *mask,		/* if mask[i] >= 0, then set row i to zero */
-    int *RLinkUp,	/* link list of rows to compute */
-    /* ---- in/out --- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowfac_mask (cholmod_sparse *, cholmod_sparse *, double *, size_t,
-    size_t, SuiteSparse_long *, SuiteSparse_long *, cholmod_factor *,
-    cholmod_common *) ;
-
-int cholmod_rowfac_mask2
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,fset)' */
-    double beta [2],	/* factorize beta*I+A or beta*I+A'*A */
-    size_t kstart,	/* first row to factorize */
-    size_t kend,	/* last row to factorize is kend-1 */
-    int *mask,		/* if mask[i] >= maskmark, then set row i to zero */
-    int maskmark,
-    int *RLinkUp,	/* link list of rows to compute */
-    /* ---- in/out --- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowfac_mask2 (cholmod_sparse *, cholmod_sparse *, double *,
-    size_t, size_t, SuiteSparse_long *, SuiteSparse_long, SuiteSparse_long *,
-    cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_row_subtree:  find the nonzero pattern of a row of L */
-/* -------------------------------------------------------------------------- */
-
-/* Find the nonzero pattern of x for the system Lx=b where L = (0:k-1,0:k-1)
- * and b = kth column of A or A*A' (rows 0 to k-1 only) */
-
-int cholmod_row_subtree
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    cholmod_sparse *F,	/* used for A*A' case only. F=A' or A(:,fset)' */
-    size_t k,		/* row k of L */
-    int *Parent,	/* elimination tree */
-    /* ---- output --- */
-    cholmod_sparse *R,	/* pattern of L(k,:), n-by-1 with R->nzmax >= n */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_row_subtree (cholmod_sparse *, cholmod_sparse *, size_t,
-    SuiteSparse_long *, cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_lsolve_pattern: find the nonzero pattern of x=L\b */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_lsolve_pattern
-(
-    /* ---- input ---- */
-    cholmod_sparse *B,	/* sparse right-hand-side (a single sparse column) */
-    cholmod_factor *L,	/* the factor L from which parent(i) is derived */
-    /* ---- output --- */
-    cholmod_sparse *X,	/* pattern of X=L\B, n-by-1 with X->nzmax >= n */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_lsolve_pattern (cholmod_sparse *, cholmod_factor *,
-    cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_row_lsubtree:  find the nonzero pattern of a row of L */
-/* -------------------------------------------------------------------------- */
-
-/* Identical to cholmod_row_subtree, except that it finds the elimination tree
- * from L itself. */
-
-int cholmod_row_lsubtree
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    int *Fi, size_t fnz,    /* nonzero pattern of kth row of A', not required
-			     * for the symmetric case.  Need not be sorted. */
-    size_t k,		/* row k of L */
-    cholmod_factor *L,	/* the factor L from which parent(i) is derived */
-    /* ---- output --- */
-    cholmod_sparse *R,	/* pattern of L(k,:), n-by-1 with R->nzmax >= n */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_row_lsubtree (cholmod_sparse *, SuiteSparse_long *, size_t,
-    size_t, cholmod_factor *, cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_resymbol:  recompute the symbolic pattern of L */
-/* -------------------------------------------------------------------------- */
-
-/* Remove entries from L that are not in the factorization of P*A*P', P*A*A'*P',
- * or P*F*F'*P' (depending on A->stype and whether fset is NULL or not).
- *
- * cholmod_resymbol is the same as cholmod_resymbol_noperm, except that it
- * first permutes A according to L->Perm.  A can be upper/lower/unsymmetric,
- * in contrast to cholmod_resymbol_noperm (which can be lower or unsym). */
-
-int cholmod_resymbol 
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int pack,		/* if TRUE, pack the columns of L */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factorization, entries pruned on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_resymbol (cholmod_sparse *, SuiteSparse_long *, size_t, int,
-    cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_resymbol_noperm:  recompute the symbolic pattern of L, no L->Perm */
-/* -------------------------------------------------------------------------- */
-
-/* Remove entries from L that are not in the factorization of A, A*A',
- * or F*F' (depending on A->stype and whether fset is NULL or not). */
-
-int cholmod_resymbol_noperm
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int pack,		/* if TRUE, pack the columns of L */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factorization, entries pruned on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_resymbol_noperm (cholmod_sparse *, SuiteSparse_long *, size_t, int,
-    cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rcond:  compute rough estimate of reciprocal of condition number */
-/* -------------------------------------------------------------------------- */
-
-double cholmod_rcond	    /* return min(diag(L)) / max(diag(L)) */
-(
-    /* ---- input ---- */
-    cholmod_factor *L,
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-double cholmod_l_rcond (cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_postorder: Compute the postorder of a tree */
-/* -------------------------------------------------------------------------- */
-
-SuiteSparse_long cholmod_postorder	/* return # of nodes postordered */
-(
-    /* ---- input ---- */
-    int *Parent,	/* size n. Parent [j] = p if p is the parent of j */
-    size_t n,
-    int *Weight_p,	/* size n, optional. Weight [j] is weight of node j */
-    /* ---- output --- */
-    int *Post,		/* size n. Post [k] = j is kth in postordered tree */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-SuiteSparse_long cholmod_l_postorder (SuiteSparse_long *, size_t,
-    SuiteSparse_long *, SuiteSparse_long *, cholmod_common *) ;
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_complexity.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_complexity.h
deleted file mode 100644
index 2fd60c8..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_complexity.h
+++ /dev/null
@@ -1,265 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_complexity.h ========================================= */
-/* ========================================================================== */
-
-/* Define operations on pattern, real, complex, and zomplex objects.
- *
- * The xtype of an object defines it numerical type.  A qttern object has no
- * numerical values (A->x and A->z are NULL).  A real object has no imaginary
- * qrt (A->x is used, A->z is NULL).  A complex object has an imaginary qrt
- * that is stored interleaved with its real qrt (A->x is of size 2*nz, A->z
- * is NULL).  A zomplex object has both real and imaginary qrts, which are
- * stored seqrately, as in MATLAB (A->x and A->z are both used).
- *
- * XTYPE is CHOLMOD_PATTERN, _REAL, _COMPLEX or _ZOMPLEX, and is the xtype of
- * the template routine under construction.  XTYPE2 is equal to XTYPE, except
- * if XTYPE is CHOLMOD_PATTERN, in which case XTYPE is CHOLMOD_REAL.
- * XTYPE and XTYPE2 are defined in cholmod_template.h.  
- */
-
-/* -------------------------------------------------------------------------- */
-/* pattern */
-/* -------------------------------------------------------------------------- */
-
-#define P_TEMPLATE(name)		p_ ## name
-#define P_ASSIGN2(x,z,p,ax,az,q)	x [p] = 1
-#define P_PRINT(k,x,z,p)		PRK(k, ("1"))
-
-/* -------------------------------------------------------------------------- */
-/* real */
-/* -------------------------------------------------------------------------- */
-
-#define R_TEMPLATE(name)			r_ ## name
-#define R_ASSEMBLE(x,z,p,ax,az,q)		x [p] += ax [q]
-#define R_ASSIGN(x,z,p,ax,az,q)			x [p]  = ax [q]
-#define R_ASSIGN_CONJ(x,z,p,ax,az,q)		x [p]  = ax [q]
-#define R_ASSIGN_REAL(x,p,ax,q)			x [p]  = ax [q]
-#define R_XTYPE_OK(type)			((type) == CHOLMOD_REAL)
-#define R_IS_NONZERO(ax,az,q)			IS_NONZERO (ax [q])
-#define R_IS_ZERO(ax,az,q)			IS_ZERO (ax [q])
-#define R_IS_ONE(ax,az,q)			(ax [q] == 1)
-#define R_MULT(x,z,p, ax,az,q, bx,bz,r)		x [p]  = ax [q] * bx [r]
-#define R_MULTADD(x,z,p, ax,az,q, bx,bz,r)	x [p] += ax [q] * bx [r]
-#define R_MULTSUB(x,z,p, ax,az,q, bx,bz,r)	x [p] -= ax [q] * bx [r]
-#define R_MULTADDCONJ(x,z,p, ax,az,q, bx,bz,r)	x [p] += ax [q] * bx [r]
-#define R_MULTSUBCONJ(x,z,p, ax,az,q, bx,bz,r)	x [p] -= ax [q] * bx [r]
-#define R_ADD(x,z,p, ax,az,q, bx,bz,r)		x [p]  = ax [q] + bx [r]
-#define R_ADD_REAL(x,p, ax,q, bx,r)		x [p]  = ax [q] + bx [r]
-#define R_CLEAR(x,z,p)				x [p]  = 0
-#define R_CLEAR_IMAG(x,z,p)
-#define R_DIV(x,z,p,ax,az,q)			x [p] /= ax [q]
-#define R_LLDOT(x,p, ax,az,q)			x [p] -= ax [q] * ax [q]
-#define R_PRINT(k,x,z,p)			PRK(k, ("%24.16e", x [p]))
-
-#define R_DIV_REAL(x,z,p, ax,az,q, bx,r)	x [p] = ax [q] / bx [r]
-#define R_MULT_REAL(x,z,p, ax,az,q, bx,r)	x [p] = ax [q] * bx [r]
-
-#define R_LDLDOT(x,p, ax,az,q, bx,r)		x [p] -=(ax[q] * ax[q])/ bx[r]
-
-/* -------------------------------------------------------------------------- */
-/* complex */
-/* -------------------------------------------------------------------------- */
-
-#define C_TEMPLATE(name)		c_ ## name
-#define CT_TEMPLATE(name)		ct_ ## name
-
-#define C_ASSEMBLE(x,z,p,ax,az,q) \
-    x [2*(p)  ] += ax [2*(q)  ] ; \
-    x [2*(p)+1] += ax [2*(q)+1]
-
-#define C_ASSIGN(x,z,p,ax,az,q) \
-    x [2*(p)  ] = ax [2*(q)  ] ; \
-    x [2*(p)+1] = ax [2*(q)+1]
-
-#define C_ASSIGN_REAL(x,p,ax,q)			x [2*(p)]  = ax [2*(q)]
-
-#define C_ASSIGN_CONJ(x,z,p,ax,az,q) \
-    x [2*(p)  ] =  ax [2*(q)  ] ; \
-    x [2*(p)+1] = -ax [2*(q)+1]
-
-#define C_XTYPE_OK(type)		((type) == CHOLMOD_COMPLEX)
-
-#define C_IS_NONZERO(ax,az,q) \
-    (IS_NONZERO (ax [2*(q)]) || IS_NONZERO (ax [2*(q)+1]))
-
-#define C_IS_ZERO(ax,az,q) \
-    (IS_ZERO (ax [2*(q)]) && IS_ZERO (ax [2*(q)+1]))
-
-#define C_IS_ONE(ax,az,q) \
-    ((ax [2*(q)] == 1) && IS_ZERO (ax [2*(q)+1]))
-
-#define C_IMAG_IS_NONZERO(ax,az,q)  (IS_NONZERO (ax [2*(q)+1]))
-
-#define C_MULT(x,z,p, ax,az,q, bx,bz,r) \
-x [2*(p)  ] = ax [2*(q)  ] * bx [2*(r)] - ax [2*(q)+1] * bx [2*(r)+1] ; \
-x [2*(p)+1] = ax [2*(q)+1] * bx [2*(r)] + ax [2*(q)  ] * bx [2*(r)+1]
-
-#define C_MULTADD(x,z,p, ax,az,q, bx,bz,r) \
-x [2*(p)  ] += ax [2*(q)  ] * bx [2*(r)] - ax [2*(q)+1] * bx [2*(r)+1] ; \
-x [2*(p)+1] += ax [2*(q)+1] * bx [2*(r)] + ax [2*(q)  ] * bx [2*(r)+1]
-
-#define C_MULTSUB(x,z,p, ax,az,q, bx,bz,r) \
-x [2*(p)  ] -= ax [2*(q)  ] * bx [2*(r)] - ax [2*(q)+1] * bx [2*(r)+1] ; \
-x [2*(p)+1] -= ax [2*(q)+1] * bx [2*(r)] + ax [2*(q)  ] * bx [2*(r)+1]
-
-/* s += conj(a)*b */
-#define C_MULTADDCONJ(x,z,p, ax,az,q, bx,bz,r) \
-x [2*(p)  ] +=   ax [2*(q)  ]  * bx [2*(r)] + ax [2*(q)+1] * bx [2*(r)+1] ; \
-x [2*(p)+1] += (-ax [2*(q)+1]) * bx [2*(r)] + ax [2*(q)  ] * bx [2*(r)+1]
-
-/* s -= conj(a)*b */
-#define C_MULTSUBCONJ(x,z,p, ax,az,q, bx,bz,r) \
-x [2*(p)  ] -=   ax [2*(q)  ]  * bx [2*(r)] + ax [2*(q)+1] * bx [2*(r)+1] ; \
-x [2*(p)+1] -= (-ax [2*(q)+1]) * bx [2*(r)] + ax [2*(q)  ] * bx [2*(r)+1]
-
-#define C_ADD(x,z,p, ax,az,q, bx,bz,r) \
-    x [2*(p)  ] = ax [2*(q)  ] + bx [2*(r)  ] ; \
-    x [2*(p)+1] = ax [2*(q)+1] + bx [2*(r)+1]
-
-#define C_ADD_REAL(x,p, ax,q, bx,r) \
-    x [2*(p)] = ax [2*(q)] + bx [2*(r)]
-
-#define C_CLEAR(x,z,p) \
-    x [2*(p)  ] = 0 ; \
-    x [2*(p)+1] = 0
-
-#define C_CLEAR_IMAG(x,z,p) \
-    x [2*(p)+1] = 0
-
-/* s = s / a */
-#define C_DIV(x,z,p,ax,az,q) \
-    SuiteSparse_config.divcomplex_func ( \
-	      x [2*(p)],  x [2*(p)+1], \
-	     ax [2*(q)], ax [2*(q)+1], \
-	     &x [2*(p)], &x [2*(p)+1])
-
-/* s -= conj(a)*a ; note that the result of conj(a)*a is real */
-#define C_LLDOT(x,p, ax,az,q) \
-    x [2*(p)] -= ax [2*(q)] * ax [2*(q)] + ax [2*(q)+1] * ax [2*(q)+1]
-
-#define C_PRINT(k,x,z,p) PRK(k, ("(%24.16e,%24.16e)", x [2*(p)], x [2*(p)+1]))
-
-#define C_DIV_REAL(x,z,p, ax,az,q, bx,r) \
-    x [2*(p)  ] = ax [2*(q)  ] / bx [2*(r)] ; \
-    x [2*(p)+1] = ax [2*(q)+1] / bx [2*(r)]
-
-#define C_MULT_REAL(x,z,p, ax,az,q, bx,r) \
-    x [2*(p)  ] = ax [2*(q)  ] * bx [2*(r)] ; \
-    x [2*(p)+1] = ax [2*(q)+1] * bx [2*(r)]
-
-/* s -= conj(a)*a/t */
-#define C_LDLDOT(x,p, ax,az,q, bx,r) \
-    x [2*(p)] -= (ax [2*(q)] * ax [2*(q)] + ax [2*(q)+1] * ax [2*(q)+1]) / bx[r]
-
-/* -------------------------------------------------------------------------- */
-/* zomplex */
-/* -------------------------------------------------------------------------- */
-
-#define Z_TEMPLATE(name)		z_ ## name
-#define ZT_TEMPLATE(name)		zt_ ## name
-
-#define Z_ASSEMBLE(x,z,p,ax,az,q) \
-    x [p] += ax [q] ; \
-    z [p] += az [q]
-
-#define Z_ASSIGN(x,z,p,ax,az,q) \
-    x [p] = ax [q] ; \
-    z [p] = az [q]
-
-#define Z_ASSIGN_REAL(x,p,ax,q)			x [p]  = ax [q]
-
-#define Z_ASSIGN_CONJ(x,z,p,ax,az,q) \
-    x [p] =  ax [q] ; \
-    z [p] = -az [q]
-
-#define Z_XTYPE_OK(type)		((type) == CHOLMOD_ZOMPLEX)
-
-#define Z_IS_NONZERO(ax,az,q) \
-    (IS_NONZERO (ax [q]) || IS_NONZERO (az [q]))
-
-#define Z_IS_ZERO(ax,az,q) \
-    (IS_ZERO (ax [q]) && IS_ZERO (az [q]))
-
-#define Z_IS_ONE(ax,az,q) \
-    ((ax [q] == 1) && IS_ZERO (az [q]))
-
-#define Z_IMAG_IS_NONZERO(ax,az,q)  (IS_NONZERO (az [q]))
-
-#define Z_MULT(x,z,p, ax,az,q, bx,bz,r) \
-    x [p] = ax [q] * bx [r] - az [q] * bz [r] ; \
-    z [p] = az [q] * bx [r] + ax [q] * bz [r]
-
-#define Z_MULTADD(x,z,p, ax,az,q, bx,bz,r) \
-    x [p] += ax [q] * bx [r] - az [q] * bz [r] ; \
-    z [p] += az [q] * bx [r] + ax [q] * bz [r]
-
-#define Z_MULTSUB(x,z,p, ax,az,q, bx,bz,r) \
-    x [p] -= ax [q] * bx [r] - az [q] * bz [r] ; \
-    z [p] -= az [q] * bx [r] + ax [q] * bz [r]
-
-#define Z_MULTADDCONJ(x,z,p, ax,az,q, bx,bz,r) \
-    x [p] +=   ax [q]  * bx [r] + az [q] * bz [r] ; \
-    z [p] += (-az [q]) * bx [r] + ax [q] * bz [r]
-
-#define Z_MULTSUBCONJ(x,z,p, ax,az,q, bx,bz,r) \
-    x [p] -=   ax [q]  * bx [r] + az [q] * bz [r] ; \
-    z [p] -= (-az [q]) * bx [r] + ax [q] * bz [r]
-
-#define Z_ADD(x,z,p, ax,az,q, bx,bz,r) \
-	x [p] = ax [q] + bx [r] ; \
-	z [p] = az [q] + bz [r]
-
-#define Z_ADD_REAL(x,p, ax,q, bx,r) \
-	x [p] = ax [q] + bx [r]
-
-#define Z_CLEAR(x,z,p) \
-    x [p] = 0 ; \
-    z [p] = 0
-
-#define Z_CLEAR_IMAG(x,z,p) \
-    z [p] = 0
-
-/* s = s / a */
-#define Z_DIV(x,z,p,ax,az,q) \
-    SuiteSparse_config.divcomplex_func \
-        (x [p], z [p], ax [q], az [q], &x [p], &z [p])
-
-/* s -= conj(a)*a ; note that the result of conj(a)*a is real */
-#define Z_LLDOT(x,p, ax,az,q) \
-    x [p] -= ax [q] * ax [q] + az [q] * az [q]
-
-#define Z_PRINT(k,x,z,p)	PRK(k, ("(%24.16e,%24.16e)", x [p], z [p]))
-
-#define Z_DIV_REAL(x,z,p, ax,az,q, bx,r) \
-    x [p] = ax [q] / bx [r] ; \
-    z [p] = az [q] / bx [r]
-
-#define Z_MULT_REAL(x,z,p, ax,az,q, bx,r) \
-    x [p] = ax [q] * bx [r] ; \
-    z [p] = az [q] * bx [r]
-
-/* s -= conj(a)*a/t */
-#define Z_LDLDOT(x,p, ax,az,q, bx,r) \
-    x [p] -= (ax [q] * ax [q] + az [q] * az [q]) / bx[r]
-
-/* -------------------------------------------------------------------------- */
-/* all classes */
-/* -------------------------------------------------------------------------- */
-
-/* Check if A->xtype and the two arrays A->x and A->z are valid.  Set status to
- * invalid, unless status is already "out of memory".  A can be a sparse matrix,
- * dense matrix, factor, or triplet. */
-
-#define RETURN_IF_XTYPE_INVALID(A,xtype1,xtype2,result) \
-{ \
-    if ((A)->xtype < (xtype1) || (A)->xtype > (xtype2) || \
-        ((A)->xtype != CHOLMOD_PATTERN && ((A)->x) == NULL) || \
-	((A)->xtype == CHOLMOD_ZOMPLEX && ((A)->z) == NULL)) \
-    { \
-	if (Common->status != CHOLMOD_OUT_OF_MEMORY) \
-	{ \
-	    ERROR (CHOLMOD_INVALID, "invalid xtype") ; \
-	} \
-	return (result) ; \
-    } \
-}
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_config.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_config.h
deleted file mode 100644
index 5ada402..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_config.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_config.h ============================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_config.h.
- * Copyright (C) 2005-2013, Univ. of Florida.  Author: Timothy A. Davis
- * CHOLMOD/Include/cholmod_config.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD configuration file, for inclusion in user programs.
- *
- * You do not have to edit any CHOLMOD files to compile and install CHOLMOD.
- * However, if you do not use all of CHOLMOD's modules, you need to compile
- * with the appropriate flag, or edit this file to add the appropriate #define.
- *
- * If you wish to use CHOLMOD under the GNU LGPL license only, then you must
- * compile CHOLMOD with -DNMATRIXOPS -DNSUPERNODAL and -DNMODIFY.  This can
- * be done using just -DNGPL.
- *
- * Compiler flags for CHOLMOD:
- *
- * -DNCHECK	    do not include the Check module.        License: GNU LGPL
- * -DNCHOLESKY	    do not include the Cholesky module.     License: GNU LGPL
- * -DNPARTITION	    do not include the Partition module.    License: GNU LGPL
- * -DNCAMD          do not include the interfaces to CAMD,
- *                  CCOLAMD, CSYMAND in Partition module.   License: GNU LGPL
- *
- * -DNGPL	    do not include any GNU GPL Modules in the CHOLMOD library.
- * -DNMATRIXOPS	    do not include the MatrixOps module.    License: GNU GPL
- * -DNMODIFY	    do not include the Modify module.       License: GNU GPL
- * -DNSUPERNODAL    do not include the Supernodal module.   License: GNU GPL
- *
- * -DNPRINT	    do not print anything
- *
- * -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
- *		    LAPACK and the BLAS.  Use LONGBLAS=long on Solaris to use
- *		    the 64-bit Sun Performance BLAS in cholmod_l_* routines.
- *		    You may need to use -D'LONGBLAS=long long' on the SGI
- *		    (this is not tested).
- *
- * -DNSUNPERF	    for Solaris only.  If defined, do not use the Sun
- *		    Performance Library.  The default is to use SunPerf.
- *		    You must compile CHOLMOD with -xlic_lib=sunperf.
- *
- * The Core Module (License GNU LGPL) is always included in the CHOLMOD library.
- */
-
-#ifndef CHOLMOD_CONFIG_H
-#define CHOLMOD_CONFIG_H
-
-/* Use the compiler flag, or uncomment the definition(s), if you want to use
- * one or more non-default installation options: */
-
-/*
-#define NCHECK
-#define NCHOLESKY
-#define NCAMD
-#define NPARTITION
-
-#define NGPL  
-#define NMATRIXOPS
-#define NMODIFY
-#define NSUPERNODAL
-
-#define NPRINT
-
-#define LONGBLAS long
-#define LONGBLAS long long
-#define NSUNPERF
-*/
-
-/* -------------------------------------------------------------------------- */
-/* if NGPL is defined, disable all GNU GPL Modules */
-/* -------------------------------------------------------------------------- */
-
-#ifdef NGPL
-#define NMATRIXOPS
-#define NMODIFY
-#define NSUPERNODAL
-#endif
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_core.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_core.h
deleted file mode 100644
index f2d9d90..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_core.h
+++ /dev/null
@@ -1,2450 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_core.h =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_core.h.
- * Copyright (C) 2005-2013, Univ. of Florida.  Author: Timothy A. Davis
- * CHOLMOD/Include/cholmod_core.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD Core module: basic CHOLMOD objects and routines.
- * Required by all CHOLMOD modules.  Requires no other module or package.
- *
- * The CHOLMOD modules are:
- *
- * Core		basic data structures and definitions
- * Check	check/print the 5 CHOLMOD objects, & 3 types of integer vectors
- * Cholesky	sparse Cholesky factorization
- * Modify	sparse Cholesky update/downdate/row-add/row-delete
- * MatrixOps	sparse matrix functions (add, multiply, norm, ...)
- * Supernodal	supernodal sparse Cholesky factorization
- * Partition	graph-partitioning based orderings
- *
- * The CHOLMOD objects:
- * --------------------
- *
- * cholmod_common   parameters, statistics, and workspace
- * cholmod_sparse   a sparse matrix in compressed column form
- * cholmod_factor   an LL' or LDL' factorization
- * cholmod_dense    a dense matrix
- * cholmod_triplet  a sparse matrix in "triplet" form
- *
- * The Core module described here defines the CHOLMOD data structures, and
- * basic operations on them.  To create and solve a sparse linear system Ax=b,
- * the user must create A and b, populate them with values, and then pass them
- * to the routines in the CHOLMOD Cholesky module.  There are two primary
- * methods for creating A: (1) allocate space for a column-oriented sparse
- * matrix and fill it with pattern and values, or (2) create a triplet form
- * matrix and convert it to a sparse matrix.  The latter option is simpler.
- *
- * The matrices b and x are typically dense matrices, but can also be sparse.
- * You can allocate and free them as dense matrices with the
- * cholmod_allocate_dense and cholmod_free_dense routines.
- *
- * The cholmod_factor object contains the symbolic and numeric LL' or LDL'
- * factorization of sparse symmetric matrix.  The matrix must be positive
- * definite for an LL' factorization.  It need only be symmetric and have well-
- * conditioned leading submatrices for it to have an LDL' factorization
- * (CHOLMOD does not pivot for numerical stability).  It is typically created
- * with the cholmod_factorize routine in the Cholesky module, but can also
- * be initialized to L=D=I in the Core module and then modified by the Modify
- * module.  It must be freed with cholmod_free_factor, defined below.
- *
- * The Core routines for each object are described below.  Each list is split
- * into two parts: the primary routines and secondary routines.
- *
- * ============================================================================
- * === cholmod_common =========================================================
- * ============================================================================
- *
- * The Common object contains control parameters, statistics, and
- * You must call cholmod_start before calling any other CHOLMOD routine, and
- * must call cholmod_finish as your last call to CHOLMOD, with two exceptions:
- * you may call cholmod_print_common and cholmod_check_common in the Check
- * module after calling cholmod_finish.
- *
- * cholmod_start		first call to CHOLMOD
- * cholmod_finish		last call to CHOLMOD
- * -----------------------------
- * cholmod_defaults		restore default parameters
- * cholmod_maxrank		maximum rank for update/downdate
- * cholmod_allocate_work	allocate workspace in Common
- * cholmod_free_work		free workspace in Common
- * cholmod_clear_flag		clear Flag workspace in Common
- * cholmod_error		called when CHOLMOD encounters an error
- * cholmod_dbound		for internal use in CHOLMOD only
- * cholmod_hypot		compute sqrt (x*x + y*y) accurately
- * cholmod_divcomplex		complex division, c = a/b
- *
- * ============================================================================
- * === cholmod_sparse =========================================================
- * ============================================================================
- *
- * A sparse matrix is held in compressed column form.  In the basic type
- * ("packed", which corresponds to a MATLAB sparse matrix), an n-by-n matrix
- * with nz entries is held in three arrays: p of size n+1, i of size nz, and x
- * of size nz.  Row indices of column j are held in i [p [j] ... p [j+1]-1] and
- * in the same locations in x.  There may be no duplicate entries in a column.
- * Row indices in each column may be sorted or unsorted (CHOLMOD keeps track).
- * A->stype determines the storage mode: 0 if both upper/lower parts are stored,
- * -1 if A is symmetric and just tril(A) is stored, +1 if symmetric and triu(A)
- * is stored.
- *
- * cholmod_allocate_sparse	allocate a sparse matrix
- * cholmod_free_sparse		free a sparse matrix
- * -----------------------------
- * cholmod_reallocate_sparse	change the size (# entries) of sparse matrix
- * cholmod_nnz			number of nonzeros in a sparse matrix
- * cholmod_speye		sparse identity matrix
- * cholmod_spzeros		sparse zero matrix
- * cholmod_transpose		transpose a sparse matrix
- * cholmod_ptranspose		transpose/permute a sparse matrix
- * cholmod_transpose_unsym	transpose/permute an unsymmetric sparse matrix
- * cholmod_transpose_sym	transpose/permute a symmetric sparse matrix
- * cholmod_sort			sort row indices in each column of sparse matrix
- * cholmod_band			C = tril (triu (A,k1), k2)
- * cholmod_band_inplace		A = tril (triu (A,k1), k2)
- * cholmod_aat			C = A*A'
- * cholmod_copy_sparse		C = A, create an exact copy of a sparse matrix
- * cholmod_copy			C = A, with possible change of stype
- * cholmod_add			C = alpha*A + beta*B
- * cholmod_sparse_xtype		change the xtype of a sparse matrix
- *
- * ============================================================================
- * === cholmod_factor =========================================================
- * ============================================================================
- *
- * The data structure for an LL' or LDL' factorization is too complex to
- * describe in one sentence.  This object can hold the symbolic analysis alone,
- * or in combination with a "simplicial" (similar to a sparse matrix) or
- * "supernodal" form of the numerical factorization.  Only the routine to free
- * a factor is primary, since a factor object is created by the factorization
- * routine (cholmod_factorize).  It must be freed with cholmod_free_factor.
- *
- * cholmod_free_factor		free a factor
- * -----------------------------
- * cholmod_allocate_factor	allocate a factor (LL' or LDL')
- * cholmod_reallocate_factor	change the # entries in a factor
- * cholmod_change_factor	change the type of factor (e.g., LDL' to LL')
- * cholmod_pack_factor		pack the columns of a factor
- * cholmod_reallocate_column	resize a single column of a factor
- * cholmod_factor_to_sparse	create a sparse matrix copy of a factor
- * cholmod_copy_factor		create a copy of a factor
- * cholmod_factor_xtype		change the xtype of a factor
- *
- * Note that there is no cholmod_sparse_to_factor routine to create a factor
- * as a copy of a sparse matrix.  It could be done, after a fashion, but a
- * lower triangular sparse matrix would not necessarily have a chordal graph,
- * which would break the many CHOLMOD routines that rely on this property.
- *
- * ============================================================================
- * === cholmod_dense ==========================================================
- * ============================================================================
- *
- * The solve routines and some of the MatrixOps and Modify routines use dense
- * matrices as inputs.  These are held in column-major order.  With a leading
- * dimension of d, the entry in row i and column j is held in x [i+j*d].
- *
- * cholmod_allocate_dense	allocate a dense matrix
- * cholmod_free_dense		free a dense matrix
- * -----------------------------
- * cholmod_zeros		allocate a dense matrix of all zeros
- * cholmod_ones			allocate a dense matrix of all ones
- * cholmod_eye			allocate a dense identity matrix
- * cholmod_sparse_to_dense	create a dense matrix copy of a sparse matrix
- * cholmod_dense_to_sparse	create a sparse matrix copy of a dense matrix
- * cholmod_copy_dense		create a copy of a dense matrix
- * cholmod_copy_dense2		copy a dense matrix (pre-allocated)
- * cholmod_dense_xtype		change the xtype of a dense matrix
- * cholmod_ensure_dense  	ensure a dense matrix has a given size and type
- *
- * ============================================================================
- * === cholmod_triplet ========================================================
- * ============================================================================
- *
- * A sparse matrix held in triplet form is the simplest one for a user to
- * create.  It consists of a list of nz entries in arbitrary order, held in
- * three arrays: i, j, and x, each of length nk.  The kth entry is in row i[k],
- * column j[k], with value x[k].  There may be duplicate values; if A(i,j)
- * appears more than once, its value is the sum of the entries with those row
- * and column indices.
- *
- * cholmod_allocate_triplet	allocate a triplet matrix
- * cholmod_triplet_to_sparse	create a sparse matrix copy of a triplet matrix
- * cholmod_free_triplet		free a triplet matrix
- * -----------------------------
- * cholmod_reallocate_triplet	change the # of entries in a triplet matrix
- * cholmod_sparse_to_triplet	create a triplet matrix copy of a sparse matrix
- * cholmod_copy_triplet		create a copy of a triplet matrix
- * cholmod_triplet_xtype	change the xtype of a triplet matrix
- *
- * ============================================================================
- * === memory management ======================================================
- * ============================================================================
- *
- * cholmod_malloc		malloc wrapper
- * cholmod_calloc		calloc wrapper
- * cholmod_free			free wrapper
- * cholmod_realloc		realloc wrapper
- * cholmod_realloc_multiple	realloc wrapper for multiple objects
- *
- * ============================================================================
- * === Core CHOLMOD prototypes ================================================
- * ============================================================================
- *
- * All CHOLMOD routines (in all modules) use the following protocol for return
- * values, with one exception:
- *
- * int			TRUE (1) if successful, or FALSE (0) otherwise.
- *			(exception: cholmod_divcomplex)
- * SuiteSparse_long     a value >= 0 if successful, or -1 otherwise.
- * double		a value >= 0 if successful, or -1 otherwise.
- * size_t		a value > 0 if successful, or 0 otherwise.
- * void *		a non-NULL pointer to newly allocated memory if
- *			successful, or NULL otherwise.
- * cholmod_sparse *	a non-NULL pointer to a newly allocated matrix
- *			if successful, or NULL otherwise.
- * cholmod_factor *	a non-NULL pointer to a newly allocated factor
- *			if successful, or NULL otherwise.
- * cholmod_triplet *	a non-NULL pointer to a newly allocated triplet
- *			matrix if successful, or NULL otherwise.
- * cholmod_dense *	a non-NULL pointer to a newly allocated triplet
- *			matrix if successful, or NULL otherwise.
- *
- * The last parameter to all routines is always a pointer to the CHOLMOD
- * Common object.
- *
- * TRUE and FALSE are not defined here, since they may conflict with the user
- * program.  A routine that described here returning TRUE or FALSE returns 1
- * or 0, respectively.  Any TRUE/FALSE parameter is true if nonzero, false if
- * zero.
- */
-
-#ifndef CHOLMOD_CORE_H
-#define CHOLMOD_CORE_H
-
-/* ========================================================================== */
-/* === CHOLMOD version ====================================================== */
-/* ========================================================================== */
-
-/* All versions of CHOLMOD will include the following definitions.
- * As an example, to test if the version you are using is 1.3 or later:
- *
- *	if (CHOLMOD_VERSION >= CHOLMOD_VER_CODE (1,3)) ...
- *
- * This also works during compile-time:
- *
- *	#if CHOLMOD_VERSION >= CHOLMOD_VER_CODE (1,3)
- *	    printf ("This is version 1.3 or later\n") ;
- *	#else
- *	    printf ("This is version is earlier than 1.3\n") ;
- *	#endif
- */
-
-#define CHOLMOD_HAS_VERSION_FUNCTION
-
-#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 6
-#define CHOLMOD_VERSION \
-    CHOLMOD_VER_CODE(CHOLMOD_MAIN_VERSION,CHOLMOD_SUB_VERSION)
-
-
-/* ========================================================================== */
-/* === non-CHOLMOD include files ============================================ */
-/* ========================================================================== */
-
-/* This is the only non-CHOLMOD include file imposed on the user program.
- * It required for size_t definition used here.  CHOLMOD itself includes other
- * ANSI C89 standard #include files, but does not expose them to the user.
- *
- * CHOLMOD assumes that your C compiler is ANSI C89 compliant.  It does not make
- * use of ANSI C99 features.
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-
-/* ========================================================================== */
-/* === CUDA BLAS for the GPU ================================================ */
-/* ========================================================================== */
-
-/* The number of OMP threads should typically be set to the number of cores   */
-/* per socket inthe machine being used.  This maximizes memory performance.   */
-#ifndef CHOLMOD_OMP_NUM_THREADS
-#define CHOLMOD_OMP_NUM_THREADS 4
-#endif
-
-/* Define buffering parameters for GPU processing */
-#ifdef GPU_BLAS
-#include <cublas_v2.h>
-#endif
-
-#define CHOLMOD_DEVICE_SUPERNODE_BUFFERS 6
-#define CHOLMOD_HOST_SUPERNODE_BUFFERS 8
-#define CHOLMOD_DEVICE_STREAMS 2
-
-/* ========================================================================== */
-/* === CHOLMOD objects ====================================================== */
-/* ========================================================================== */
-
-/* Each CHOLMOD object has its own type code. */
-
-#define CHOLMOD_COMMON 0
-#define CHOLMOD_SPARSE 1
-#define CHOLMOD_FACTOR 2
-#define CHOLMOD_DENSE 3
-#define CHOLMOD_TRIPLET 4
-
-/* ========================================================================== */
-/* === CHOLMOD Common ======================================================= */
-/* ========================================================================== */
-
-/* itype defines the types of integer used: */
-#define CHOLMOD_INT 0		/* all integer arrays are int */
-#define CHOLMOD_INTLONG 1	/* most are int, some are SuiteSparse_long */
-#define CHOLMOD_LONG 2		/* all integer arrays are SuiteSparse_long */
-
-/* The itype of all parameters for all CHOLMOD routines must match.
- * FUTURE WORK: CHOLMOD_INTLONG is not yet supported.
- */
-
-/* dtype defines what the numerical type is (double or float): */
-#define CHOLMOD_DOUBLE 0	/* all numerical values are double */
-#define CHOLMOD_SINGLE 1	/* all numerical values are float */
-
-/* The dtype of all parameters for all CHOLMOD routines must match.
- *
- * Scalar floating-point values are always passed as double arrays of size 2
- * (for the real and imaginary parts).  They are typecast to float as needed.
- * FUTURE WORK: the float case is not supported yet.
- */
-
-/* xtype defines the kind of numerical values used: */
-#define CHOLMOD_PATTERN 0	/* pattern only, no numerical values */
-#define CHOLMOD_REAL 1		/* a real matrix */
-#define CHOLMOD_COMPLEX 2	/* a complex matrix (ANSI C99 compatible) */
-#define CHOLMOD_ZOMPLEX 3	/* a complex matrix (MATLAB compatible) */
-
-/* The xtype of all parameters for all CHOLMOD routines must match.
- *
- * CHOLMOD_PATTERN: x and z are ignored.
- * CHOLMOD_DOUBLE:  x is non-null of size nzmax, z is ignored.
- * CHOLMOD_COMPLEX: x is non-null of size 2*nzmax doubles, z is ignored.
- * CHOLMOD_ZOMPLEX: x and z are non-null of size nzmax
- *
- * In the real case, z is ignored.  The kth entry in the matrix is x [k].
- * There are two methods for the complex case.  In the ANSI C99-compatible
- * CHOLMOD_COMPLEX case, the real and imaginary parts of the kth entry
- * are in x [2*k] and x [2*k+1], respectively.  z is ignored.  In the
- * MATLAB-compatible CHOLMOD_ZOMPLEX case, the real and imaginary
- * parts of the kth entry are in x [k] and z [k].
- *
- * Scalar floating-point values are always passed as double arrays of size 2
- * (real and imaginary parts).  The imaginary part of a scalar is ignored if
- * the routine operates on a real matrix.
- *
- * These Modules support complex and zomplex matrices, with a few exceptions:
- *
- *	Check	    all routines
- *	Cholesky    all routines
- *	Core	    all except cholmod_aat, add, band, copy
- *	Demo	    all routines
- *	Partition   all routines
- *	Supernodal  all routines support any real, complex, or zomplex input.
- *			There will never be a supernodal zomplex L; a complex
- *			supernodal L is created if A is zomplex.
- *	Tcov	    all routines
- *	Valgrind    all routines
- *
- * These Modules provide partial support for complex and zomplex matrices:
- *
- *	MATLAB	    all routines support real and zomplex only, not complex,
- *			with the exception of ldlupdate, which supports
- *			real matrices only.  This is a minor constraint since
- *			MATLAB's matrices are all real or zomplex.
- *	MatrixOps   only norm_dense, norm_sparse, and sdmult support complex
- *			and zomplex
- *
- * These Modules do not support complex and zomplex matrices at all:
- *
- *	Modify	    all routines support real matrices only
- */
-
-/* Definitions for cholmod_common: */
-#define CHOLMOD_MAXMETHODS 9	/* maximum number of different methods that */
-				/* cholmod_analyze can try. Must be >= 9. */
-
-/* Common->status values.  zero means success, negative means a fatal error,
- * positive is a warning. */
-#define CHOLMOD_OK 0			/* success */
-#define CHOLMOD_NOT_INSTALLED (-1)	/* failure: method not installed */
-#define CHOLMOD_OUT_OF_MEMORY (-2)	/* failure: out of memory */
-#define CHOLMOD_TOO_LARGE (-3)		/* failure: integer overflow occured */
-#define CHOLMOD_INVALID (-4)		/* failure: invalid input */
-#define CHOLMOD_GPU_PROBLEM (-5)        /* failure: GPU fatal error */
-#define CHOLMOD_NOT_POSDEF (1)		/* warning: matrix not pos. def. */
-#define CHOLMOD_DSMALL (2)		/* warning: D for LDL'  or diag(L) or */
-					/* LL' has tiny absolute value */
-
-/* ordering method (also used for L->ordering) */
-#define CHOLMOD_NATURAL 0	/* use natural ordering */
-#define CHOLMOD_GIVEN 1		/* use given permutation */
-#define CHOLMOD_AMD 2		/* use minimum degree (AMD) */
-#define CHOLMOD_METIS 3		/* use METIS' nested dissection */
-#define CHOLMOD_NESDIS 4	/* use CHOLMOD's version of nested dissection:*/
-				/* node bisector applied recursively, followed
-				 * by constrained minimum degree (CSYMAMD or
-				 * CCOLAMD) */
-#define CHOLMOD_COLAMD 5	/* use AMD for A, COLAMD for A*A' */
-
-/* POSTORDERED is not a method, but a result of natural ordering followed by a
- * weighted postorder.  It is used for L->ordering, not method [ ].ordering. */
-#define CHOLMOD_POSTORDERED 6	/* natural ordering, postordered. */
-
-/* supernodal strategy (for Common->supernodal) */
-#define CHOLMOD_SIMPLICIAL 0	/* always do simplicial */
-#define CHOLMOD_AUTO 1		/* select simpl/super depending on matrix */
-#define CHOLMOD_SUPERNODAL 2	/* always do supernodal */
-
-typedef struct cholmod_common_struct
-{
-    /* ---------------------------------------------------------------------- */
-    /* parameters for symbolic/numeric factorization and update/downdate */
-    /* ---------------------------------------------------------------------- */
-
-    double dbound ;	/* Smallest absolute value of diagonal entries of D
-			 * for LDL' factorization and update/downdate/rowadd/
-	* rowdel, or the diagonal of L for an LL' factorization.
-	* Entries in the range 0 to dbound are replaced with dbound.
-	* Entries in the range -dbound to 0 are replaced with -dbound.  No
-	* changes are made to the diagonal if dbound <= 0.  Default: zero */
-
-    double grow0 ;	/* For a simplicial factorization, L->i and L->x can
-			 * grow if necessary.  grow0 is the factor by which
-	* it grows.  For the initial space, L is of size MAX (1,grow0) times
-	* the required space.  If L runs out of space, the new size of L is
-	* MAX(1.2,grow0) times the new required space.   If you do not plan on
-	* modifying the LDL' factorization in the Modify module, set grow0 to
-	* zero (or set grow2 to 0, see below).  Default: 1.2 */
-
-    double grow1 ;
-
-    size_t grow2 ;	/* For a simplicial factorization, each column j of L
-			 * is initialized with space equal to
-	* grow1*L->ColCount[j] + grow2.  If grow0 < 1, grow1 < 1, or grow2 == 0,
-	* then the space allocated is exactly equal to L->ColCount[j].  If the
-	* column j runs out of space, it increases to grow1*need + grow2 in
-	* size, where need is the total # of nonzeros in that column.  If you do
-	* not plan on modifying the factorization in the Modify module, set
-	* grow2 to zero.  Default: grow1 = 1.2, grow2 = 5. */
-
-    size_t maxrank ;	/* rank of maximum update/downdate.  Valid values:
-			 * 2, 4, or 8.  A value < 2 is set to 2, and a
-	* value > 8 is set to 8.  It is then rounded up to the next highest
-	* power of 2, if not already a power of 2.  Workspace (Xwork, below) of
-	* size nrow-by-maxrank double's is allocated for the update/downdate.
-	* If an update/downdate of rank-k is requested, with k > maxrank,
-	* it is done in steps of maxrank.  Default: 8, which is fastest.
-	* Memory usage can be reduced by setting maxrank to 2 or 4.
-	*/
-
-    double supernodal_switch ;	/* supernodal vs simplicial factorization */
-    int supernodal ;		/* If Common->supernodal <= CHOLMOD_SIMPLICIAL
-				 * (0) then cholmod_analyze performs a
-	* simplicial analysis.  If >= CHOLMOD_SUPERNODAL (2), then a supernodal
-	* analysis is performed.  If == CHOLMOD_AUTO (1) and
-	* flop/nnz(L) < Common->supernodal_switch, then a simplicial analysis
-	* is done.  A supernodal analysis done otherwise.
-	* Default:  CHOLMOD_AUTO.  Default supernodal_switch = 40 */
-
-    int final_asis ;	/* If TRUE, then ignore the other final_* parameters
-			 * (except for final_pack).
-			 * The factor is left as-is when done.  Default: TRUE.*/
-
-    int final_super ;	/* If TRUE, leave a factor in supernodal form when
-			 * supernodal factorization is finished.  If FALSE,
-			 * then convert to a simplicial factor when done.
-			 * Default: TRUE */
-
-    int final_ll ;	/* If TRUE, leave factor in LL' form when done.
-			 * Otherwise, leave in LDL' form.  Default: FALSE */
-
-    int final_pack ;	/* If TRUE, pack the columns when done.  If TRUE, and
-			 * cholmod_factorize is called with a symbolic L, L is
-	* allocated with exactly the space required, using L->ColCount.  If you
-	* plan on modifying the factorization, set Common->final_pack to FALSE,
-	* and each column will be given a little extra slack space for future
-	* growth in fill-in due to updates.  Default: TRUE */
-
-    int final_monotonic ;   /* If TRUE, ensure columns are monotonic when done.
-			 * Default: TRUE */
-
-    int final_resymbol ;/* if cholmod_factorize performed a supernodal
-			 * factorization, final_resymbol is true, and
-	* final_super is FALSE (convert a simplicial numeric factorization),
-	* then numerically zero entries that resulted from relaxed supernodal
-	* amalgamation are removed.  This does not remove entries that are zero
-	* due to exact numeric cancellation, since doing so would break the
-	* update/downdate rowadd/rowdel routines.  Default: FALSE. */
-
-    /* supernodal relaxed amalgamation parameters: */
-    double zrelax [3] ;
-    size_t nrelax [3] ;
-
-	/* Let ns be the total number of columns in two adjacent supernodes.
-	 * Let z be the fraction of zero entries in the two supernodes if they
-	 * are merged (z includes zero entries from prior amalgamations).  The
-	 * two supernodes are merged if:
-	 *    (ns <= nrelax [0]) || (no new zero entries added) ||
-	 *    (ns <= nrelax [1] && z < zrelax [0]) ||
-	 *    (ns <= nrelax [2] && z < zrelax [1]) || (z < zrelax [2])
-	 *
-	 * Default parameters result in the following rule:
-	 *    (ns <= 4) || (no new zero entries added) ||
-	 *    (ns <= 16 && z < 0.8) || (ns <= 48 && z < 0.1) || (z < 0.05)
-	 */
-
-    int prefer_zomplex ;    /* X = cholmod_solve (sys, L, B, Common) computes
-			     * x=A\b or solves a related system.  If L and B are
-	 * both real, then X is real.  Otherwise, X is returned as
-	 * CHOLMOD_COMPLEX if Common->prefer_zomplex is FALSE, or
-	 * CHOLMOD_ZOMPLEX if Common->prefer_zomplex is TRUE.  This parameter
-	 * is needed because there is no supernodal zomplex L.  Suppose the
-	 * caller wants all complex matrices to be stored in zomplex form
-	 * (MATLAB, for example).  A supernodal L is returned in complex form
-	 * if A is zomplex.  B can be real, and thus X = cholmod_solve (L,B)
-	 * should return X as zomplex.  This cannot be inferred from the input
-	 * arguments L and B.  Default: FALSE, since all data types are
-	 * supported in CHOLMOD_COMPLEX form and since this is the native type
-	 * of LAPACK and the BLAS.  Note that the MATLAB/cholmod.c mexFunction
-	 * sets this parameter to TRUE, since MATLAB matrices are in
-	 * CHOLMOD_ZOMPLEX form.
-	 */
-
-    int prefer_upper ;	    /* cholmod_analyze and cholmod_factorize work
-			     * fastest when a symmetric matrix is stored in
-	 * upper triangular form when a fill-reducing ordering is used.  In
-	 * MATLAB, this corresponds to how x=A\b works.  When the matrix is
-	 * ordered as-is, they work fastest when a symmetric matrix is in lower
-	 * triangular form.  In MATLAB, R=chol(A) does the opposite.  This
-	 * parameter affects only how cholmod_read returns a symmetric matrix.
-	 * If TRUE (the default case), a symmetric matrix is always returned in
-	 * upper-triangular form (A->stype = 1).  */
-
-    int quick_return_if_not_posdef ;	/* if TRUE, the supernodal numeric
-					 * factorization will return quickly if
-	* the matrix is not positive definite.  Default: FALSE. */
-
-    int prefer_binary ;	    /* cholmod_read_triplet converts a symmetric
-			     * pattern-only matrix into a real matrix.  If
-	* prefer_binary is FALSE, the diagonal entries are set to 1 + the degree
-	* of the row/column, and off-diagonal entries are set to -1 (resulting
-	* in a positive definite matrix if the diagonal is zero-free).  Most
-	* symmetric patterns are the pattern a positive definite matrix.  If
-	* this parameter is TRUE, then the matrix is returned with a 1 in each
-	* entry, instead.  Default: FALSE.  Added in v1.3. */
-
-    /* ---------------------------------------------------------------------- */
-    /* printing and error handling options */
-    /* ---------------------------------------------------------------------- */
-
-    int print ;		/* print level. Default: 3 */
-    int precise ;	/* if TRUE, print 16 digits.  Otherwise print 5 */
-
-    /* CHOLMOD print_function replaced with SuiteSparse_config.print_func */
-
-    int try_catch ;	/* if TRUE, then ignore errors; CHOLMOD is in the middle
-			 * of a try/catch block.  No error message is printed
-	 * and the Common->error_handler function is not called. */
-
-    void (*error_handler) (int status, const char *file,
-        int line, const char *message) ;
-
-	/* Common->error_handler is the user's error handling routine.  If not
-	 * NULL, this routine is called if an error occurs in CHOLMOD.  status
-	 * can be CHOLMOD_OK (0), negative for a fatal error, and positive for
-	 * a warning. file is a string containing the name of the source code
-	 * file where the error occured, and line is the line number in that
-	 * file.  message is a string describing the error in more detail. */
-
-    /* ---------------------------------------------------------------------- */
-    /* ordering options */
-    /* ---------------------------------------------------------------------- */
-
-    /* The cholmod_analyze routine can try many different orderings and select
-     * the best one.  It can also try one ordering method multiple times, with
-     * different parameter settings.  The default is to use three orderings,
-     * the user's permutation (if provided), AMD which is the fastest ordering
-     * and generally gives good fill-in, and METIS.  CHOLMOD's nested dissection
-     * (METIS with a constrained AMD) usually gives a better ordering than METIS
-     * alone (by about 5% to 10%) but it takes more time.
-     *
-     * If you know the method that is best for your matrix, set Common->nmethods
-     * to 1 and set Common->method [0] to the set of parameters for that method.
-     * If you set it to 1 and do not provide a permutation, then only AMD will
-     * be called.
-     *
-     * If METIS is not available, the default # of methods tried is 2 (the user
-     * permutation, if any, and AMD).
-     *
-     * To try other methods, set Common->nmethods to the number of methods you
-     * want to try.  The suite of default methods and their parameters is
-     * described in the cholmod_defaults routine, and summarized here:
-     *
-     *	    Common->method [i]:
-     *	    i = 0: user-provided ordering (cholmod_analyze_p only)
-     *	    i = 1: AMD (for both A and A*A')
-     *	    i = 2: METIS
-     *	    i = 3: CHOLMOD's nested dissection (NESDIS), default parameters
-     *	    i = 4: natural
-     *	    i = 5: NESDIS with nd_small = 20000
-     *	    i = 6: NESDIS with nd_small = 4, no constrained minimum degree
-     *	    i = 7: NESDIS with no dense node removal
-     *	    i = 8: AMD for A, COLAMD for A*A'
-     *
-     * You can modify the suite of methods you wish to try by modifying
-     * Common.method [...] after calling cholmod_start or cholmod_defaults.
-     *
-     * For example, to use AMD, followed by a weighted postordering:
-     *
-     *	    Common->nmethods = 1 ;
-     *	    Common->method [0].ordering = CHOLMOD_AMD ;
-     *	    Common->postorder = TRUE ;
-     *
-     * To use the natural ordering (with no postordering):
-     *
-     *	    Common->nmethods = 1 ;
-     *	    Common->method [0].ordering = CHOLMOD_NATURAL ;
-     *	    Common->postorder = FALSE ;
-     *
-     * If you are going to factorize hundreds or more matrices with the same
-     * nonzero pattern, you may wish to spend a great deal of time finding a
-     * good permutation.  In this case, try setting Common->nmethods to 9.
-     * The time spent in cholmod_analysis will be very high, but you need to
-     * call it only once.
-     *
-     * cholmod_analyze sets Common->current to a value between 0 and nmethods-1.
-     * Each ordering method uses the set of options defined by this parameter.
-     */
-
-    int nmethods ;	/* The number of ordering methods to try.  Default: 0.
-			 * nmethods = 0 is a special case.  cholmod_analyze
-	* will try the user-provided ordering (if given) and AMD.  Let fl and
-	* lnz be the flop count and nonzeros in L from AMD's ordering.  Let
-	* anz be the number of nonzeros in the upper or lower triangular part
-	* of the symmetric matrix A.  If fl/lnz < 500 or lnz/anz < 5, then this
-	* is a good ordering, and METIS is not attempted.  Otherwise, METIS is
-	* tried.   The best ordering found is used.  If nmethods > 0, the
-	* methods used are given in the method[ ] array, below.  The first
-	* three methods in the default suite of orderings is (1) use the given
-	* permutation (if provided), (2) use AMD, and (3) use METIS.  Maximum
-	* allowed value is CHOLMOD_MAXMETHODS.  */
-
-    int current ;	/* The current method being tried.  Default: 0.  Valid
-			 * range is 0 to nmethods-1. */
-
-    int selected ;	/* The best method found. */
-
-    /* The suite of ordering methods and parameters: */
-
-    struct cholmod_method_struct
-    {
-	/* statistics for this method */
-	double lnz ;	    /* nnz(L) excl. zeros from supernodal amalgamation,
-			     * for a "pure" L */
-
-	double fl ;	    /* flop count for a "pure", real simplicial LL'
-			     * factorization, with no extra work due to
-	    * amalgamation.  Subtract n to get the LDL' flop count.   Multiply
-	    * by about 4 if the matrix is complex or zomplex. */
-
-	/* ordering method parameters */
-	double prune_dense ;/* dense row/col control for AMD, SYMAMD, CSYMAMD,
-			     * and NESDIS (cholmod_nested_dissection).  For a
-	    * symmetric n-by-n matrix, rows/columns with more than
-	    * MAX (16, prune_dense * sqrt (n)) entries are removed prior to
-	    * ordering.  They appear at the end of the re-ordered matrix.
-	    *
-	    * If prune_dense < 0, only completely dense rows/cols are removed.
-	    *
-	    * This paramater is also the dense column control for COLAMD and
-	    * CCOLAMD.  For an m-by-n matrix, columns with more than
-	    * MAX (16, prune_dense * sqrt (MIN (m,n))) entries are removed prior
-	    * to ordering.  They appear at the end of the re-ordered matrix.
-	    * CHOLMOD factorizes A*A', so it calls COLAMD and CCOLAMD with A',
-	    * not A.  Thus, this parameter affects the dense *row* control for
-	    * CHOLMOD's matrix, and the dense *column* control for COLAMD and
-	    * CCOLAMD.
-	    *
-	    * Removing dense rows and columns improves the run-time of the
-	    * ordering methods.  It has some impact on ordering quality
-	    * (usually minimal, sometimes good, sometimes bad).
-	    *
-	    * Default: 10. */
-
-	double prune_dense2 ;/* dense row control for COLAMD and CCOLAMD.
-			    *  Rows with more than MAX (16, dense2 * sqrt (n))
-	    * for an m-by-n matrix are removed prior to ordering.  CHOLMOD's
-	    * matrix is transposed before ordering it with COLAMD or CCOLAMD,
-	    * so this controls the dense *columns* of CHOLMOD's matrix, and
-	    * the dense *rows* of COLAMD's or CCOLAMD's matrix.
-	    *
-	    * If prune_dense2 < 0, only completely dense rows/cols are removed.
-	    *
-	    * Default: -1.  Note that this is not the default for COLAMD and
-	    * CCOLAMD.  -1 is best for Cholesky.  10 is best for LU.  */
-
-	double nd_oksep ;   /* in NESDIS, when a node separator is computed, it
-			     * discarded if nsep >= nd_oksep*n, where nsep is
-	    * the number of nodes in the separator, and n is the size of the
-	    * graph being cut.  Valid range is 0 to 1.  If 1 or greater, the
-	    * separator is discarded if it consists of the entire graph.
-	    * Default: 1 */
-
-	double other_1 [4] ; /* future expansion */
-
-	size_t nd_small ;    /* do not partition graphs with fewer nodes than
-			     * nd_small, in NESDIS.  Default: 200 (same as
-			     * METIS) */
-
-	size_t other_2 [4] ; /* future expansion */
-
-	int aggressive ;    /* Aggresive absorption in AMD, COLAMD, SYMAMD,
-			     * CCOLAMD, and CSYMAMD.  Default: TRUE */
-
-	int order_for_lu ;  /* CCOLAMD can be optimized to produce an ordering
-			     * for LU or Cholesky factorization.  CHOLMOD only
-	    * performs a Cholesky factorization.  However, you may wish to use
-	    * CHOLMOD as an interface for CCOLAMD but use it for your own LU
-	    * factorization.  In this case, order_for_lu should be set to FALSE.
-	    * When factorizing in CHOLMOD itself, you should *** NEVER *** set
-	    * this parameter FALSE.  Default: TRUE. */
-
-	int nd_compress ;   /* If TRUE, compress the graph and subgraphs before
-			     * partitioning them in NESDIS.  Default: TRUE */
-
-	int nd_camd ;	    /* If 1, follow the nested dissection ordering
-			     * with a constrained minimum degree ordering that
-	    * respects the partitioning just found (using CAMD).  If 2, use
-	    * CSYMAMD instead.  If you set nd_small very small, you may not need
-	    * this ordering, and can save time by setting it to zero (no
-	    * constrained minimum degree ordering).  Default: 1. */
-
-	int nd_components ; /* The nested dissection ordering finds a node
-			     * separator that splits the graph into two parts,
-	    * which may be unconnected.  If nd_components is TRUE, each of
-	    * these connected components is split independently.  If FALSE,
-	    * each part is split as a whole, even if it consists of more than
-	    * one connected component.  Default: FALSE */
-
-	/* fill-reducing ordering to use */
-	int ordering ;
-
-	size_t other_3 [4] ; /* future expansion */
-
-    } method [CHOLMOD_MAXMETHODS + 1] ;
-
-    int postorder ;	/* If TRUE, cholmod_analyze follows the ordering with a
-			 * weighted postorder of the elimination tree.  Improves
-	* supernode amalgamation.  Does not affect fundamental nnz(L) and
-	* flop count.  Default: TRUE. */
-
-    int default_nesdis ;    /* Default: FALSE.  If FALSE, then the default
-			     * ordering strategy (when Common->nmethods == 0)
-	* is to try the given ordering (if present), AMD, and then METIS if AMD
-	* reports high fill-in.  If Common->default_nesdis is TRUE then NESDIS
-	* is used instead in the default strategy. */
-
-    /* ---------------------------------------------------------------------- */
-    /* memory management, complex divide, and hypot function pointers moved */
-    /* ---------------------------------------------------------------------- */
-
-    /* Function pointers moved from here (in CHOLMOD 2.2.0) to
-       SuiteSparse_config.[ch].  See CHOLMOD/Include/cholmod_back.h
-       for a set of macros that can be #include'd or copied into your
-       application to define these function pointers on any version of CHOLMOD.
-       */
-
-    /* ---------------------------------------------------------------------- */
-    /* METIS workarounds */
-    /* ---------------------------------------------------------------------- */
-
-    double metis_memory ;   /* This is a parameter for CHOLMOD's interface to
-			     * METIS, not a parameter to METIS itself.  METIS
-	* uses an amount of memory that is difficult to estimate precisely
-	* beforehand.  If it runs out of memory, it terminates your program.
-	* All routines in CHOLMOD except for CHOLMOD's interface to METIS
-	* return an error status and safely return to your program if they run
-	* out of memory.  To mitigate this problem, the CHOLMOD interface
-	* can allocate a single block of memory equal in size to an empirical
-	* upper bound of METIS's memory usage times the Common->metis_memory
-	* parameter, and then immediately free it.  It then calls METIS.  If
-	* this pre-allocation fails, it is possible that METIS will fail as
-	* well, and so CHOLMOD returns with an out-of-memory condition without
-	* calling METIS.
-	*
-	* METIS_NodeND (used in the CHOLMOD_METIS ordering option) with its
-	* default parameter settings typically uses about (4*nz+40n+4096)
-	* times sizeof(int) memory, where nz is equal to the number of entries
-	* in A for the symmetric case or AA' if an unsymmetric matrix is
-	* being ordered (where nz includes both the upper and lower parts
-	* of A or AA').  The observed "upper bound" (with 2 exceptions),
-	* measured in an instrumented copy of METIS 4.0.1 on thousands of
-	* matrices, is (10*nz+50*n+4096) * sizeof(int).  Two large matrices
-	* exceeded this bound, one by almost a factor of 2 (Gupta/gupta2).
-	*
-	* If your program is terminated by METIS, try setting metis_memory to
-	* 2.0, or even higher if needed.  By default, CHOLMOD assumes that METIS
-	* does not have this problem (so that CHOLMOD will work correctly when
-	* this issue is fixed in METIS).  Thus, the default value is zero.
-	* This work-around is not guaranteed anyway.
-	*
-	* If a matrix exceeds this predicted memory usage, AMD is attempted
-	* instead.  It, too, may run out of memory, but if it does so it will
-	* not terminate your program.
-	*/
-
-    double metis_dswitch ;	/* METIS_NodeND in METIS 4.0.1 gives a seg */
-    size_t metis_nswitch ;	/* fault with one matrix of order n = 3005 and
-				 * nz = 6,036,025.  This is a very dense graph.
-     * The workaround is to use AMD instead of METIS for matrices of dimension
-     * greater than Common->metis_nswitch (default 3000) or more and with
-     * density of Common->metis_dswitch (default 0.66) or more.
-     * cholmod_nested_dissection has no problems with the same matrix, even
-     * though it uses METIS_NodeComputeSeparator on this matrix.  If this
-     * seg fault does not affect you, set metis_nswitch to zero or less,
-     * and CHOLMOD will not switch to AMD based just on the density of the
-     * matrix (it will still switch to AMD if the metis_memory parameter
-     * causes the switch).
-     */
-
-    /* ---------------------------------------------------------------------- */
-    /* workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* CHOLMOD has several routines that take less time than the size of
-     * workspace they require.  Allocating and initializing the workspace would
-     * dominate the run time, unless workspace is allocated and initialized
-     * just once.  CHOLMOD allocates this space when needed, and holds it here
-     * between calls to CHOLMOD.  cholmod_start sets these pointers to NULL
-     * (which is why it must be the first routine called in CHOLMOD).
-     * cholmod_finish frees the workspace (which is why it must be the last
-     * call to CHOLMOD).
-     */
-
-    size_t nrow ;	/* size of Flag and Head */
-    SuiteSparse_long mark ;	/* mark value for Flag array */
-    size_t iworksize ;	/* size of Iwork.  Upper bound: 6*nrow+ncol */
-    size_t xworksize ;	/* size of Xwork,  in bytes.
-			 * maxrank*nrow*sizeof(double) for update/downdate.
-			 * 2*nrow*sizeof(double) otherwise */
-
-    /* initialized workspace: contents needed between calls to CHOLMOD */
-    void *Flag ;	/* size nrow, an integer array.  Kept cleared between
-			 * calls to cholmod rouines (Flag [i] < mark) */
-
-    void *Head ;	/* size nrow+1, an integer array. Kept cleared between
-			 * calls to cholmod routines (Head [i] = EMPTY) */
-
-    void *Xwork ; 	/* a double array.  Its size varies.  It is nrow for
-			 * most routines (cholmod_rowfac, cholmod_add,
-	* cholmod_aat, cholmod_norm, cholmod_ssmult) for the real case, twice
-	* that when the input matrices are complex or zomplex.  It is of size
-	* 2*nrow for cholmod_rowadd and cholmod_rowdel.  For cholmod_updown,
-	* its size is maxrank*nrow where maxrank is 2, 4, or 8.  Kept cleared
-	* between calls to cholmod (set to zero). */
-
-    /* uninitialized workspace, contents not needed between calls to CHOLMOD */
-    void *Iwork ;	/* size iworksize, 2*nrow+ncol for most routines,
-			 * up to 6*nrow+ncol for cholmod_analyze. */
-
-    int itype ;		/* If CHOLMOD_LONG, Flag, Head, and Iwork are
-                         * SuiteSparse_long.  Otherwise all three are int. */
-
-    int dtype ;		/* double or float */
-
-	/* Common->itype and Common->dtype are used to define the types of all
-	 * sparse matrices, triplet matrices, dense matrices, and factors
-	 * created using this Common struct.  The itypes and dtypes of all
-	 * parameters to all CHOLMOD routines must match.  */
-
-    int no_workspace_reallocate ;   /* this is an internal flag, used as a
-	* precaution by cholmod_analyze.  It is normally false.  If true,
-	* cholmod_allocate_work is not allowed to reallocate any workspace;
-	* they must use the existing workspace in Common (Iwork, Flag, Head,
-	* and Xwork).  Added for CHOLMOD v1.1 */
-
-    /* ---------------------------------------------------------------------- */
-    /* statistics */
-    /* ---------------------------------------------------------------------- */
-
-    /* fl and lnz are set only in cholmod_analyze and cholmod_rowcolcounts,
-     * in the Cholesky modudle.  modfl is set only in the Modify module. */
-
-    int status ;	    /* error code */
-    double fl ;		    /* LL' flop count from most recent analysis */
-    double lnz ;	    /* fundamental nz in L */
-    double anz ;	    /* nonzeros in tril(A) if A is symmetric/lower,
-			     * triu(A) if symmetric/upper, or tril(A*A') if
-			     * unsymmetric, in last call to cholmod_analyze. */
-    double modfl ;	    /* flop count from most recent update/downdate/
-			     * rowadd/rowdel (excluding flops to modify the
-			     * solution to Lx=b, if computed) */
-    size_t malloc_count ;   /* # of objects malloc'ed minus the # free'd*/
-    size_t memory_usage ;   /* peak memory usage in bytes */
-    size_t memory_inuse ;   /* current memory usage in bytes */
-
-    double nrealloc_col ;   /* # of column reallocations */
-    double nrealloc_factor ;/* # of factor reallocations due to col. reallocs */
-    double ndbounds_hit ;   /* # of times diagonal modified by dbound */
-
-    double rowfacfl ;	    /* # of flops in last call to cholmod_rowfac */
-    double aatfl ;	    /* # of flops to compute A(:,f)*A(:,f)' */
-
-    int called_nd ;	    /* TRUE if the last call to
-			     * cholmod_analyze called NESDIS or METIS. */
-    int blas_ok ;           /* FALSE if BLAS int overflow; TRUE otherwise */
-
-    /* ---------------------------------------------------------------------- */
-    /* SuiteSparseQR control parameters: */
-    /* ---------------------------------------------------------------------- */
-
-    double SPQR_grain ;      /* task size is >= max (total flops / grain) */
-    double SPQR_small ;      /* task size is >= small */
-    int SPQR_shrink ;        /* controls stack realloc method */
-    int SPQR_nthreads ;      /* number of TBB threads, 0 = auto */
-
-    /* ---------------------------------------------------------------------- */
-    /* SuiteSparseQR statistics */
-    /* ---------------------------------------------------------------------- */
-
-    /* was other1 [0:3] */
-    double SPQR_flopcount ;         /* flop count for SPQR */
-    double SPQR_analyze_time ;      /* analysis time in seconds for SPQR */
-    double SPQR_factorize_time ;    /* factorize time in seconds for SPQR */
-    double SPQR_solve_time ;        /* backsolve time in seconds */
-
-    /* was SPQR_xstat [0:3] */
-    double SPQR_flopcount_bound ;   /* upper bound on flop count */
-    double SPQR_tol_used ;          /* tolerance used */
-    double SPQR_norm_E_fro ;        /* Frobenius norm of dropped entries */
-
-    /* was SPQR_istat [0:9] */
-    SuiteSparse_long SPQR_istat [10] ;
-
-    /* ---------------------------------------------------------------------- */
-    /* GPU configuration and statistics */
-    /* ---------------------------------------------------------------------- */
-
-    /*  useGPU:  1 if gpu-acceleration is requested */
-    /*           0 if gpu-acceleration is prohibited */
-    /*          -1 if gpu-acceleration is undefined in which case the */
-    /*             environment CHOLMOD_USE_GPU will be queried and used. */
-    /*             useGPU=-1 is only used by CHOLMOD and treated as 0 by SPQR */
-    int useGPU;
-
-    /* for CHOLMOD: */
-    size_t maxGpuMemBytes;
-    double maxGpuMemFraction;
-
-    /* for SPQR: */
-    size_t gpuMemorySize;       /* Amount of memory in bytes on the GPU */
-    double gpuKernelTime;       /* Time taken by GPU kernels */
-    SuiteSparse_long gpuFlops;  /* Number of flops performed by the GPU */
-    int gpuNumKernelLaunches;   /* Number of GPU kernel launches */
-
-    /* If not using the GPU, these items are not used, but they should be
-       present so that the CHOLMOD Common has the same size whether the GPU
-       is used or not.  This way, all packages will agree on the size of
-       the CHOLMOD Common, regardless of whether or not they are compiled
-       with the GPU libraries or not */
-
-#ifdef GPU_BLAS
-    /* in CUDA, these three types are pointers */
-    #define CHOLMOD_CUBLAS_HANDLE cublasHandle_t
-    #define CHOLMOD_CUDASTREAM    cudaStream_t
-    #define CHOLMOD_CUDAEVENT     cudaEvent_t
-#else
-    /* ... so make them void * pointers if the GPU is not being used */
-    #define CHOLMOD_CUBLAS_HANDLE void *
-    #define CHOLMOD_CUDASTREAM    void *
-    #define CHOLMOD_CUDAEVENT     void *
-#endif
-
-    CHOLMOD_CUBLAS_HANDLE cublasHandle ;
-
-    /* a set of streams for general use */
-    CHOLMOD_CUDASTREAM    gpuStream[CHOLMOD_HOST_SUPERNODE_BUFFERS];
-
-    CHOLMOD_CUDAEVENT     cublasEventPotrf [3] ;
-    CHOLMOD_CUDAEVENT     updateCKernelsComplete;
-    CHOLMOD_CUDAEVENT     updateCBuffersFree[CHOLMOD_HOST_SUPERNODE_BUFFERS];
-
-    void *dev_mempool;    /* pointer to single allocation of device memory */
-    size_t dev_mempool_size;
-
-    void *host_pinned_mempool;  /* pointer to single allocation of pinned mem */
-    size_t host_pinned_mempool_size;
-
-    size_t devBuffSize;
-    int    ibuffer;
-
-    double syrkStart ;          /* time syrk started */
-
-    /* run times of the different parts of CHOLMOD (GPU and CPU) */
-    double cholmod_cpu_gemm_time ;
-    double cholmod_cpu_syrk_time ;
-    double cholmod_cpu_trsm_time ;
-    double cholmod_cpu_potrf_time ;
-    double cholmod_gpu_gemm_time ;
-    double cholmod_gpu_syrk_time ;
-    double cholmod_gpu_trsm_time ;
-    double cholmod_gpu_potrf_time ;
-    double cholmod_assemble_time ;
-    double cholmod_assemble_time2 ;
-
-    /* number of times the BLAS are called on the CPU and the GPU */
-    size_t cholmod_cpu_gemm_calls ;
-    size_t cholmod_cpu_syrk_calls ;
-    size_t cholmod_cpu_trsm_calls ;
-    size_t cholmod_cpu_potrf_calls ;
-    size_t cholmod_gpu_gemm_calls ;
-    size_t cholmod_gpu_syrk_calls ;
-    size_t cholmod_gpu_trsm_calls ;
-    size_t cholmod_gpu_potrf_calls ;
-
-} cholmod_common ;
-
-/* size_t BLAS statistcs in Common: */
-#define CHOLMOD_CPU_GEMM_CALLS      cholmod_cpu_gemm_calls
-#define CHOLMOD_CPU_SYRK_CALLS      cholmod_cpu_syrk_calls
-#define CHOLMOD_CPU_TRSM_CALLS      cholmod_cpu_trsm_calls
-#define CHOLMOD_CPU_POTRF_CALLS     cholmod_cpu_potrf_calls
-#define CHOLMOD_GPU_GEMM_CALLS      cholmod_gpu_gemm_calls
-#define CHOLMOD_GPU_SYRK_CALLS      cholmod_gpu_syrk_calls
-#define CHOLMOD_GPU_TRSM_CALLS      cholmod_gpu_trsm_calls
-#define CHOLMOD_GPU_POTRF_CALLS     cholmod_gpu_potrf_calls
-
-/* double BLAS statistics in Common: */
-#define CHOLMOD_CPU_GEMM_TIME       cholmod_cpu_gemm_time
-#define CHOLMOD_CPU_SYRK_TIME       cholmod_cpu_syrk_time
-#define CHOLMOD_CPU_TRSM_TIME       cholmod_cpu_trsm_time
-#define CHOLMOD_CPU_POTRF_TIME      cholmod_cpu_potrf_time
-#define CHOLMOD_GPU_GEMM_TIME       cholmod_gpu_gemm_time
-#define CHOLMOD_GPU_SYRK_TIME       cholmod_gpu_syrk_time
-#define CHOLMOD_GPU_TRSM_TIME       cholmod_gpu_trsm_time
-#define CHOLMOD_GPU_POTRF_TIME      cholmod_gpu_potrf_time
-#define CHOLMOD_ASSEMBLE_TIME       cholmod_assemble_time
-#define CHOLMOD_ASSEMBLE_TIME2      cholmod_assemble_time2
-
-/* for supernodal analysis */
-#define CHOLMOD_ANALYZE_FOR_SPQR     0
-#define CHOLMOD_ANALYZE_FOR_CHOLESKY 1
-#define CHOLMOD_ANALYZE_FOR_SPQRGPU  2
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_start:  first call to CHOLMOD */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_start
-(
-    cholmod_common *Common
-) ;
-
-int cholmod_l_start (cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_finish:  last call to CHOLMOD */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_finish
-(
-    cholmod_common *Common
-) ;
-
-int cholmod_l_finish (cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_defaults:  restore default parameters */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_defaults
-(
-    cholmod_common *Common
-) ;
-
-int cholmod_l_defaults (cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_maxrank:  return valid maximum rank for update/downdate */
-/* -------------------------------------------------------------------------- */
-
-size_t cholmod_maxrank	/* returns validated value of Common->maxrank */
-(
-    /* ---- input ---- */
-    size_t n,		/* A and L will have n rows */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-size_t cholmod_l_maxrank (size_t, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_allocate_work:  allocate workspace in Common */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_allocate_work
-(
-    /* ---- input ---- */
-    size_t nrow,	/* size: Common->Flag (nrow), Common->Head (nrow+1) */
-    size_t iworksize,	/* size of Common->Iwork */
-    size_t xworksize,	/* size of Common->Xwork */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_allocate_work (size_t, size_t, size_t, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_free_work:  free workspace in Common */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_free_work
-(
-    cholmod_common *Common
-) ;
-
-int cholmod_l_free_work (cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_clear_flag:  clear Flag workspace in Common */
-/* -------------------------------------------------------------------------- */
-
-/* use a macro for speed */
-#define CHOLMOD_CLEAR_FLAG(Common) \
-{ \
-    Common->mark++ ; \
-    if (Common->mark <= 0) \
-    { \
-	Common->mark = EMPTY ; \
-	CHOLMOD (clear_flag) (Common) ; \
-    } \
-}
-
-SuiteSparse_long cholmod_clear_flag
-(
-    cholmod_common *Common
-) ;
-
-SuiteSparse_long cholmod_l_clear_flag (cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_error:  called when CHOLMOD encounters an error */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_error
-(
-    /* ---- input ---- */
-    int status,		/* error status */
-    const char *file,	/* name of source code file where error occured */
-    int line,		/* line number in source code file where error occured*/
-    const char *message,/* error message */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_error (int, const char *, int, const char *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_dbound:  for internal use in CHOLMOD only */
-/* -------------------------------------------------------------------------- */
-
-double cholmod_dbound	/* returns modified diagonal entry of D or L */
-(
-    /* ---- input ---- */
-    double dj,		/* diagonal entry of D for LDL' or L for LL' */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-double cholmod_l_dbound (double, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_hypot:  compute sqrt (x*x + y*y) accurately */
-/* -------------------------------------------------------------------------- */
-
-double cholmod_hypot
-(
-    /* ---- input ---- */
-    double x, double y
-) ;
-
-double cholmod_l_hypot (double, double) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_divcomplex:  complex division, c = a/b */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_divcomplex		/* return 1 if divide-by-zero, 0 otherise */
-(
-    /* ---- input ---- */
-    double ar, double ai,	/* real and imaginary parts of a */
-    double br, double bi,	/* real and imaginary parts of b */
-    /* ---- output --- */
-    double *cr, double *ci	/* real and imaginary parts of c */
-) ;
-
-int cholmod_l_divcomplex (double, double, double, double, double *, double *) ;
-
-
-/* ========================================================================== */
-/* === Core/cholmod_sparse ================================================== */
-/* ========================================================================== */
-
-/* A sparse matrix stored in compressed-column form. */
-
-typedef struct cholmod_sparse_struct
-{
-    size_t nrow ;	/* the matrix is nrow-by-ncol */
-    size_t ncol ;
-    size_t nzmax ;	/* maximum number of entries in the matrix */
-
-    /* pointers to int or SuiteSparse_long: */
-    void *p ;		/* p [0..ncol], the column pointers */
-    void *i ;		/* i [0..nzmax-1], the row indices */
-
-    /* for unpacked matrices only: */
-    void *nz ;		/* nz [0..ncol-1], the # of nonzeros in each col.  In
-			 * packed form, the nonzero pattern of column j is in
-	* A->i [A->p [j] ... A->p [j+1]-1].  In unpacked form, column j is in
-	* A->i [A->p [j] ... A->p [j]+A->nz[j]-1] instead.  In both cases, the
-	* numerical values (if present) are in the corresponding locations in
-	* the array x (or z if A->xtype is CHOLMOD_ZOMPLEX). */
-
-    /* pointers to double or float: */
-    void *x ;		/* size nzmax or 2*nzmax, if present */
-    void *z ;		/* size nzmax, if present */
-
-    int stype ;		/* Describes what parts of the matrix are considered:
-			 *
-	* 0:  matrix is "unsymmetric": use both upper and lower triangular parts
-	*     (the matrix may actually be symmetric in pattern and value, but
-	*     both parts are explicitly stored and used).  May be square or
-	*     rectangular.
-	* >0: matrix is square and symmetric, use upper triangular part.
-	*     Entries in the lower triangular part are ignored.
-	* <0: matrix is square and symmetric, use lower triangular part.
-	*     Entries in the upper triangular part are ignored.
-	*
-	* Note that stype>0 and stype<0 are different for cholmod_sparse and
-	* cholmod_triplet.  See the cholmod_triplet data structure for more
-	* details.
-	*/
-
-    int itype ;		/* CHOLMOD_INT:     p, i, and nz are int.
-			 * CHOLMOD_INTLONG: p is SuiteSparse_long,
-                         *                  i and nz are int.
-			 * CHOLMOD_LONG:    p, i, and nz are SuiteSparse_long */
-
-    int xtype ;		/* pattern, real, complex, or zomplex */
-    int dtype ;		/* x and z are double or float */
-    int sorted ;	/* TRUE if columns are sorted, FALSE otherwise */
-    int packed ;	/* TRUE if packed (nz ignored), FALSE if unpacked
-			 * (nz is required) */
-
-} cholmod_sparse ;
-
-typedef struct cholmod_descendant_score_t {
-  double score;
-  SuiteSparse_long d;
-} descendantScore;
-
-/* For sorting descendant supernodes with qsort */
-int cholmod_score_comp (struct cholmod_descendant_score_t *i,
-			       struct cholmod_descendant_score_t *j);
-
-int cholmod_l_score_comp (struct cholmod_descendant_score_t *i,
-			       struct cholmod_descendant_score_t *j);
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_allocate_sparse:  allocate a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_allocate_sparse
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of A */
-    size_t ncol,	/* # of columns of A */
-    size_t nzmax,	/* max # of nonzeros of A */
-    int sorted,		/* TRUE if columns of A sorted, FALSE otherwise */
-    int packed,		/* TRUE if A will be packed, FALSE otherwise */
-    int stype,		/* stype of A */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_allocate_sparse (size_t, size_t, size_t, int, int,
-    int, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_free_sparse:  free a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_free_sparse
-(
-    /* ---- in/out --- */
-    cholmod_sparse **A,	/* matrix to deallocate, NULL on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_free_sparse (cholmod_sparse **, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_reallocate_sparse:  change the size (# entries) of sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_reallocate_sparse
-(
-    /* ---- input ---- */
-    size_t nznew,	/* new # of entries in A */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix to reallocate */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_reallocate_sparse ( size_t, cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_nnz:  return number of nonzeros in a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-SuiteSparse_long cholmod_nnz
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-SuiteSparse_long cholmod_l_nnz (cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_speye:  sparse identity matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_speye
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of A */
-    size_t ncol,	/* # of columns of A */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_speye (size_t, size_t, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_spzeros:  sparse zero matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_spzeros
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of A */
-    size_t ncol,	/* # of columns of A */
-    size_t nzmax,	/* max # of nonzeros of A */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_spzeros (size_t, size_t, size_t, int,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_transpose:  transpose a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-/* Return A' or A.'  The "values" parameter is 0, 1, or 2 to denote the pattern
- * transpose, the array transpose (A.'), and the complex conjugate transpose
- * (A').
- */
-
-cholmod_sparse *cholmod_transpose
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    int values,		/* 0: pattern, 1: array transpose, 2: conj. transpose */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_transpose (cholmod_sparse *, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_transpose_unsym:  transpose an unsymmetric sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-/* Compute F = A', A (:,f)', or A (p,f)', where A is unsymmetric and F is
- * already allocated.  See cholmod_transpose for a simpler routine. */
-
-int cholmod_transpose_unsym
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    int values,		/* 0: pattern, 1: array transpose, 2: conj. transpose */
-    int *Perm,		/* size nrow, if present (can be NULL) */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- output --- */
-    cholmod_sparse *F,	/* F = A', A(:,f)', or A(p,f)' */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_transpose_unsym (cholmod_sparse *, int, SuiteSparse_long *,
-    SuiteSparse_long *, size_t, cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_transpose_sym:  transpose a symmetric sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-/* Compute F = A' or A (p,p)', where A is symmetric and F is already allocated.
- * See cholmod_transpose for a simpler routine. */
-
-int cholmod_transpose_sym
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    int values,		/* 0: pattern, 1: array transpose, 2: conj. transpose */
-    int *Perm,		/* size nrow, if present (can be NULL) */
-    /* ---- output --- */
-    cholmod_sparse *F,	/* F = A' or A(p,p)' */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_transpose_sym (cholmod_sparse *, int, SuiteSparse_long *,
-    cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_ptranspose:  transpose a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-/* Return A' or A(p,p)' if A is symmetric.  Return A', A(:,f)', or A(p,f)' if
- * A is unsymmetric. */
-
-cholmod_sparse *cholmod_ptranspose
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to transpose */
-    int values,		/* 0: pattern, 1: array transpose, 2: conj. transpose */
-    int *Perm,		/* if non-NULL, F = A(p,f) or A(p,p) */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_ptranspose (cholmod_sparse *, int, SuiteSparse_long *,
-    SuiteSparse_long *, size_t, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_sort:  sort row indices in each column of sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_sort
-(
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix to sort */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_sort (cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_band:  C = tril (triu (A,k1), k2) */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_band
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to extract band matrix from */
-    SuiteSparse_long k1,    /* ignore entries below the k1-st diagonal */
-    SuiteSparse_long k2,    /* ignore entries above the k2-nd diagonal */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag) */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_band (cholmod_sparse *, SuiteSparse_long,
-    SuiteSparse_long, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_band_inplace:  A = tril (triu (A,k1), k2) */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_band_inplace
-(
-    /* ---- input ---- */
-    SuiteSparse_long k1,    /* ignore entries below the k1-st diagonal */
-    SuiteSparse_long k2,    /* ignore entries above the k2-nd diagonal */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag) */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix from which entries not in band are removed */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_band_inplace (SuiteSparse_long, SuiteSparse_long, int,
-    cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_aat:  C = A*A' or A(:,f)*A(:,f)' */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_aat
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* input matrix; C=A*A' is constructed */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag),
-			 * -2: pattern only, no diagonal, add 50%+n extra
-			 * space to C */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_aat (cholmod_sparse *, SuiteSparse_long *, size_t,
-    int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_copy_sparse:  C = A, create an exact copy of a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_copy_sparse
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_copy_sparse (cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_copy:  C = A, with possible change of stype */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_copy
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    int stype,		/* requested stype of C */
-    int mode,		/* >0: numerical, 0: pattern, <0: pattern (no diag) */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_copy (cholmod_sparse *, int, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_add: C = alpha*A + beta*B */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_add
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	    /* matrix to add */
-    cholmod_sparse *B,	    /* matrix to add */
-    double alpha [2],	    /* scale factor for A */
-    double beta [2],	    /* scale factor for B */
-    int values,		    /* if TRUE compute the numerical values of C */
-    int sorted,		    /* if TRUE, sort columns of C */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_add (cholmod_sparse *, cholmod_sparse *, double *,
-    double *, int, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_sparse_xtype: change the xtype of a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_sparse_xtype
-(
-    /* ---- input ---- */
-    int to_xtype,	/* requested xtype (pattern, real, complex, zomplex) */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* sparse matrix to change */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_sparse_xtype (int, cholmod_sparse *, cholmod_common *) ;
-
-
-/* ========================================================================== */
-/* === Core/cholmod_factor ================================================== */
-/* ========================================================================== */
-
-/* A symbolic and numeric factorization, either simplicial or supernodal.
- * In all cases, the row indices in the columns of L are kept sorted. */
-
-typedef struct cholmod_factor_struct
-{
-    /* ---------------------------------------------------------------------- */
-    /* for both simplicial and supernodal factorizations */
-    /* ---------------------------------------------------------------------- */
-
-    size_t n ;		/* L is n-by-n */
-
-    size_t minor ;	/* If the factorization failed, L->minor is the column
-			 * at which it failed (in the range 0 to n-1).  A value
-			 * of n means the factorization was successful or
-			 * the matrix has not yet been factorized. */
-
-    /* ---------------------------------------------------------------------- */
-    /* symbolic ordering and analysis */
-    /* ---------------------------------------------------------------------- */
-
-    void *Perm ;	/* size n, permutation used */
-    void *ColCount ;	/* size n, column counts for simplicial L */
-
-    void *IPerm ;       /* size n, inverse permutation.  Only created by
-                         * cholmod_solve2 if Bset is used. */
-
-    /* ---------------------------------------------------------------------- */
-    /* simplicial factorization */
-    /* ---------------------------------------------------------------------- */
-
-    size_t nzmax ;	/* size of i and x */
-
-    void *p ;		/* p [0..ncol], the column pointers */
-    void *i ;		/* i [0..nzmax-1], the row indices */
-    void *x ;		/* x [0..nzmax-1], the numerical values */
-    void *z ;
-    void *nz ;		/* nz [0..ncol-1], the # of nonzeros in each column.
-			 * i [p [j] ... p [j]+nz[j]-1] contains the row indices,
-			 * and the numerical values are in the same locatins
-			 * in x. The value of i [p [k]] is always k. */
-
-    void *next ;	/* size ncol+2. next [j] is the next column in i/x */
-    void *prev ;	/* size ncol+2. prev [j] is the prior column in i/x.
-			 * head of the list is ncol+1, and the tail is ncol. */
-
-    /* ---------------------------------------------------------------------- */
-    /* supernodal factorization */
-    /* ---------------------------------------------------------------------- */
-
-    /* Note that L->x is shared with the simplicial data structure.  L->x has
-     * size L->nzmax for a simplicial factor, and size L->xsize for a supernodal
-     * factor. */
-
-    size_t nsuper ;	/* number of supernodes */
-    size_t ssize ;	/* size of s, integer part of supernodes */
-    size_t xsize ;	/* size of x, real part of supernodes */
-    size_t maxcsize ;	/* size of largest update matrix */
-    size_t maxesize ;	/* max # of rows in supernodes, excl. triangular part */
-
-    void *super ;	/* size nsuper+1, first col in each supernode */
-    void *pi ;		/* size nsuper+1, pointers to integer patterns */
-    void *px ;		/* size nsuper+1, pointers to real parts */
-    void *s ;		/* size ssize, integer part of supernodes */
-
-    /* ---------------------------------------------------------------------- */
-    /* factorization type */
-    /* ---------------------------------------------------------------------- */
-
-    int ordering ;	/* ordering method used */
-
-    int is_ll ;		/* TRUE if LL', FALSE if LDL' */
-    int is_super ;	/* TRUE if supernodal, FALSE if simplicial */
-    int is_monotonic ;	/* TRUE if columns of L appear in order 0..n-1.
-			 * Only applicable to simplicial numeric types. */
-
-    /* There are 8 types of factor objects that cholmod_factor can represent
-     * (only 6 are used):
-     *
-     * Numeric types (xtype is not CHOLMOD_PATTERN)
-     * --------------------------------------------
-     *
-     * simplicial LDL':  (is_ll FALSE, is_super FALSE).  Stored in compressed
-     *	    column form, using the simplicial components above (nzmax, p, i,
-     *	    x, z, nz, next, and prev).  The unit diagonal of L is not stored,
-     *	    and D is stored in its place.  There are no supernodes.
-     *
-     * simplicial LL': (is_ll TRUE, is_super FALSE).  Uses the same storage
-     *	    scheme as the simplicial LDL', except that D does not appear.
-     *	    The first entry of each column of L is the diagonal entry of
-     *	    that column of L.
-     *
-     * supernodal LDL': (is_ll FALSE, is_super TRUE).  Not used.
-     *	    FUTURE WORK:  add support for supernodal LDL'
-     *
-     * supernodal LL': (is_ll TRUE, is_super TRUE).  A supernodal factor,
-     *	    using the supernodal components described above (nsuper, ssize,
-     *	    xsize, maxcsize, maxesize, super, pi, px, s, x, and z).
-     *
-     *
-     * Symbolic types (xtype is CHOLMOD_PATTERN)
-     * -----------------------------------------
-     *
-     * simplicial LDL': (is_ll FALSE, is_super FALSE).  Nothing is present
-     *	    except Perm and ColCount.
-     *
-     * simplicial LL': (is_ll TRUE, is_super FALSE).  Identical to the
-     *	    simplicial LDL', except for the is_ll flag.
-     *
-     * supernodal LDL': (is_ll FALSE, is_super TRUE).  Not used.
-     *	    FUTURE WORK:  add support for supernodal LDL'
-     *
-     * supernodal LL': (is_ll TRUE, is_super TRUE).  A supernodal symbolic
-     *	    factorization.  The simplicial symbolic information is present
-     *	    (Perm and ColCount), as is all of the supernodal factorization
-     *	    except for the numerical values (x and z).
-     */
-
-    int itype ; /* The integer arrays are Perm, ColCount, p, i, nz,
-                 * next, prev, super, pi, px, and s.  If itype is
-		 * CHOLMOD_INT, all of these are int arrays.
-		 * CHOLMOD_INTLONG: p, pi, px are SuiteSparse_long, others int.
-		 * CHOLMOD_LONG:    all integer arrays are SuiteSparse_long. */
-    int xtype ; /* pattern, real, complex, or zomplex */
-    int dtype ; /* x and z double or float */
-
-    int useGPU; /* Indicates the symbolic factorization supports
-		 * GPU acceleration */
-
-} cholmod_factor ;
-
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_allocate_factor: allocate a factor (symbolic LL' or LDL') */
-/* -------------------------------------------------------------------------- */
-
-cholmod_factor *cholmod_allocate_factor
-(
-    /* ---- input ---- */
-    size_t n,		/* L is n-by-n */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_factor *cholmod_l_allocate_factor (size_t, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_free_factor:  free a factor */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_free_factor
-(
-    /* ---- in/out --- */
-    cholmod_factor **L,	/* factor to free, NULL on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_free_factor (cholmod_factor **, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_reallocate_factor:  change the # entries in a factor */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_reallocate_factor
-(
-    /* ---- input ---- */
-    size_t nznew,	/* new # of entries in L */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_reallocate_factor (size_t, cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_change_factor:  change the type of factor (e.g., LDL' to LL') */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_change_factor
-(
-    /* ---- input ---- */
-    int to_xtype,	/* to CHOLMOD_PATTERN, _REAL, _COMPLEX, _ZOMPLEX */
-    int to_ll,		/* TRUE: convert to LL', FALSE: LDL' */
-    int to_super,	/* TRUE: convert to supernodal, FALSE: simplicial */
-    int to_packed,	/* TRUE: pack simplicial columns, FALSE: do not pack */
-    int to_monotonic,	/* TRUE: put simplicial columns in order, FALSE: not */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_change_factor ( int, int, int, int, int, cholmod_factor *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_pack_factor:  pack the columns of a factor */
-/* -------------------------------------------------------------------------- */
-
-/* Pack the columns of a simplicial factor.  Unlike cholmod_change_factor,
- * it can pack the columns of a factor even if they are not stored in their
- * natural order (non-monotonic). */
-
-int cholmod_pack_factor
-(
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_pack_factor (cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_reallocate_column:  resize a single column of a factor */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_reallocate_column
-(
-    /* ---- input ---- */
-    size_t j,		/* the column to reallocate */
-    size_t need,	/* required size of column j */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_reallocate_column (size_t, size_t, cholmod_factor *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_factor_to_sparse:  create a sparse matrix copy of a factor */
-/* -------------------------------------------------------------------------- */
-
-/* Only operates on numeric factors, not symbolic ones */
-
-cholmod_sparse *cholmod_factor_to_sparse
-(
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to copy, converted to symbolic on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_factor_to_sparse (cholmod_factor *,
-	cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_copy_factor:  create a copy of a factor */
-/* -------------------------------------------------------------------------- */
-
-cholmod_factor *cholmod_copy_factor
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to copy */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_factor *cholmod_l_copy_factor (cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_factor_xtype: change the xtype of a factor */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_factor_xtype
-(
-    /* ---- input ---- */
-    int to_xtype,	/* requested xtype (real, complex, or zomplex) */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to change */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_factor_xtype (int, cholmod_factor *, cholmod_common *) ;
-
-
-/* ========================================================================== */
-/* === Core/cholmod_dense =================================================== */
-/* ========================================================================== */
-
-/* A dense matrix in column-oriented form.  It has no itype since it contains
- * no integers.  Entry in row i and column j is located in x [i+j*d].
- */
-
-typedef struct cholmod_dense_struct
-{
-    size_t nrow ;	/* the matrix is nrow-by-ncol */
-    size_t ncol ;
-    size_t nzmax ;	/* maximum number of entries in the matrix */
-    size_t d ;		/* leading dimension (d >= nrow must hold) */
-    void *x ;		/* size nzmax or 2*nzmax, if present */
-    void *z ;		/* size nzmax, if present */
-    int xtype ;		/* pattern, real, complex, or zomplex */
-    int dtype ;		/* x and z double or float */
-
-} cholmod_dense ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_allocate_dense:  allocate a dense matrix (contents uninitialized) */
-/* -------------------------------------------------------------------------- */
-
-cholmod_dense *cholmod_allocate_dense
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    size_t d,		/* leading dimension */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_allocate_dense (size_t, size_t, size_t, int,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_zeros: allocate a dense matrix and set it to zero */
-/* -------------------------------------------------------------------------- */
-
-cholmod_dense *cholmod_zeros
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_zeros (size_t, size_t, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_ones: allocate a dense matrix and set it to all ones */
-/* -------------------------------------------------------------------------- */
-
-cholmod_dense *cholmod_ones
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_ones (size_t, size_t, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_eye: allocate a dense matrix and set it to the identity matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_dense *cholmod_eye
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_eye (size_t, size_t, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_free_dense:  free a dense matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_free_dense
-(
-    /* ---- in/out --- */
-    cholmod_dense **X,	/* dense matrix to deallocate, NULL on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_free_dense (cholmod_dense **, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_ensure_dense:  ensure a dense matrix has a given size and type */
-/* -------------------------------------------------------------------------- */
-
-cholmod_dense *cholmod_ensure_dense
-(
-    /* ---- input/output ---- */
-    cholmod_dense **XHandle,    /* matrix handle to check */
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of matrix */
-    size_t ncol,	/* # of columns of matrix */
-    size_t d,		/* leading dimension */
-    int xtype,		/* CHOLMOD_REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_ensure_dense (cholmod_dense **, size_t, size_t, size_t,
-    int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_sparse_to_dense:  create a dense matrix copy of a sparse matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_dense *cholmod_sparse_to_dense
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_sparse_to_dense (cholmod_sparse *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_dense_to_sparse:  create a sparse matrix copy of a dense matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_dense_to_sparse
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to copy */
-    int values,		/* TRUE if values to be copied, FALSE otherwise */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_dense_to_sparse (cholmod_dense *, int,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_copy_dense:  create a copy of a dense matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_dense *cholmod_copy_dense
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_dense *cholmod_l_copy_dense (cholmod_dense *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_copy_dense2:  copy a dense matrix (pre-allocated) */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_copy_dense2
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to copy */
-    /* ---- output --- */
-    cholmod_dense *Y,	/* copy of matrix X */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_copy_dense2 (cholmod_dense *, cholmod_dense *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_dense_xtype: change the xtype of a dense matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_dense_xtype
-(
-    /* ---- input ---- */
-    int to_xtype,	/* requested xtype (real, complex,or zomplex) */
-    /* ---- in/out --- */
-    cholmod_dense *X,	/* dense matrix to change */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_dense_xtype (int, cholmod_dense *, cholmod_common *) ;
-
-
-/* ========================================================================== */
-/* === Core/cholmod_triplet ================================================= */
-/* ========================================================================== */
-
-/* A sparse matrix stored in triplet form. */
-
-typedef struct cholmod_triplet_struct
-{
-    size_t nrow ;	/* the matrix is nrow-by-ncol */
-    size_t ncol ;
-    size_t nzmax ;	/* maximum number of entries in the matrix */
-    size_t nnz ;	/* number of nonzeros in the matrix */
-
-    void *i ;		/* i [0..nzmax-1], the row indices */
-    void *j ;		/* j [0..nzmax-1], the column indices */
-    void *x ;		/* size nzmax or 2*nzmax, if present */
-    void *z ;		/* size nzmax, if present */
-
-    int stype ;		/* Describes what parts of the matrix are considered:
-			 *
-	* 0:  matrix is "unsymmetric": use both upper and lower triangular parts
-	*     (the matrix may actually be symmetric in pattern and value, but
-	*     both parts are explicitly stored and used).  May be square or
-	*     rectangular.
-	* >0: matrix is square and symmetric.  Entries in the lower triangular
-	*     part are transposed and added to the upper triangular part when
-	*     the matrix is converted to cholmod_sparse form.
-	* <0: matrix is square and symmetric.  Entries in the upper triangular
-	*     part are transposed and added to the lower triangular part when
-	*     the matrix is converted to cholmod_sparse form.
-	*
-	* Note that stype>0 and stype<0 are different for cholmod_sparse and
-	* cholmod_triplet.  The reason is simple.  You can permute a symmetric
-	* triplet matrix by simply replacing a row and column index with their
-	* new row and column indices, via an inverse permutation.  Suppose
-	* P = L->Perm is your permutation, and Pinv is an array of size n.
-	* Suppose a symmetric matrix A is represent by a triplet matrix T, with
-	* entries only in the upper triangular part.  Then the following code:
-	*
-	*	Ti = T->i ;
-	*	Tj = T->j ;
-	*	for (k = 0 ; k < n  ; k++) Pinv [P [k]] = k ;
-	*	for (k = 0 ; k < nz ; k++) Ti [k] = Pinv [Ti [k]] ;
-	*	for (k = 0 ; k < nz ; k++) Tj [k] = Pinv [Tj [k]] ;
-	*
-	* creates the triplet form of C=P*A*P'.  However, if T initially
-	* contains just the upper triangular entries (T->stype = 1), after
-	* permutation it has entries in both the upper and lower triangular
-	* parts.  These entries should be transposed when constructing the
-	* cholmod_sparse form of A, which is what cholmod_triplet_to_sparse
-	* does.  Thus:
-	*
-	*	C = cholmod_triplet_to_sparse (T, 0, &Common) ;
-	*
-	* will return the matrix C = P*A*P'.
-	*
-	* Since the triplet matrix T is so simple to generate, it's quite easy
-	* to remove entries that you do not want, prior to converting T to the
-	* cholmod_sparse form.  So if you include these entries in T, CHOLMOD
-	* assumes that there must be a reason (such as the one above).  Thus,
-	* no entry in a triplet matrix is ever ignored.
-	*/
-
-    int itype ; /* CHOLMOD_LONG: i and j are SuiteSparse_long.  Otherwise int */
-    int xtype ; /* pattern, real, complex, or zomplex */
-    int dtype ; /* x and z are double or float */
-
-} cholmod_triplet ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_allocate_triplet:  allocate a triplet matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_triplet *cholmod_allocate_triplet
-(
-    /* ---- input ---- */
-    size_t nrow,	/* # of rows of T */
-    size_t ncol,	/* # of columns of T */
-    size_t nzmax,	/* max # of nonzeros of T */
-    int stype,		/* stype of T */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_triplet *cholmod_l_allocate_triplet (size_t, size_t, size_t, int, int,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_free_triplet:  free a triplet matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_free_triplet
-(
-    /* ---- in/out --- */
-    cholmod_triplet **T,    /* triplet matrix to deallocate, NULL on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_free_triplet (cholmod_triplet **, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_reallocate_triplet:  change the # of entries in a triplet matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_reallocate_triplet
-(
-    /* ---- input ---- */
-    size_t nznew,	/* new # of entries in T */
-    /* ---- in/out --- */
-    cholmod_triplet *T,	/* triplet matrix to modify */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_reallocate_triplet (size_t, cholmod_triplet *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_sparse_to_triplet:  create a triplet matrix copy of a sparse matrix*/
-/* -------------------------------------------------------------------------- */
-
-cholmod_triplet *cholmod_sparse_to_triplet
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_triplet *cholmod_l_sparse_to_triplet (cholmod_sparse *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_triplet_to_sparse:  create a sparse matrix copy of a triplet matrix*/
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_triplet_to_sparse
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* matrix to copy */
-    size_t nzmax,	/* allocate at least this much space in output matrix */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_triplet_to_sparse (cholmod_triplet *, size_t,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_copy_triplet:  create a copy of a triplet matrix */
-/* -------------------------------------------------------------------------- */
-
-cholmod_triplet *cholmod_copy_triplet
-(
-    /* ---- input ---- */
-    cholmod_triplet *T,	/* matrix to copy */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_triplet *cholmod_l_copy_triplet (cholmod_triplet *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_triplet_xtype: change the xtype of a triplet matrix */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_triplet_xtype
-(
-    /* ---- input ---- */
-    int to_xtype,	/* requested xtype (pattern, real, complex,or zomplex)*/
-    /* ---- in/out --- */
-    cholmod_triplet *T,	/* triplet matrix to change */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_triplet_xtype (int, cholmod_triplet *, cholmod_common *) ;
-
-
-/* ========================================================================== */
-/* === Core/cholmod_memory ================================================== */
-/* ========================================================================== */
-
-/* The user may make use of these, just like malloc and free.  You can even
- * malloc an object and safely free it with cholmod_free, and visa versa
- * (except that the memory usage statistics will be corrupted).  These routines
- * do differ from malloc and free.  If cholmod_free is given a NULL pointer,
- * for example, it does nothing (unlike the ANSI free).  cholmod_realloc does
- * not return NULL if given a non-NULL pointer and a nonzero size, even if it
- * fails (it returns the original pointer and sets an error code in
- * Common->status instead).
- *
- * CHOLMOD keeps track of the amount of memory it has allocated, and so the
- * cholmod_free routine also takes the size of the object being freed.  This
- * is only used for statistics.  If you, the user of CHOLMOD, pass the wrong
- * size, the only consequence is that the memory usage statistics will be
- * corrupted.
- */
-
-void *cholmod_malloc	/* returns pointer to the newly malloc'd block */
-(
-    /* ---- input ---- */
-    size_t n,		/* number of items */
-    size_t size,	/* size of each item */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-void *cholmod_l_malloc (size_t, size_t, cholmod_common *) ;
-
-void *cholmod_calloc	/* returns pointer to the newly calloc'd block */
-(
-    /* ---- input ---- */
-    size_t n,		/* number of items */
-    size_t size,	/* size of each item */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-void *cholmod_l_calloc (size_t, size_t, cholmod_common *) ;
-
-void *cholmod_free	/* always returns NULL */
-(
-    /* ---- input ---- */
-    size_t n,		/* number of items */
-    size_t size,	/* size of each item */
-    /* ---- in/out --- */
-    void *p,		/* block of memory to free */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-void *cholmod_l_free (size_t, size_t, void *, cholmod_common *) ;
-
-void *cholmod_realloc	/* returns pointer to reallocated block */
-(
-    /* ---- input ---- */
-    size_t nnew,	/* requested # of items in reallocated block */
-    size_t size,	/* size of each item */
-    /* ---- in/out --- */
-    void *p,		/* block of memory to realloc */
-    size_t *n,		/* current size on input, nnew on output if successful*/
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-void *cholmod_l_realloc (size_t, size_t, void *, size_t *, cholmod_common *) ;
-
-int cholmod_realloc_multiple
-(
-    /* ---- input ---- */
-    size_t nnew,	/* requested # of items in reallocated blocks */
-    int nint,		/* number of int/SuiteSparse_long blocks */
-    int xtype,		/* CHOLMOD_PATTERN, _REAL, _COMPLEX, or _ZOMPLEX */
-    /* ---- in/out --- */
-    void **Iblock,	/* int or SuiteSparse_long block */
-    void **Jblock,	/* int or SuiteSparse_long block */
-    void **Xblock,	/* complex, double, or float block */
-    void **Zblock,	/* zomplex case only: double or float block */
-    size_t *n,		/* current size of the I,J,X,Z blocks on input,
-			 * nnew on output if successful */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_realloc_multiple (size_t, int, int, void **, void **, void **,
-    void **, size_t *, cholmod_common *) ;
-
-/* ========================================================================== */
-/* === version control ====================================================== */
-/* ========================================================================== */
-
-int cholmod_version     /* returns CHOLMOD_VERSION */
-(
-    /* output, contents not defined on input.  Not used if NULL.
-        version [0] = CHOLMOD_MAIN_VERSION
-        version [1] = CHOLMOD_SUB_VERSION
-        version [2] = CHOLMOD_SUBSUB_VERSION
-    */
-    int version [3]
-) ;
-
-int cholmod_l_version (int version [3]) ;
-
-/* Versions prior to 2.1.1 do not have the above function.  The following
-   code fragment will work with any version of CHOLMOD:
-   #ifdef CHOLMOD_HAS_VERSION_FUNCTION
-   v = cholmod_version (NULL) ;
-   #else
-   v = CHOLMOD_VERSION ;
-   #endif
-*/
-
-/* ========================================================================== */
-/* === symmetry types ======================================================= */
-/* ========================================================================== */
-
-#define CHOLMOD_MM_RECTANGULAR 1
-#define CHOLMOD_MM_UNSYMMETRIC 2
-#define CHOLMOD_MM_SYMMETRIC 3
-#define CHOLMOD_MM_HERMITIAN 4
-#define CHOLMOD_MM_SKEW_SYMMETRIC 5
-#define CHOLMOD_MM_SYMMETRIC_POSDIAG 6
-#define CHOLMOD_MM_HERMITIAN_POSDIAG 7
-
-/* ========================================================================== */
-/* === Numerical relop macros =============================================== */
-/* ========================================================================== */
-
-/* These macros correctly handle the NaN case.
- *
- *  CHOLMOD_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 C89).  It may appear in <math.h>, 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.
- *
- *  CHOLMOD_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.
- *
- *  CHOLMOD_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.
- *
- *  CHOLMOD_IS_LT_ZERO(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.
- *
- *  CHOLMOD_IS_GT_ZERO(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.
- *
- *  CHOLMOD_IS_LE_ZERO(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.
- */
-
-#ifdef CHOLMOD_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 CHOLMOD_IS_NAN(x)	(((x) != (x)) || (((x) < (x))))
-#define CHOLMOD_IS_ZERO(x)	(((x) == 0.) && !CHOLMOD_IS_NAN(x))
-#define CHOLMOD_IS_NONZERO(x)	(((x) != 0.) || CHOLMOD_IS_NAN(x))
-#define CHOLMOD_IS_LT_ZERO(x)	(((x) < 0.) && !CHOLMOD_IS_NAN(x))
-#define CHOLMOD_IS_GT_ZERO(x)	(((x) > 0.) && !CHOLMOD_IS_NAN(x))
-#define CHOLMOD_IS_LE_ZERO(x)	(((x) <= 0.) && !CHOLMOD_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 CHOLMOD_IS_NAN(x)	((x) != (x))
-#define CHOLMOD_IS_ZERO(x)	((x) == 0.)
-#define CHOLMOD_IS_NONZERO(x)	((x) != 0.)
-#define CHOLMOD_IS_LT_ZERO(x)	((x) < 0.)
-#define CHOLMOD_IS_GT_ZERO(x)	((x) > 0.)
-#define CHOLMOD_IS_LE_ZERO(x)	((x) <= 0.)
-
-#endif
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_function.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_function.h
deleted file mode 100644
index aec275e..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_function.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/* ========================================================================== */
-/* === CHOLMOD/Include/cholmod_function.h ================================ */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_function.h
- * Copyright (C) 2014, Timothy A. Davis
- * This specific file (CHOLMOD/Include/cholmod_function.h) has no license
- * restrictions at all.  You may freely include this in your applications, and
- * modify it at will.
- * -------------------------------------------------------------------------- */
-
-/* Memory management, printing, and math function pointers were removed from
-   the CHOLMOD Common struct as of version 2.2.0 and later.  They now appear in
-   SuiteSparse_config.h instead.  This file assists in backward compatibility,
-   so that you can use either old or new versions of CHOLMOD and SuiteSparse in
-   an application that uses the function pointers.  You can copy the file into
-   your own application that uses older versions of CHOLMOD, or the current
-   version, so that you have a transparent method for setting these function
-   pointers for any version of CHOLMOD and SuiteSparse.
-
-   In both old and new versions of CHOLMOD (and SuiteSparse), the intent of
-   these function pointers is that they are not to be called directly.
-   Instead, you should use (for example), the cholmod_malloc function.  That
-   function is a wrapper that then uses the cc->malloc_memory or
-   SuiteSparse_config.malloc_func function pointers.
-
-   In each of the macros below, 'cc' is a pointer to the CHOLMOD Common struct. 
-
-   Usage:  to assign, say, 'malloc' as your memory allocator, use this:
-
-        #include "cholmod_function.h"
-        ...
-        cholmod_common *cc, Common ;
-        cc = &Common ;
-        cholmod_start (cc) ;
-        ...
-        CHOLMOD_FUNCTION_DEFAULTS ;
-        CHOLMOD_FUNCTION_MALLOC (cc) = mymalloc ;
-
-    instead of this, in older versions of CHOLMOD:
-
-        cc->malloc_memory = mymalloc ;
-
-    or in newer versions of CHOLMOD:
-
-        SuiteSparse_config.malloc_func = mymalloc ;
-*/
-
-#ifndef CHOLMOD_FUNCTION_H
-#define CHOLMOD_FUNCTION_H
-
-#include "cholmod.h"
-
-/* -------------------------------------------------------------------------- */
-/* location of function pointers, depending on the CHOLMOD version */
-/* -------------------------------------------------------------------------- */
-
-#if (CHOLMOD_VERSION < (CHOLMOD_VER_CODE(2,2)))
-
-    #define CHOLMOD_FUNCTION_MALLOC(cc)     cc->malloc_memory
-    #define CHOLMOD_FUNCTION_REALLOC(cc)    cc->realloc_memory
-    #define CHOLMOD_FUNCTION_FREE(cc)       cc->free_memory
-    #define CHOLMOD_FUNCTION_CALLOC(cc)     cc->calloc_memory
-    #define CHOLMOD_FUNCTION_PRINTF(cc)     cc->print_function
-    #define CHOLMOD_FUNCTION_DIVCOMPLEX(cc) cc->complex_divide
-    #define CHOLMOD_FUNCTION_HYPOTENUSE(cc) cc->hypotenuse
-
-#else
-
-    #include "SuiteSparse_config.h"
-    #define CHOLMOD_FUNCTION_MALLOC(cc)     SuiteSparse_config.malloc_func
-    #define CHOLMOD_FUNCTION_REALLOC(cc)    SuiteSparse_config.realloc_func
-    #define CHOLMOD_FUNCTION_FREE(cc)       SuiteSparse_config.free_func
-    #define CHOLMOD_FUNCTION_CALLOC(cc)     SuiteSparse_config.calloc_func
-    #define CHOLMOD_FUNCTION_PRINTF(cc)     SuiteSparse_config.printf_func
-    #define CHOLMOD_FUNCTION_DIVCOMPLEX(cc) SuiteSparse_config.divcomplex_func
-    #define CHOLMOD_FUNCTION_HYPOTENUSE(cc) SuiteSparse_config.hypot_func
-
-#endif
-
-/* -------------------------------------------------------------------------- */
-/* default math functions, depending on the CHOLMOD version */
-/* -------------------------------------------------------------------------- */
-
-#if (CHOLMOD_VERSION < (CHOLMOD_VER_CODE(2,2)))
-
-    #define CHOLMOD_FUNCTION_DEFAULT_DIVCOMPLEX cholmod_l_divcomplex
-    #define CHOLMOD_FUNCTION_DEFAULT_HYPOTENUSE cholmod_l_hypot
-
-#else
-
-    #define CHOLMOD_FUNCTION_DEFAULT_DIVCOMPLEX SuiteSparse_divcomplex
-    #define CHOLMOD_FUNCTION_DEFAULT_HYPOTENUSE SuiteSparse_hypot
-
-#endif
-
-/* -------------------------------------------------------------------------- */
-/* default memory manager functions */
-/* -------------------------------------------------------------------------- */
-
-#ifndef NMALLOC
-    #ifdef MATLAB_MEX_FILE
-        /* MATLAB mexFunction */
-        #define CHOLMOD_FUNCTION_DEFAULT_MALLOC  mxMalloc
-        #define CHOLMOD_FUNCTION_DEFAULT_CALLOC  mxCalloc
-        #define CHOLMOD_FUNCTION_DEFAULT_REALLOC mxRealloc
-        #define CHOLMOD_FUNCTION_DEFAULT_FREE    mxFree
-    #else
-        /* standard ANSI C */
-        #define CHOLMOD_FUNCTION_DEFAULT_MALLOC  malloc
-        #define CHOLMOD_FUNCTION_DEFAULT_CALLOC  calloc
-        #define CHOLMOD_FUNCTION_DEFAULT_REALLOC realloc
-        #define CHOLMOD_FUNCTION_DEFAULT_FREE    free
-    #endif
-#else
-    /* no memory manager defined at compile time */
-    #define CHOLMOD_FUNCTION_DEFAULT_MALLOC  NULL
-    #define CHOLMOD_FUNCTION_DEFAULT_CALLOC  NULL
-    #define CHOLMOD_FUNCTION_DEFAULT_REALLOC NULL
-    #define CHOLMOD_FUNCTION_DEFAULT_FREE    NULL
-#endif
-
-/* -------------------------------------------------------------------------- */
-/* default printf function */
-/* -------------------------------------------------------------------------- */
-
-#ifdef MATLAB_MEX_FILE
-    #define CHOLMOD_FUNCTION_DEFAULT_PRINTF mexPrintf
-#else
-    #define CHOLMOD_FUNCTION_DEFAULT_PRINTF printf
-#endif
-
-/* -------------------------------------------------------------------------- */
-/* set all the defaults */
-/* -------------------------------------------------------------------------- */
-
-/* Use this macro to initialize all the function pointers to their defaults 
-   for any version of CHOLMOD.  For CHOLMD 2.2.0 and later, it sets function
-   pointers in the SuiteSparse_config struct.  For older versions, it sets
-   function pointers in the CHOLMOD Common.  This assignment is not
-   thread-safe, and should be done before launching any threads. */
-
-#define CHOLMOD_FUNCTION_DEFAULTS \
-{ \
-    CHOLMOD_FUNCTION_MALLOC (cc)     = CHOLMOD_FUNCTION_DEFAULT_MALLOC ; \
-    CHOLMOD_FUNCTION_REALLOC (cc)    = CHOLMOD_FUNCTION_DEFAULT_REALLOC ; \
-    CHOLMOD_FUNCTION_FREE (cc)       = CHOLMOD_FUNCTION_DEFAULT_FREE ; \
-    CHOLMOD_FUNCTION_CALLOC (cc)     = CHOLMOD_FUNCTION_DEFAULT_CALLOC ; \
-    CHOLMOD_FUNCTION_PRINTF (cc)     = CHOLMOD_FUNCTION_DEFAULT_PRINTF ; \
-    CHOLMOD_FUNCTION_DIVCOMPLEX (cc) = CHOLMOD_FUNCTION_DEFAULT_DIVCOMPLEX ; \
-    CHOLMOD_FUNCTION_HYPOTENUSE (cc) = CHOLMOD_FUNCTION_DEFAULT_HYPOTENUSE ; \
-}
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_gpu.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_gpu.h
deleted file mode 100644
index d34f174..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_gpu.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_gpu.h ================================================ */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_gpu.h.
- * Copyright (C) 2014, Timothy A. Davis
- * CHOLMOD/Include/cholmod_gpu.h and the CHOLMOD GPU Module are 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
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD GPU module
- */
-
-#ifndef CHOLMOD_GPU_H
-#define CHOLMOD_GPU_H
-
-#ifdef GPU_BLAS
-#include "omp.h"
-#include <fenv.h>
-#endif
-
-/* CHOLMOD_GPU_PRINTF: for printing GPU debug error messages */
-/*
-#define CHOLMOD_GPU_PRINTF(args) printf args
-*/
-#define CHOLMOD_GPU_PRINTF(args)
-
-/* define supernode requirements for processing on GPU */
-#define CHOLMOD_ND_ROW_LIMIT 256 /* required descendant rows */
-#define CHOLMOD_ND_COL_LIMIT 32  /* required descendnat cols */
-#define CHOLMOD_POTRF_LIMIT  512  /* required cols for POTRF & TRSM on GPU */
-
-/* # of host supernodes to perform before checking for free pinned buffers */
-#define CHOLMOD_GPU_SKIP     3    
-
-#define CHOLMOD_HANDLE_CUDA_ERROR(e,s) {if (e) {ERROR(CHOLMOD_GPU_PROBLEM,s);}}
-
-typedef struct cholmod_gpu_pointers
-{
-    double *h_Lx [CHOLMOD_HOST_SUPERNODE_BUFFERS] ;
-    double *d_Lx [CHOLMOD_DEVICE_STREAMS] ;
-    double *d_C ;
-    double *d_A [CHOLMOD_DEVICE_STREAMS] ;
-    void   *d_Ls ;
-    void   *d_Map ;
-    void   *d_RelativeMap ;
-
-} cholmod_gpu_pointers ;
-
-int cholmod_gpu_memorysize   /* GPU memory size available, 1 if no GPU */
-(
-    size_t         *total_mem,
-    size_t         *available_mem,
-    cholmod_common *Common
-) ;
-
-int cholmod_l_gpu_memorysize /* GPU memory size available, 1 if no GPU */
-(
-    size_t         *total_mem,
-    size_t         *available_mem,
-    cholmod_common *Common
-) ;
- 
-int cholmod_gpu_probe   ( cholmod_common *Common ) ;
-int cholmod_l_gpu_probe ( cholmod_common *Common ) ;
-
-int cholmod_gpu_deallocate   ( cholmod_common *Common ) ;
-int cholmod_l_gpu_deallocate ( cholmod_common *Common ) ;
-
-void cholmod_gpu_end   ( cholmod_common *Common ) ;
-void cholmod_l_gpu_end ( cholmod_common *Common ) ;
-
-int cholmod_gpu_allocate   ( cholmod_common *Common ) ;
-int cholmod_l_gpu_allocate ( cholmod_common *Common ) ;
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_gpu_kernels.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_gpu_kernels.h
deleted file mode 100644
index 9fa3d47..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_gpu_kernels.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_gpu_kernels.h ======================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_gpu_kernels.h.
- * Copyright (C) 2014, Timothy A. Davis
- * CHOLMOD/Include/cholmod_gpu.h and the CHOLMOD GPU Module are 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
- * -------------------------------------------------------------------------- */
-
-/* -----------------------------------------------------------------------------
- * CUDA kernel support routines for CHOLMOD
- * -------------------------------------------------------------------------- */
-
-#ifndef CHOLMODGPUKERNELS_H
-#define CHOLMODGPUKERNELS_H
-
-/* make it easy for C++ programs to include CHOLMOD */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "SuiteSparse_config.h"
-
-int createMapOnDevice ( Int *d_Map, Int *d_Ls, Int psi, Int nsrow ); 
-
-int createRelativeMapOnDevice ( Int *d_Map, Int *d_Ls, Int *d_RelativeMap,
-                           Int pdi1, Int ndrow, cudaStream_t astream ); 
-
-int addUpateOnDevice ( double *d_A, double *devPtrC, Int *d_RelativeMap,
-    Int ndrow1, Int ndrow2, Int nsrow, cudaStream_t astream );
-
-int addComplexUpateOnDevice ( double *d_A, double *devPtrC, Int *d_RelativeMap,
-    Int ndrow1, Int ndrow2, Int nsrow, cudaStream_t astream );
-
-int sumAOnDevice ( double *a1, double *a2, const double alpha, int nsrow,
-    int nscol );
-
-int sumComplexAOnDevice ( double *a1, double *a2, const double alpha,
-    int nsrow, int nscol );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_internal.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_internal.h
deleted file mode 100644
index 0cef5f9..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_internal.h
+++ /dev/null
@@ -1,379 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_internal.h =========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_internal.h.
- * Copyright (C) 2005-2013, Univ. of Florida.  Author: Timothy A. Davis
- * CHOLMOD/Include/cholmod_internal.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD internal include file.
- *
- * This file contains internal definitions for CHOLMOD, not meant to be included
- * in user code.  They define macros that are not prefixed with CHOLMOD_.  This
- * file can safely #include'd in user code if you want to make use of the
- * macros defined here, and don't mind the possible name conflicts with your
- * code, however.
- *
- * Required by all CHOLMOD routines.  Not required by any user routine that
- * uses CHOLMOMD.  Unless debugging is enabled, this file does not require any
- * CHOLMOD module (not even the Core module).
- *
- * If debugging is enabled, all CHOLMOD modules require the Check module.
- * Enabling debugging requires that this file be editted.  Debugging cannot be
- * enabled with a compiler flag.  This is because CHOLMOD is exceedingly slow
- * when debugging is enabled.  Debugging is meant for development of CHOLMOD
- * itself, not by users of CHOLMOD.
- */
-
-#ifndef CHOLMOD_INTERNAL_H
-#define CHOLMOD_INTERNAL_H
-
-/* ========================================================================== */
-/* === large file I/O ======================================================= */
-/* ========================================================================== */
-
-/* Definitions for large file I/O must come before any other #includes.  If
- * this causes problems (may not be portable to all platforms), then compile
- * CHOLMOD with -DNLARGEFILE.  You must do this for MATLAB 6.5 and earlier,
- * for example. */
-
-#include "cholmod_io64.h"
-
-/* ========================================================================== */
-/* === debugging and basic includes ========================================= */
-/* ========================================================================== */
-
-/* turn off debugging */
-#ifndef NDEBUG
-#define NDEBUG
-#endif
-
-/* Uncomment this line to enable debugging.  CHOLMOD will be very slow.
-#undef NDEBUG
- */
-
-#ifdef MATLAB_MEX_FILE
-#include "mex.h"
-#endif
-
-#if !defined(NPRINT) || !defined(NDEBUG)
-#include <stdio.h>
-#endif
-
-#include <stddef.h>
-#include <math.h>
-#include <limits.h>
-#include <float.h>
-#include <stdlib.h>
-
-/* ========================================================================== */
-/* === basic definitions ==================================================== */
-/* ========================================================================== */
-
-/* Some non-conforming compilers insist on defining TRUE and FALSE. */
-#undef TRUE
-#undef FALSE
-#define TRUE 1
-#define FALSE 0
-#define BOOLEAN(x) ((x) ? TRUE : FALSE)
-
-/* NULL should already be defined, but ensure it is here. */
-#ifndef NULL
-#define NULL ((void *) 0)
-#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))
-
-/* MAX and MIN are not safe to use for NaN's */
-#define MAX(a,b) (((a) > (b)) ? (a) : (b))
-#define MAX3(a,b,c) (((a) > (b)) ? (MAX (a,c)) : (MAX (b,c)))
-#define MAX4(a,b,c,d) (((a) > (b)) ? (MAX3 (a,c,d)) : (MAX3 (b,c,d)))
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-#define IMPLIES(p,q) (!(p) || (q))
-
-/* find the sign: -1 if x < 0, 1 if x > 0, zero otherwise.
- * Not safe for NaN's */
-#define SIGN(x) (((x) < 0) ? (-1) : (((x) > 0) ? 1 : 0))
-
-/* round up an integer x to a multiple of s */
-#define ROUNDUP(x,s) ((s) * (((x) + ((s) - 1)) / (s)))
-
-#define ERROR(status,msg) \
-    CHOLMOD(error) (status, __FILE__, __LINE__, msg, Common)
-
-/* Check a pointer and return if null.  Set status to invalid, unless the
- * status is already "out of memory" */
-#define RETURN_IF_NULL(A,result) \
-{ \
-    if ((A) == NULL) \
-    { \
-	if (Common->status != CHOLMOD_OUT_OF_MEMORY) \
-	{ \
-	    ERROR (CHOLMOD_INVALID, "argument missing") ; \
-	} \
-	return (result) ; \
-    } \
-}
-
-/* Return if Common is NULL or invalid */
-#define RETURN_IF_NULL_COMMON(result) \
-{ \
-    if (Common == NULL) \
-    { \
-	return (result) ; \
-    } \
-    if (Common->itype != ITYPE || Common->dtype != DTYPE) \
-    { \
-	Common->status = CHOLMOD_INVALID ; \
-	return (result) ; \
-    } \
-}
-
-#define IS_NAN(x)	CHOLMOD_IS_NAN(x)
-#define IS_ZERO(x)	CHOLMOD_IS_ZERO(x)
-#define IS_NONZERO(x)	CHOLMOD_IS_NONZERO(x)
-#define IS_LT_ZERO(x)	CHOLMOD_IS_LT_ZERO(x)
-#define IS_GT_ZERO(x)	CHOLMOD_IS_GT_ZERO(x)
-#define IS_LE_ZERO(x)	CHOLMOD_IS_LE_ZERO(x)
-
-/* 1e308 is a huge number that doesn't take many characters to print in a
- * file, in CHOLMOD/Check/cholmod_read and _write.  Numbers larger than this
- * are interpretted as Inf, since sscanf doesn't read in Inf's properly.
- * This assumes IEEE double precision arithmetic.  DBL_MAX would be a little
- * better, except that it takes too many digits to print in a file. */
-#define HUGE_DOUBLE 1e308
-
-/* ========================================================================== */
-/* === int/long and double/float definitions ================================ */
-/* ========================================================================== */
-
-/* CHOLMOD is designed for 3 types of integer variables:
- *
- *	(1) all integers are int
- *	(2) most integers are int, some are SuiteSparse_long
- *	(3) all integers are SuiteSparse_long
- *
- * and two kinds of floating-point values:
- *
- *	(1) double
- *	(2) float
- *
- * the complex types (ANSI-compatible complex, and MATLAB-compatable zomplex)
- * are based on the double or float type, and are not selected here.  They
- * are typically selected via template routines.
- *
- * This gives 6 different modes in which CHOLMOD can be compiled (only the
- * first two are currently supported):
- *
- *	DINT	double, int			prefix: cholmod_
- *	DLONG	double, SuiteSparse_long	prefix: cholmod_l_
- *	DMIX	double, mixed int/SuiteSparse_long	prefix: cholmod_m_
- *	SINT	float, int			prefix: cholmod_si_
- *	SLONG	float, SuiteSparse_long		prefix: cholmod_sl_
- *	SMIX	float, mixed int/log		prefix: cholmod_sm_
- *
- * These are selected with compile time flags (-DDLONG, for example).  If no
- * flag is selected, the default is DINT.
- *
- * All six versions use the same include files.  The user-visible include files
- * are completely independent of which int/long/double/float version is being
- * used.  The integer / real types in all data structures (sparse, triplet,
- * dense, common, and triplet) are defined at run-time, not compile-time, so
- * there is only one "cholmod_sparse" data type.  Void pointers are used inside
- * that data structure to point to arrays of the proper type.  Each data
- * structure has an itype and dtype field which determines the kind of basic
- * types used.  These are defined in Include/cholmod_core.h.
- *
- * FUTURE WORK: support all six types (float, and mixed int/long)
- *
- * SuiteSparse_long is normally defined as long.  However, for WIN64 it is
- * __int64.  It can also be redefined for other platforms, by modifying
- * SuiteSparse_config.h.
- */
-
-#include "SuiteSparse_config.h"
-
-/* -------------------------------------------------------------------------- */
-/* Size_max: the largest value of size_t */
-/* -------------------------------------------------------------------------- */
-
-#define Size_max ((size_t) (-1))
-
-/* routines for doing arithmetic on size_t, and checking for overflow */
-size_t cholmod_add_size_t (size_t a, size_t b, int *ok) ;
-size_t cholmod_mult_size_t (size_t a, size_t k, int *ok) ;
-size_t cholmod_l_add_size_t (size_t a, size_t b, int *ok) ;
-size_t cholmod_l_mult_size_t (size_t a, size_t k, int *ok) ;
-
-/* -------------------------------------------------------------------------- */
-/* double (also complex double), SuiteSparse_long */
-/* -------------------------------------------------------------------------- */
-
-#ifdef DLONG
-#define Real double
-#define Int SuiteSparse_long
-#define Int_max SuiteSparse_long_max
-#define CHOLMOD(name) cholmod_l_ ## name
-#define LONG
-#define DOUBLE
-#define ITYPE CHOLMOD_LONG
-#define DTYPE CHOLMOD_DOUBLE
-#define ID SuiteSparse_long_id
-
-/* -------------------------------------------------------------------------- */
-/* double (also complex double), int: this is the default */
-/* -------------------------------------------------------------------------- */
-
-#else
-
-#ifndef DINT
-#define DINT
-#endif
-#define INT
-#define DOUBLE
-
-#define Real double
-#define Int int
-#define Int_max INT_MAX
-#define CHOLMOD(name) cholmod_ ## name
-#define ITYPE CHOLMOD_INT
-#define DTYPE CHOLMOD_DOUBLE
-#define ID "%d"
-
-/* GPU acceleration is not available for the int version of CHOLMOD */
-#undef GPU_BLAS
-
-#endif
-
-
-/* ========================================================================== */
-/* === real/complex arithmetic ============================================== */
-/* ========================================================================== */
-
-#include "cholmod_complexity.h"
-
-/* ========================================================================== */
-/* === Architecture and BLAS ================================================ */
-/* ========================================================================== */
-
-#define BLAS_OK Common->blas_ok
-#include "cholmod_blas.h"
-
-/* ========================================================================== */
-/* === debugging definitions ================================================ */
-/* ========================================================================== */
-
-#ifndef NDEBUG
-
-#include <assert.h>
-#include "cholmod.h"
-
-/* The cholmod_dump routines are in the Check module.  No CHOLMOD routine
- * calls the cholmod_check_* or cholmod_print_* routines in the Check module,
- * since they use Common workspace that may already be in use.  Instead, they
- * use the cholmod_dump_* routines defined there, which allocate their own
- * workspace if they need it. */
-
-#ifndef EXTERN
-#define EXTERN extern
-#endif
-
-/* double, int */
-EXTERN int cholmod_dump ;
-EXTERN int cholmod_dump_malloc ;
-SuiteSparse_long cholmod_dump_sparse (cholmod_sparse  *, const char *,
-    cholmod_common *) ;
-int  cholmod_dump_factor (cholmod_factor  *, const char *, cholmod_common *) ;
-int  cholmod_dump_triplet (cholmod_triplet *, const char *, cholmod_common *) ;
-int  cholmod_dump_dense (cholmod_dense   *, const char *, cholmod_common *) ;
-int  cholmod_dump_subset (int *, size_t, size_t, const char *,
-    cholmod_common *) ;
-int  cholmod_dump_perm (int *, size_t, size_t, const char *, cholmod_common *) ;
-int  cholmod_dump_parent (int *, size_t, const char *, cholmod_common *) ;
-void cholmod_dump_init (const char *, cholmod_common *) ;
-int  cholmod_dump_mem (const char *, SuiteSparse_long, cholmod_common *) ;
-void cholmod_dump_real (const char *, Real *, SuiteSparse_long,
-    SuiteSparse_long, int, int, cholmod_common *) ;
-void cholmod_dump_super (SuiteSparse_long, int *, int *, int *, int *, double *,
-    int, cholmod_common *) ;
-int  cholmod_dump_partition (SuiteSparse_long, int *, int *, int *, int *,
-    SuiteSparse_long, cholmod_common *) ;
-int  cholmod_dump_work(int, int, SuiteSparse_long, cholmod_common *) ;
-
-/* double, SuiteSparse_long */
-EXTERN int cholmod_l_dump ;
-EXTERN int cholmod_l_dump_malloc ;
-SuiteSparse_long cholmod_l_dump_sparse (cholmod_sparse  *, const char *,
-    cholmod_common *) ;
-int  cholmod_l_dump_factor (cholmod_factor  *, const char *, cholmod_common *) ;
-int  cholmod_l_dump_triplet (cholmod_triplet *, const char *, cholmod_common *);
-int  cholmod_l_dump_dense (cholmod_dense   *, const char *, cholmod_common *) ;
-int  cholmod_l_dump_subset (SuiteSparse_long *, size_t, size_t, const char *,
-    cholmod_common *) ;
-int  cholmod_l_dump_perm (SuiteSparse_long *, size_t, size_t, const char *,
-    cholmod_common *) ;
-int  cholmod_l_dump_parent (SuiteSparse_long *, size_t, const char *,
-    cholmod_common *) ;
-void cholmod_l_dump_init (const char *, cholmod_common *) ;
-int  cholmod_l_dump_mem (const char *, SuiteSparse_long, cholmod_common *) ;
-void cholmod_l_dump_real (const char *, Real *, SuiteSparse_long,
-    SuiteSparse_long, int, int, cholmod_common *) ;
-void cholmod_l_dump_super (SuiteSparse_long, SuiteSparse_long *,
-    SuiteSparse_long *, SuiteSparse_long *, SuiteSparse_long *,
-    double *, int, cholmod_common *) ;
-int  cholmod_l_dump_partition (SuiteSparse_long, SuiteSparse_long *,
-    SuiteSparse_long *, SuiteSparse_long *,
-    SuiteSparse_long *, SuiteSparse_long, cholmod_common *) ;
-int  cholmod_l_dump_work(int, int, SuiteSparse_long, cholmod_common *) ;
-
-#define DEBUG_INIT(s,Common)  { CHOLMOD(dump_init)(s, Common) ; }
-#define ASSERT(expression) (assert (expression))
-
-#define PRK(k,params) \
-{ \
-    if (CHOLMOD(dump) >= (k) && SuiteSparse_config.printf_func != NULL) \
-    { \
-	(SuiteSparse_config.printf_func) params ; \
-    } \
-}
-
-#define PRINT0(params) PRK (0, params)
-#define PRINT1(params) PRK (1, params)
-#define PRINT2(params) PRK (2, params)
-#define PRINT3(params) PRK (3, params)
-
-#define PRINTM(params) \
-{ \
-    if (CHOLMOD(dump_malloc) > 0) \
-    { \
-	printf params ; \
-    } \
-}
-
-#define DEBUG(statement) statement
-
-#else
-
-/* Debugging disabled (the normal case) */
-#define PRK(k,params)
-#define DEBUG_INIT(s,Common)
-#define PRINT0(params)
-#define PRINT1(params)
-#define PRINT2(params)
-#define PRINT3(params)
-#define PRINTM(params)
-#define ASSERT(expression)
-#define DEBUG(statement)
-#endif
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_io64.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_io64.h
deleted file mode 100644
index 1964418..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_io64.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_io64 ================================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_io64.h.
- * Copyright (C) 2005-2006, Univ. of Florida.  Author: Timothy A. Davis
- * CHOLMOD/Include/cholmod_io64.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* Definitions required for large file I/O, which must come before any other
- * #includes.  These are not used if -DNLARGEFILE is defined at compile time.
- * Large file support may not be portable across all platforms and compilers;
- * if you encounter an error here, compile your code with -DNLARGEFILE.  In
- * particular, you must use -DNLARGEFILE for MATLAB 6.5 or earlier (which does
- * not have the io64.h include file).
- */
-
-#ifndef CHOLMOD_IO_H
-#define CHOLMOD_IO_H
-
-/* skip all of this if NLARGEFILE is defined at the compiler command line */
-#ifndef NLARGEFILE
-
-#if defined(MATLAB_MEX_FILE) || defined(MATHWORKS)
-
-/* CHOLMOD is being compiled as a MATLAB mexFunction, or for use in MATLAB */
-#include "io64.h"
-
-#else
-
-/* CHOLMOD is being compiled in a stand-alone library */
-#undef  _LARGEFILE64_SOURCE
-#define _LARGEFILE64_SOURCE
-#undef  _FILE_OFFSET_BITS
-#define _FILE_OFFSET_BITS 64
-
-#endif
-
-#endif
-
-#endif
-
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_matrixops.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_matrixops.h
deleted file mode 100644
index 7cce7b2..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_matrixops.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_matrixops.h ========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_matrixops.h.
- * Copyright (C) 2005-2006, Timothy A. Davis
- * CHOLMOD/Include/cholmod_matrixops.h 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
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD MatrixOps module.
- *
- * Basic operations on sparse and dense matrices.
- *
- * cholmod_drop		    A = entries in A with abs. value >= tol
- * cholmod_norm_dense	    s = norm (X), 1-norm, inf-norm, or 2-norm
- * cholmod_norm_sparse	    s = norm (A), 1-norm or inf-norm
- * cholmod_horzcat	    C = [A,B]
- * cholmod_scale	    A = diag(s)*A, A*diag(s), s*A or diag(s)*A*diag(s)
- * cholmod_sdmult	    Y = alpha*(A*X) + beta*Y or alpha*(A'*X) + beta*Y
- * cholmod_ssmult	    C = A*B
- * cholmod_submatrix	    C = A (i,j), where i and j are arbitrary vectors
- * cholmod_vertcat	    C = [A ; B]
- *
- * A, B, C: sparse matrices (cholmod_sparse)
- * X, Y: dense matrices (cholmod_dense)
- * s: scalar or vector
- *
- * Requires the Core module.  Not required by any other CHOLMOD module.
- */
-
-#ifndef CHOLMOD_MATRIXOPS_H
-#define CHOLMOD_MATRIXOPS_H
-
-#include "cholmod_core.h"
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_drop:  drop entries with small absolute value */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_drop
-(
-    /* ---- input ---- */
-    double tol,		/* keep entries with absolute value > tol */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix to drop entries from */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_drop (double, cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_norm_dense:  s = norm (X), 1-norm, inf-norm, or 2-norm */
-/* -------------------------------------------------------------------------- */
-
-double cholmod_norm_dense
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to compute the norm of */
-    int norm,		/* type of norm: 0: inf. norm, 1: 1-norm, 2: 2-norm */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-double cholmod_l_norm_dense (cholmod_dense *, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_norm_sparse:  s = norm (A), 1-norm or inf-norm */
-/* -------------------------------------------------------------------------- */
-
-double cholmod_norm_sparse
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to compute the norm of */
-    int norm,		/* type of norm: 0: inf. norm, 1: 1-norm */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-double cholmod_l_norm_sparse (cholmod_sparse *, int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_horzcat:  C = [A,B] */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_horzcat
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* left matrix to concatenate */
-    cholmod_sparse *B,	/* right matrix to concatenate */
-    int values,		/* if TRUE compute the numerical values of C */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_horzcat (cholmod_sparse *, cholmod_sparse *, int,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_scale:  A = diag(s)*A, A*diag(s), s*A or diag(s)*A*diag(s) */
-/* -------------------------------------------------------------------------- */
-
-/* scaling modes, selected by the scale input parameter: */
-#define CHOLMOD_SCALAR 0	/* A = s*A */
-#define CHOLMOD_ROW 1		/* A = diag(s)*A */
-#define CHOLMOD_COL 2		/* A = A*diag(s) */
-#define CHOLMOD_SYM 3		/* A = diag(s)*A*diag(s) */
-
-int cholmod_scale
-(
-    /* ---- input ---- */
-    cholmod_dense *S,	/* scale factors (scalar or vector) */
-    int scale,		/* type of scaling to compute */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix to scale */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_scale (cholmod_dense *, int, cholmod_sparse *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_sdmult:  Y = alpha*(A*X) + beta*Y or alpha*(A'*X) + beta*Y */
-/* -------------------------------------------------------------------------- */
-
-/* Sparse matrix times dense matrix */
-
-int cholmod_sdmult
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* sparse matrix to multiply */
-    int transpose,	/* use A if 0, or A' otherwise */
-    double alpha [2],   /* scale factor for A */
-    double beta [2],    /* scale factor for Y */
-    cholmod_dense *X,	/* dense matrix to multiply */
-    /* ---- in/out --- */
-    cholmod_dense *Y,	/* resulting dense matrix */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_sdmult (cholmod_sparse *, int, double *, double *,
-    cholmod_dense *, cholmod_dense *Y, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_ssmult:  C = A*B */
-/* -------------------------------------------------------------------------- */
-
-/* Sparse matrix times sparse matrix */
-
-cholmod_sparse *cholmod_ssmult
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* left matrix to multiply */
-    cholmod_sparse *B,	/* right matrix to multiply */
-    int stype,		/* requested stype of C */
-    int values,		/* TRUE: do numerical values, FALSE: pattern only */
-    int sorted,		/* if TRUE then return C with sorted columns */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_ssmult (cholmod_sparse *, cholmod_sparse *, int, int,
-    int, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_submatrix:  C = A (r,c), where i and j are arbitrary vectors */
-/* -------------------------------------------------------------------------- */
-
-/* rsize < 0 denotes ":" in MATLAB notation, or more precisely 0:(A->nrow)-1.
- * In this case, r can be NULL.  An rsize of zero, or r = NULL and rsize >= 0,
- * denotes "[ ]" in MATLAB notation (the empty set).
- * Similar rules hold for csize.
- */
-
-cholmod_sparse *cholmod_submatrix
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to subreference */
-    int *rset,		/* set of row indices, duplicates OK */
-    SuiteSparse_long rsize,	/* size of r; rsize < 0 denotes ":" */
-    int *cset,		/* set of column indices, duplicates OK */
-    SuiteSparse_long csize,	/* size of c; csize < 0 denotes ":" */
-    int values,		/* if TRUE compute the numerical values of C */
-    int sorted,		/* if TRUE then return C with sorted columns */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_submatrix (cholmod_sparse *, SuiteSparse_long *,
-    SuiteSparse_long, SuiteSparse_long *, SuiteSparse_long, int, int,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_vertcat:  C = [A ; B] */
-/* -------------------------------------------------------------------------- */
-
-cholmod_sparse *cholmod_vertcat
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* left matrix to concatenate */
-    cholmod_sparse *B,	/* right matrix to concatenate */
-    int values,		/* if TRUE compute the numerical values of C */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-cholmod_sparse *cholmod_l_vertcat (cholmod_sparse *, cholmod_sparse *, int,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_symmetry: determine if a sparse matrix is symmetric */
-/* -------------------------------------------------------------------------- */
-
-int cholmod_symmetry
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,
-    int option,
-    /* ---- output ---- */
-    int *xmatched,
-    int *pmatched,
-    int *nzoffdiag,
-    int *nzdiag,
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_symmetry (cholmod_sparse *, int, SuiteSparse_long *,
-    SuiteSparse_long *, SuiteSparse_long *, SuiteSparse_long *,
-    cholmod_common *) ;
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_modify.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_modify.h
deleted file mode 100644
index 0fd68f8..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_modify.h
+++ /dev/null
@@ -1,327 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_modify.h ============================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_modify.h.
- * Copyright (C) 2005-2006, Timothy A. Davis and William W. Hager
- * CHOLMOD/Include/cholmod_modify.h 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
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD Modify module.
- *
- * Sparse Cholesky modification routines: update / downdate / rowadd / rowdel.
- * Can also modify a corresponding solution to Lx=b when L is modified.  This
- * module is most useful when applied on a Cholesky factorization computed by
- * the Cholesky module, but it does not actually require the Cholesky module.
- * The Core module can create an identity Cholesky factorization (LDL' where
- * L=D=I) that can then by modified by these routines.
- *
- * Primary routines:
- * -----------------
- *
- * cholmod_updown	    multiple rank update/downdate
- * cholmod_rowadd	    add a row to an LDL' factorization
- * cholmod_rowdel	    delete a row from an LDL' factorization
- *
- * Secondary routines:
- * -------------------
- *
- * cholmod_updown_solve	    update/downdate, and modify solution to Lx=b
- * cholmod_updown_mark	    update/downdate, and modify solution to partial Lx=b
- * cholmod_updown_mask	    update/downdate for LPDASA
- * cholmod_updown_mask2     update/downdate for LPDASA
- * cholmod_rowadd_solve	    add a row, and update solution to Lx=b
- * cholmod_rowadd_mark	    add a row, and update solution to partial Lx=b
- * cholmod_rowdel_solve	    delete a row, and downdate Lx=b
- * cholmod_rowdel_mark	    delete a row, and downdate solution to partial Lx=b
- *
- * Requires the Core module.  Not required by any other CHOLMOD module.
- */
-
-#ifndef CHOLMOD_MODIFY_H
-#define CHOLMOD_MODIFY_H
-
-#include "cholmod_core.h"
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_updown:  multiple rank update/downdate */
-/* -------------------------------------------------------------------------- */
-
-/* Compute the new LDL' factorization of LDL'+CC' (an update) or LDL'-CC'
- * (a downdate).  The factor object L need not be an LDL' factorization; it
- * is converted to one if it isn't. */
-
-int cholmod_updown 
-(
-    /* ---- input ---- */
-    int update,		/* TRUE for update, FALSE for downdate */
-    cholmod_sparse *C,	/* the incoming sparse update */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_updown (int, cholmod_sparse *, cholmod_factor *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_updown_solve:  update/downdate, and modify solution to Lx=b */
-/* -------------------------------------------------------------------------- */
-
-/* Does the same as cholmod_updown, except that it also updates/downdates the
- * solution to Lx=b+DeltaB.  x and b must be n-by-1 dense matrices.  b is not
- * need as input to this routine, but a sparse change to b is (DeltaB).  Only
- * entries in DeltaB corresponding to columns modified in L are accessed; the
- * rest must be zero. */
-
-int cholmod_updown_solve
-(
-    /* ---- input ---- */
-    int update,		/* TRUE for update, FALSE for downdate */
-    cholmod_sparse *C,	/* the incoming sparse update */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    cholmod_dense *X,	/* solution to Lx=b (size n-by-1) */
-    cholmod_dense *DeltaB,  /* change in b, zero on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_updown_solve (int, cholmod_sparse *, cholmod_factor *,
-    cholmod_dense *, cholmod_dense *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_updown_mark:  update/downdate, and modify solution to partial Lx=b */
-/* -------------------------------------------------------------------------- */
-
-/* Does the same as cholmod_updown_solve, except only part of L is used in
- * the update/downdate of the solution to Lx=b.  This routine is an "expert"
- * routine.  It is meant for use in LPDASA only.  See cholmod_updown.c for
- * a description of colmark. */
-
-int cholmod_updown_mark
-(
-    /* ---- input ---- */
-    int update,		/* TRUE for update, FALSE for downdate */
-    cholmod_sparse *C,	/* the incoming sparse update */
-    int *colmark,	/* int array of size n.  See cholmod_updown.c */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    cholmod_dense *X,	/* solution to Lx=b (size n-by-1) */
-    cholmod_dense *DeltaB,  /* change in b, zero on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_updown_mark (int, cholmod_sparse *, SuiteSparse_long *,
-    cholmod_factor *, cholmod_dense *, cholmod_dense *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_updown_mask:  update/downdate, for LPDASA */
-/* -------------------------------------------------------------------------- */
-
-/* Does the same as cholmod_updown_mark, except has an additional "mask"
- * argument.  This routine is an "expert" routine.  It is meant for use in
- * LPDASA only.  See cholmod_updown.c for a description of mask. */
-
-int cholmod_updown_mask
-(
-    /* ---- input ---- */
-    int update,		/* TRUE for update, FALSE for downdate */
-    cholmod_sparse *C,	/* the incoming sparse update */
-    int *colmark,	/* int array of size n.  See cholmod_updown.c */
-    int *mask,		/* size n */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    cholmod_dense *X,	/* solution to Lx=b (size n-by-1) */
-    cholmod_dense *DeltaB,  /* change in b, zero on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_updown_mask (int, cholmod_sparse *, SuiteSparse_long *,
-    SuiteSparse_long *, cholmod_factor *, cholmod_dense *, cholmod_dense *,
-    cholmod_common *) ;
-
-int cholmod_updown_mask2
-(
-    /* ---- input ---- */
-    int update,		/* TRUE for update, FALSE for downdate */
-    cholmod_sparse *C,	/* the incoming sparse update */
-    int *colmark,	/* int array of size n.  See cholmod_updown.c */
-    int *mask,		/* size n */
-    int maskmark,
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    cholmod_dense *X,	/* solution to Lx=b (size n-by-1) */
-    cholmod_dense *DeltaB,  /* change in b, zero on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_updown_mask2 (int, cholmod_sparse *, SuiteSparse_long *,
-    SuiteSparse_long *, SuiteSparse_long, cholmod_factor *, cholmod_dense *,
-    cholmod_dense *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowadd:  add a row to an LDL' factorization (a rank-2 update) */
-/* -------------------------------------------------------------------------- */
-
-/* cholmod_rowadd adds a row to the LDL' factorization.  It computes the kth
- * row and kth column of L, and then updates the submatrix L (k+1:n,k+1:n)
- * accordingly.  The kth row and column of L must originally be equal to the
- * kth row and column of the identity matrix.  The kth row/column of L is
- * computed as the factorization of the kth row/column of the matrix to
- * factorize, which is provided as a single n-by-1 sparse matrix R. */
-
-int cholmod_rowadd 
-(
-    /* ---- input ---- */
-    size_t k,		/* row/column index to add */
-    cholmod_sparse *R,	/* row/column of matrix to factorize (n-by-1) */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowadd (size_t, cholmod_sparse *, cholmod_factor *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowadd_solve:  add a row, and update solution to Lx=b */
-/* -------------------------------------------------------------------------- */
-
-/* Does the same as cholmod_rowadd, and also updates the solution to Lx=b
- * See cholmod_updown for a description of how Lx=b is updated.  There is on
- * additional parameter:  bk specifies the new kth entry of b. */
-
-int cholmod_rowadd_solve
-(
-    /* ---- input ---- */
-    size_t k,		/* row/column index to add */
-    cholmod_sparse *R,	/* row/column of matrix to factorize (n-by-1) */
-    double bk [2],	/* kth entry of the right-hand-side b */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    cholmod_dense *X,	/* solution to Lx=b (size n-by-1) */
-    cholmod_dense *DeltaB,  /* change in b, zero on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowadd_solve (size_t, cholmod_sparse *, double *,
-    cholmod_factor *, cholmod_dense *, cholmod_dense *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowadd_mark:  add a row, and update solution to partial Lx=b */
-/* -------------------------------------------------------------------------- */
-
-/* Does the same as cholmod_rowadd_solve, except only part of L is used in
- * the update/downdate of the solution to Lx=b.  This routine is an "expert"
- * routine.  It is meant for use in LPDASA only.  */
-
-int cholmod_rowadd_mark
-(
-    /* ---- input ---- */
-    size_t k,		/* row/column index to add */
-    cholmod_sparse *R,	/* row/column of matrix to factorize (n-by-1) */
-    double bk [2],	/* kth entry of the right hand side, b */
-    int *colmark,	/* int array of size n.  See cholmod_updown.c */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    cholmod_dense *X,	/* solution to Lx=b (size n-by-1) */
-    cholmod_dense *DeltaB,  /* change in b, zero on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowadd_mark (size_t, cholmod_sparse *, double *,
-    SuiteSparse_long *, cholmod_factor *, cholmod_dense *, cholmod_dense *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowdel:  delete a row from an LDL' factorization (a rank-2 update) */
-/* -------------------------------------------------------------------------- */
-
-/* Sets the kth row and column of L to be the kth row and column of the identity
- * matrix, and updates L(k+1:n,k+1:n) accordingly.   To reduce the running time,
- * the caller can optionally provide the nonzero pattern (or an upper bound) of
- * kth row of L, as the sparse n-by-1 vector R.  Provide R as NULL if you want
- * CHOLMOD to determine this itself, which is easier for the caller, but takes
- * a little more time.
- */
-
-int cholmod_rowdel 
-(
-    /* ---- input ---- */
-    size_t k,		/* row/column index to delete */
-    cholmod_sparse *R,	/* NULL, or the nonzero pattern of kth row of L */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowdel (size_t, cholmod_sparse *, cholmod_factor *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowdel_solve:  delete a row, and downdate Lx=b */
-/* -------------------------------------------------------------------------- */
-
-/* Does the same as cholmod_rowdel, but also downdates the solution to Lx=b.
- * When row/column k of A is "deleted" from the system A*y=b, this can induce
- * a change to x, in addition to changes arising when L and b are modified.
- * If this is the case, the kth entry of y is required as input (yk) */
-
-int cholmod_rowdel_solve
-(
-    /* ---- input ---- */
-    size_t k,		/* row/column index to delete */
-    cholmod_sparse *R,	/* NULL, or the nonzero pattern of kth row of L */
-    double yk [2],	/* kth entry in the solution to A*y=b */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    cholmod_dense *X,	/* solution to Lx=b (size n-by-1) */
-    cholmod_dense *DeltaB,  /* change in b, zero on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowdel_solve (size_t, cholmod_sparse *, double *,
-    cholmod_factor *, cholmod_dense *, cholmod_dense *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_rowdel_mark:  delete a row, and downdate solution to partial Lx=b */
-/* -------------------------------------------------------------------------- */
-
-/* Does the same as cholmod_rowdel_solve, except only part of L is used in
- * the update/downdate of the solution to Lx=b.  This routine is an "expert"
- * routine.  It is meant for use in LPDASA only.  */
-
-int cholmod_rowdel_mark
-(
-    /* ---- input ---- */
-    size_t k,		/* row/column index to delete */
-    cholmod_sparse *R,	/* NULL, or the nonzero pattern of kth row of L */
-    double yk [2],	/* kth entry in the solution to A*y=b */
-    int *colmark,	/* int array of size n.  See cholmod_updown.c */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factor to modify */
-    cholmod_dense *X,	/* solution to Lx=b (size n-by-1) */
-    cholmod_dense *DeltaB,  /* change in b, zero on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_rowdel_mark (size_t, cholmod_sparse *, double *,
-    SuiteSparse_long *, cholmod_factor *, cholmod_dense *, cholmod_dense *,
-    cholmod_common *) ;
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_partition.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_partition.h
deleted file mode 100644
index 1e8ecd3..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_partition.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_partition.h ========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_partition.h.
- * Copyright (C) 2005-2013, Univ. of Florida.  Author: Timothy A. Davis
- * CHOLMOD/Include/cholmod_partition.h is licensed under Version 2.1 of the GNU
- * Lesser General Public License.  See lesser.txt for a text of the license.
- * CHOLMOD is also available under other licenses; contact authors for details.
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD Partition module.
- *
- * Graph partitioning and graph-partition-based orderings.  Includes an
- * interface to CCOLAMD and CSYMAMD, constrained minimum degree ordering
- * methods which order a matrix following constraints determined via nested
- * dissection.
- *
- * These functions require METIS:
- * cholmod_nested_dissection	CHOLMOD nested dissection ordering
- * cholmod_metis		METIS nested dissection ordering (METIS_NodeND)
- * cholmod_bisect		graph partitioner (currently based on METIS)
- * cholmod_metis_bisector	direct interface to METIS_NodeComputeSeparator
- *
- * Requires the Core and Cholesky modules, and three packages: METIS, CAMD,
- * and CCOLAMD.  Optionally used by the Cholesky module.
- *
- * Note that METIS does not have a version that uses SuiteSparse_long integers.
- * If you try to use cholmod_nested_dissection, cholmod_metis, cholmod_bisect,
- * or cholmod_metis_bisector on a matrix that is too large, an error code will
- * be returned.  METIS does have an "idxtype", which could be redefined as
- * SuiteSparse_long, if you wish to edit METIS or use compile-time flags to
- * redefine idxtype.
- */
-
-#ifndef CHOLMOD_PARTITION_H
-#define CHOLMOD_PARTITION_H
-
-#include "cholmod_core.h"
-#include "cholmod_camd.h"
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_nested_dissection */
-/* -------------------------------------------------------------------------- */
-
-/* Order A, AA', or A(:,f)*A(:,f)' using CHOLMOD's nested dissection method
- * (METIS's node bisector applied recursively to compute the separator tree
- * and constraint sets, followed by CCOLAMD using the constraints).  Usually
- * finds better orderings than METIS_NodeND, but takes longer.
- */
-
-SuiteSparse_long cholmod_nested_dissection	/* returns # of components */
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    /* ---- output --- */
-    int *Perm,		/* size A->nrow, output permutation */
-    int *CParent,	/* size A->nrow.  On output, CParent [c] is the parent
-			 * of component c, or EMPTY if c is a root, and where
-			 * c is in the range 0 to # of components minus 1 */
-    int *Cmember,	/* size A->nrow.  Cmember [j] = c if node j of A is
-			 * in component c */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-SuiteSparse_long cholmod_l_nested_dissection (cholmod_sparse *,
-    SuiteSparse_long *, size_t, SuiteSparse_long *, SuiteSparse_long *,
-    SuiteSparse_long *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_metis */
-/* -------------------------------------------------------------------------- */
-
-/* Order A, AA', or A(:,f)*A(:,f)' using METIS_NodeND. */
-
-int cholmod_metis
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to order */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int postorder,	/* if TRUE, follow with etree or coletree postorder */
-    /* ---- output --- */
-    int *Perm,		/* size A->nrow, output permutation */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_metis (cholmod_sparse *, SuiteSparse_long *, size_t, int,
-    SuiteSparse_long *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_bisect */
-/* -------------------------------------------------------------------------- */
-
-/* Finds a node bisector of A, A*A', A(:,f)*A(:,f)'. */
-
-SuiteSparse_long cholmod_bisect	/* returns # of nodes in separator */
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to bisect */
-    int *fset,		/* subset of 0:(A->ncol)-1 */
-    size_t fsize,	/* size of fset */
-    int compress,	/* if TRUE, compress the graph first */
-    /* ---- output --- */
-    int *Partition,	/* size A->nrow.  Node i is in the left graph if
-			 * Partition [i] = 0, the right graph if 1, and in the
-			 * separator if 2. */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-SuiteSparse_long cholmod_l_bisect (cholmod_sparse *, SuiteSparse_long *,
-    size_t, int, SuiteSparse_long *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_metis_bisector */
-/* -------------------------------------------------------------------------- */
-
-/* Find a set of nodes that bisects the graph of A or AA' (direct interface
- * to METIS_NodeComputeSeparator). */
-
-SuiteSparse_long cholmod_metis_bisector	/* returns separator size */
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to bisect */
-    int *Anw,		/* size A->nrow, node weights */
-    int *Aew,		/* size nz, edge weights */
-    /* ---- output --- */
-    int *Partition,	/* size A->nrow.  see cholmod_bisect above. */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-SuiteSparse_long cholmod_l_metis_bisector (cholmod_sparse *,
-    SuiteSparse_long *, SuiteSparse_long *, SuiteSparse_long *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_collapse_septree */
-/* -------------------------------------------------------------------------- */
-
-/* Collapse nodes in a separator tree. */
-
-SuiteSparse_long cholmod_collapse_septree
-(
-    /* ---- input ---- */
-    size_t n,		/* # of nodes in the graph */
-    size_t ncomponents,	/* # of nodes in the separator tree (must be <= n) */
-    double nd_oksep,    /* collapse if #sep >= nd_oksep * #nodes in subtree */
-    size_t nd_small,    /* collapse if #nodes in subtree < nd_small */
-    /* ---- in/out --- */
-    int *CParent,	/* size ncomponents; from cholmod_nested_dissection */
-    int *Cmember,	/* size n; from cholmod_nested_dissection */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-SuiteSparse_long cholmod_l_collapse_septree (size_t, size_t, double, size_t,
-    SuiteSparse_long *, SuiteSparse_long *, cholmod_common *) ;
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_supernodal.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_supernodal.h
deleted file mode 100644
index 36efa97..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_supernodal.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_supernodal.h ========================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Include/cholmod_supernodal.h.
- * Copyright (C) 2005-2006, Timothy A. Davis
- * CHOLMOD/Include/cholmod_supernodal.h 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
- * -------------------------------------------------------------------------- */
-
-/* CHOLMOD Supernodal module.
- *
- * Supernodal analysis, factorization, and solve.  The simplest way to use
- * these routines is via the Cholesky module.  It does not provide any
- * fill-reducing orderings, but does accept the orderings computed by the
- * Cholesky module.  It does not require the Cholesky module itself, however.
- *
- * Primary routines:
- * -----------------
- * cholmod_super_symbolic	supernodal symbolic analysis
- * cholmod_super_numeric	supernodal numeric factorization
- * cholmod_super_lsolve		supernodal Lx=b solve
- * cholmod_super_ltsolve	supernodal L'x=b solve
- *
- * Prototypes for the BLAS and LAPACK routines that CHOLMOD uses are listed
- * below, including how they are used in CHOLMOD.
- *
- * BLAS routines:
- * --------------
- * dtrsv	solve Lx=b or L'x=b, L non-unit diagonal, x and b stride-1
- * dtrsm	solve LX=B or L'X=b, L non-unit diagonal
- * dgemv	y=y-A*x or y=y-A'*x (x and y stride-1)
- * dgemm	C=A*B', C=C-A*B, or C=C-A'*B
- * dsyrk	C=tril(A*A')
- *
- * LAPACK routines:
- * ----------------
- * dpotrf	LAPACK: A=chol(tril(A))
- *
- * Requires the Core module, and two external packages: LAPACK and the BLAS.
- * Optionally used by the Cholesky module.
- */
-
-#ifndef CHOLMOD_SUPERNODAL_H
-#define CHOLMOD_SUPERNODAL_H
-
-#include "cholmod_core.h"
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_super_symbolic */
-/* -------------------------------------------------------------------------- */
-
-/* Analyzes A, AA', or A(:,f)*A(:,f)' in preparation for a supernodal numeric
- * factorization.  The user need not call this directly; cholmod_analyze is
- * a "simple" wrapper for this routine.
- */
-
-int cholmod_super_symbolic
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    cholmod_sparse *F,	/* F = A' or A(:,f)' */
-    int *Parent,	/* elimination tree */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* simplicial symbolic on input,
-			 * supernodal symbolic on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_super_symbolic (cholmod_sparse *, cholmod_sparse *,
-    SuiteSparse_long *, cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_super_symbolic2 */
-/* -------------------------------------------------------------------------- */
-
-/* Analyze for supernodal Cholesky or multifrontal QR */
-
-int cholmod_super_symbolic2
-(
-    /* ---- input ---- */
-    int for_whom,       /* FOR_SPQR     (0): for SPQR but not GPU-accelerated
-                           FOR_CHOLESKY (1): for Cholesky (GPU or not)
-                           FOR_SPQRGPU  (2): for SPQR with GPU acceleration */
-    cholmod_sparse *A,	/* matrix to analyze */
-    cholmod_sparse *F,	/* F = A' or A(:,f)' */
-    int *Parent,	/* elimination tree */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* simplicial symbolic on input,
-			 * supernodal symbolic on output */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_super_symbolic2 (int, cholmod_sparse *, cholmod_sparse *,
-    SuiteSparse_long *, cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_super_numeric */
-/* -------------------------------------------------------------------------- */
-
-/* Computes the numeric LL' factorization of A, AA', or A(:,f)*A(:,f)' using
- * a BLAS-based supernodal method.  The user need not call this directly;
- * cholmod_factorize is a "simple" wrapper for this routine.
- */
-
-int cholmod_super_numeric
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* F = A' or A(:,f)' */
-    double beta [2],	/* beta*I is added to diagonal of matrix to factorize */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factorization */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_super_numeric (cholmod_sparse *, cholmod_sparse *, double *,
-    cholmod_factor *, cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_super_lsolve */
-/* -------------------------------------------------------------------------- */
-
-/* Solve Lx=b where L is from a supernodal numeric factorization.  The user
- * need not call this routine directly.  cholmod_solve is a "simple" wrapper
- * for this routine. */
-
-int cholmod_super_lsolve
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to use for the forward solve */
-    /* ---- output ---- */
-    cholmod_dense *X,	/* b on input, solution to Lx=b on output */
-    /* ---- workspace   */
-    cholmod_dense *E,	/* workspace of size nrhs*(L->maxesize) */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_super_lsolve (cholmod_factor *, cholmod_dense *, cholmod_dense *,
-    cholmod_common *) ;
-
-/* -------------------------------------------------------------------------- */
-/* cholmod_super_ltsolve */
-/* -------------------------------------------------------------------------- */
-
-/* Solve L'x=b where L is from a supernodal numeric factorization.  The user
- * need not call this routine directly.  cholmod_solve is a "simple" wrapper
- * for this routine. */
-
-int cholmod_super_ltsolve
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to use for the backsolve */
-    /* ---- output ---- */
-    cholmod_dense *X,	/* b on input, solution to L'x=b on output */
-    /* ---- workspace   */
-    cholmod_dense *E,	/* workspace of size nrhs*(L->maxesize) */
-    /* --------------- */
-    cholmod_common *Common
-) ;
-
-int cholmod_l_super_ltsolve (cholmod_factor *, cholmod_dense *, cholmod_dense *,
-    cholmod_common *) ;
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_template.h b/src/C/SuiteSparse/CHOLMOD/Include/cholmod_template.h
deleted file mode 100644
index 5623a38..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Include/cholmod_template.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_template.h =========================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* undefine current xtype macros, and then define macros for current type */
-/* -------------------------------------------------------------------------- */
-
-#undef TEMPLATE
-#undef TEMPLATE2
-#undef XTYPE
-#undef XTYPE2
-#undef XTYPE_OK
-#undef ENTRY_IS_NONZERO
-#undef ENTRY_IS_ZERO
-#undef ENTRY_IS_ONE
-#undef IMAG_IS_NONZERO
-
-#undef ASSEMBLE
-#undef ASSIGN
-#undef ASSIGN_CONJ
-#undef ASSIGN2
-#undef ASSIGN2_CONJ
-#undef ASSIGN_REAL
-#undef MULT
-#undef MULTADD
-#undef ADD
-#undef ADD_REAL
-#undef MULTSUB
-#undef MULTADDCONJ
-#undef MULTSUBCONJ
-#undef LLDOT
-#undef CLEAR
-#undef DIV
-#undef DIV_REAL
-#undef MULT_REAL
-#undef CLEAR_IMAG
-#undef LDLDOT
-#undef PREFIX
-
-#undef ENTRY_SIZE
-
-#undef XPRINT0
-#undef XPRINT1
-#undef XPRINT2
-#undef XPRINT3
-
-/* -------------------------------------------------------------------------- */
-/* pattern */
-/* -------------------------------------------------------------------------- */
-
-
-#ifdef PATTERN
-
-#define PREFIX				    p_
-#define TEMPLATE(name)			    P_TEMPLATE(name)
-#define TEMPLATE2(name)			    P_TEMPLATE(name)
-#define XTYPE				    CHOLMOD_PATTERN
-#define XTYPE2				    CHOLMOD_REAL
-#define XTYPE_OK(type)			    (TRUE)
-#define ENTRY_IS_NONZERO(ax,az,q)	    (TRUE)
-#define ENTRY_IS_ZERO(ax,az,q)		    (FALSE)
-#define ENTRY_IS_ONE(ax,az,q)		    (TRUE)
-#define IMAG_IS_NONZERO(ax,az,q)	    (FALSE)
-#define ENTRY_SIZE			    0
-
-#define ASSEMBLE(x,z,p,ax,az,q)
-#define ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN_CONJ(x,z,p,ax,az,q)
-#define ASSIGN2(x,z,p,ax,az,q)		    P_ASSIGN2(x,z,p,ax,az,q)
-#define ASSIGN2_CONJ(x,z,p,ax,az,q)	    P_ASSIGN2(x,z,p,ax,az,q)
-#define ASSIGN_REAL(x,p,ax,q)
-#define MULT(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTADD(x,z,p,ax,az,q,bx,bz,pb)
-#define ADD(x,z,p,ax,az,q,bx,bz,pb)
-#define ADD_REAL(x,p, ax,q, bx,r)
-#define MULTSUB(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTADDCONJ(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTSUBCONJ(x,z,p,ax,az,q,bx,bz,pb)
-#define LLDOT(x,p,ax,az,q)
-#define CLEAR(x,z,p)
-#define CLEAR_IMAG(x,z,p)
-#define DIV(x,z,p,ax,az,q)
-#define DIV_REAL(x,z,p, ax,az,q, bx,r)
-#define MULT_REAL(x,z,p, ax,az,q, bx,r)
-#define LDLDOT(x,p, ax,az,q, bx,r)
-
-#define XPRINT0(x,z,p)			    P_PRINT(0,x,z,p)
-#define XPRINT1(x,z,p)			    P_PRINT(1,x,z,p)
-#define XPRINT2(x,z,p)			    P_PRINT(2,x,z,p)
-#define XPRINT3(x,z,p)			    P_PRINT(3,x,z,p)
-
-/* -------------------------------------------------------------------------- */
-/* real */
-/* -------------------------------------------------------------------------- */
-
-#elif defined (REAL)
-
-#define PREFIX				    r_
-#define TEMPLATE(name)			    R_TEMPLATE(name)
-#define TEMPLATE2(name)			    R_TEMPLATE(name)
-#define XTYPE				    CHOLMOD_REAL
-#define XTYPE2				    CHOLMOD_REAL
-#define XTYPE_OK(type)			    R_XTYPE_OK(type)
-#define ENTRY_IS_NONZERO(ax,az,q)	    R_IS_NONZERO(ax,az,q)
-#define ENTRY_IS_ZERO(ax,az,q)		    R_IS_ZERO(ax,az,q)
-#define ENTRY_IS_ONE(ax,az,q)		    R_IS_ONE(ax,az,q)
-#define IMAG_IS_NONZERO(ax,az,q)	    (FALSE)
-#define ENTRY_SIZE			    1
-
-#define ASSEMBLE(x,z,p,ax,az,q)		    R_ASSEMBLE(x,z,p,ax,az,q) 
-#define ASSIGN(x,z,p,ax,az,q)		    R_ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN_CONJ(x,z,p,ax,az,q)	    R_ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN2(x,z,p,ax,az,q)		    R_ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN2_CONJ(x,z,p,ax,az,q)	    R_ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN_REAL(x,p,ax,q)		    R_ASSIGN_REAL(x,p,ax,q)
-#define MULT(x,z,p,ax,az,q,bx,bz,pb)	    R_MULT(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTADD(x,z,p,ax,az,q,bx,bz,pb)     R_MULTADD(x,z,p,ax,az,q,bx,bz,pb)
-#define ADD(x,z,p,ax,az,q,bx,bz,pb)	    R_ADD(x,z,p,ax,az,q,bx,bz,pb)
-#define ADD_REAL(x,p, ax,q, bx,r)	    R_ADD_REAL(x,p, ax,q, bx,r)
-#define MULTSUB(x,z,p,ax,az,q,bx,bz,pb)     R_MULTSUB(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTADDCONJ(x,z,p,ax,az,q,bx,bz,pb) \
-    R_MULTADDCONJ(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTSUBCONJ(x,z,p,ax,az,q,bx,bz,pb) \
-    R_MULTSUBCONJ(x,z,p,ax,az,q,bx,bz,pb)
-#define LLDOT(x,p,ax,az,q)		    R_LLDOT(x,p,ax,az,q)
-#define CLEAR(x,z,p)			    R_CLEAR(x,z,p) 
-#define CLEAR_IMAG(x,z,p)		    R_CLEAR_IMAG(x,z,p) 
-#define DIV(x,z,p,ax,az,q)		    R_DIV(x,z,p,ax,az,q)
-#define DIV_REAL(x,z,p, ax,az,q, bx,r)	    R_DIV_REAL(x,z,p, ax,az,q, bx,r)
-#define MULT_REAL(x,z,p, ax,az,q, bx,r)	    R_MULT_REAL(x,z,p, ax,az,q, bx,r)
-#define LDLDOT(x,p, ax,az,q, bx,r)	    R_LDLDOT(x,p, ax,az,q, bx,r)
-
-#define XPRINT0(x,z,p)			    R_PRINT(0,x,z,p)
-#define XPRINT1(x,z,p)			    R_PRINT(1,x,z,p)
-#define XPRINT2(x,z,p)			    R_PRINT(2,x,z,p)
-#define XPRINT3(x,z,p)			    R_PRINT(3,x,z,p)
-
-/* -------------------------------------------------------------------------- */
-/* complex */
-/* -------------------------------------------------------------------------- */
-
-#elif defined (COMPLEX)
-
-#define PREFIX				    c_
-
-#ifdef NCONJUGATE
-#define TEMPLATE(name)			    CT_TEMPLATE(name)
-#define TEMPLATE2(name)			    CT_TEMPLATE(name)
-#else
-#define TEMPLATE(name)			    C_TEMPLATE(name)
-#define TEMPLATE2(name)			    C_TEMPLATE(name)
-#endif
-
-#define ASSEMBLE(x,z,p,ax,az,q)		    C_ASSEMBLE(x,z,p,ax,az,q) 
-#define ASSIGN(x,z,p,ax,az,q)		    C_ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN_CONJ(x,z,p,ax,az,q)	    C_ASSIGN_CONJ(x,z,p,ax,az,q)
-#define ASSIGN2(x,z,p,ax,az,q)		    C_ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN2_CONJ(x,z,p,ax,az,q)	    C_ASSIGN_CONJ(x,z,p,ax,az,q)
-#define ASSIGN_REAL(x,p,ax,q)		    C_ASSIGN_REAL(x,p,ax,q)
-#define XTYPE				    CHOLMOD_COMPLEX
-#define XTYPE2				    CHOLMOD_COMPLEX
-#define XTYPE_OK(type)			    C_XTYPE_OK(type)
-#define ENTRY_IS_NONZERO(ax,az,q)	    C_IS_NONZERO(ax,az,q)
-#define ENTRY_IS_ZERO(ax,az,q)		    C_IS_ZERO(ax,az,q)
-#define ENTRY_IS_ONE(ax,az,q)		    C_IS_ONE(ax,az,q)
-#define IMAG_IS_NONZERO(ax,az,q)	    C_IMAG_IS_NONZERO(ax,az,q)
-#define ENTRY_SIZE			    2
-
-#define MULTADD(x,z,p,ax,az,q,bx,bz,pb)     C_MULTADD(x,z,p,ax,az,q,bx,bz,pb)
-#define MULT(x,z,p,ax,az,q,bx,bz,pb)	    C_MULT(x,z,p,ax,az,q,bx,bz,pb)
-#define ADD(x,z,p,ax,az,q,bx,bz,pb)	    C_ADD(x,z,p,ax,az,q,bx,bz,pb)
-#define ADD_REAL(x,p, ax,q, bx,r)	    C_ADD_REAL(x,p, ax,q, bx,r)
-#define MULTSUB(x,z,p,ax,az,q,bx,bz,pb)     C_MULTSUB(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTADDCONJ(x,z,p,ax,az,q,bx,bz,pb) \
-    C_MULTADDCONJ(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTSUBCONJ(x,z,p,ax,az,q,bx,bz,pb) \
-    C_MULTSUBCONJ(x,z,p,ax,az,q,bx,bz,pb)
-#define LLDOT(x,p,ax,az,q)		    C_LLDOT(x,p,ax,az,q)
-#define CLEAR(x,z,p)			    C_CLEAR(x,z,p) 
-#define CLEAR_IMAG(x,z,p)		    C_CLEAR_IMAG(x,z,p) 
-#define DIV(x,z,p,ax,az,q)		    C_DIV(x,z,p,ax,az,q)
-#define DIV_REAL(x,z,p, ax,az,q, bx,r)	    C_DIV_REAL(x,z,p, ax,az,q, bx,r)
-#define MULT_REAL(x,z,p, ax,az,q, bx,r)	    C_MULT_REAL(x,z,p, ax,az,q, bx,r)
-#define LDLDOT(x,p, ax,az,q, bx,r)	    C_LDLDOT(x,p, ax,az,q, bx,r)
-
-#define XPRINT0(x,z,p)			    C_PRINT(0,x,z,p)
-#define XPRINT1(x,z,p)			    C_PRINT(1,x,z,p)
-#define XPRINT2(x,z,p)			    C_PRINT(2,x,z,p)
-#define XPRINT3(x,z,p)			    C_PRINT(3,x,z,p)
-
-/* -------------------------------------------------------------------------- */
-/* zomplex */
-/* -------------------------------------------------------------------------- */
-
-#elif defined (ZOMPLEX)
-
-#define PREFIX				    z_
-
-#ifdef NCONJUGATE
-#define TEMPLATE(name)			    ZT_TEMPLATE(name)
-#define TEMPLATE2(name)			    CT_TEMPLATE(name)
-#else
-#define TEMPLATE(name)			    Z_TEMPLATE(name)
-#define TEMPLATE2(name)			    C_TEMPLATE(name)
-#endif
-
-#define ASSEMBLE(x,z,p,ax,az,q)		    Z_ASSEMBLE(x,z,p,ax,az,q) 
-#define ASSIGN(x,z,p,ax,az,q)		    Z_ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN_CONJ(x,z,p,ax,az,q)	    Z_ASSIGN_CONJ(x,z,p,ax,az,q)
-#define ASSIGN2(x,z,p,ax,az,q)		    Z_ASSIGN(x,z,p,ax,az,q)
-#define ASSIGN2_CONJ(x,z,p,ax,az,q)	    Z_ASSIGN_CONJ(x,z,p,ax,az,q)
-#define ASSIGN_REAL(x,p,ax,q)		    Z_ASSIGN_REAL(x,p,ax,q)
-#define XTYPE				    CHOLMOD_ZOMPLEX
-#define XTYPE2				    CHOLMOD_ZOMPLEX
-#define XTYPE_OK(type)			    Z_XTYPE_OK(type)
-#define ENTRY_IS_NONZERO(ax,az,q)	    Z_IS_NONZERO(ax,az,q)
-#define ENTRY_IS_ZERO(ax,az,q)		    Z_IS_ZERO(ax,az,q)
-#define ENTRY_IS_ONE(ax,az,q)		    Z_IS_ONE(ax,az,q)
-#define IMAG_IS_NONZERO(ax,az,q)	    Z_IMAG_IS_NONZERO(ax,az,q)
-#define ENTRY_SIZE			    1
-
-#define MULTADD(x,z,p,ax,az,q,bx,bz,pb)     Z_MULTADD(x,z,p,ax,az,q,bx,bz,pb)
-#define MULT(x,z,p,ax,az,q,bx,bz,pb)	    Z_MULT(x,z,p,ax,az,q,bx,bz,pb)
-#define ADD(x,z,p,ax,az,q,bx,bz,pb)	    Z_ADD(x,z,p,ax,az,q,bx,bz,pb)
-#define ADD_REAL(x,p, ax,q, bx,r)	    Z_ADD_REAL(x,p, ax,q, bx,r)
-#define MULTSUB(x,z,p,ax,az,q,bx,bz,pb)     Z_MULTSUB(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTADDCONJ(x,z,p,ax,az,q,bx,bz,pb) \
-    Z_MULTADDCONJ(x,z,p,ax,az,q,bx,bz,pb)
-#define MULTSUBCONJ(x,z,p,ax,az,q,bx,bz,pb) \
-    Z_MULTSUBCONJ(x,z,p,ax,az,q,bx,bz,pb)
-#define LLDOT(x,p,ax,az,q)		    Z_LLDOT(x,p,ax,az,q)
-#define CLEAR(x,z,p)			    Z_CLEAR(x,z,p) 
-#define CLEAR_IMAG(x,z,p)		    Z_CLEAR_IMAG(x,z,p) 
-#define DIV(x,z,p,ax,az,q)		    Z_DIV(x,z,p,ax,az,q)
-#define DIV_REAL(x,z,p, ax,az,q, bx,r)	    Z_DIV_REAL(x,z,p, ax,az,q, bx,r)
-#define MULT_REAL(x,z,p, ax,az,q, bx,r)	    Z_MULT_REAL(x,z,p, ax,az,q, bx,r)
-#define LDLDOT(x,p, ax,az,q, bx,r)	    Z_LDLDOT(x,p, ax,az,q, bx,r)
-
-#define XPRINT0(x,z,p)			    Z_PRINT(0,x,z,p)
-#define XPRINT1(x,z,p)			    Z_PRINT(1,x,z,p)
-#define XPRINT2(x,z,p)			    Z_PRINT(2,x,z,p)
-#define XPRINT3(x,z,p)			    Z_PRINT(3,x,z,p)
-
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Lib/Makefile b/src/C/SuiteSparse/CHOLMOD/Lib/Makefile
deleted file mode 100644
index 3893d39..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Lib/Makefile
+++ /dev/null
@@ -1,544 +0,0 @@
-#===============================================================================
-# CHOLOMD/Lib/Makefile: for compiling the CHOLMOD library
-#===============================================================================
-
-default: all
-
-ccode: all
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-#-------------------------------------------------------------------------------
-# the optional Partition module requires METIS, CAMD, and CCOLAMD.
-# CAMD and CCOLAMD can be installed without METIS, but are optional.
-I_WITH_PARTITION = 
-LIB_WITH_PARTITION =
-CONFIG = -DNPARTITION -DNCAMD
-# check if CAMD/CCOLAMD and METIS are requested and available
-ifeq (,$(findstring -DNCAMD, $(CHOLMOD_CONFIG)))
-    # CAMD and CCOLAMD are requested.  See if they are available
-    ifeq (../../CAMD, $(wildcard ../../CAMD))
-        ifeq (../../CCOLAMD, $(wildcard ../../CCOLAMD))
-            # CAMD and CCOLAMD are requested and available
-            LIB_WITH_PARTITION = \
-                        ../../CCOLAMD/Lib/libccolamd.a ../../CAMD/Lib/libcamd.a
-            I_WITH_PARTITION = \
-                        -I../../CCOLAMD/Include -I../../CAMD/Include
-            CONFIG = -DNPARTITION
-            # check if METIS is requested and available
-            ifeq (,$(findstring -DNPARTITION, $(CHOLMOD_CONFIG)))
-                # METIS is requested.  See if it is available
-                ifeq ($(METIS_PATH), $(wildcard $(METIS_PATH)))
-                    # METIS is available
-                    LIB_WITH_PARTITION = $(METIS) \
-                        ../../CCOLAMD/Lib/libccolamd.a ../../CAMD/Lib/libcamd.a
-                    I_WITH_PARTITION = -I$(METIS_PATH)/Lib \
-                        -I../../CCOLAMD/Include -I../../CAMD/Include
-                    CONFIG =
-                endif
-            endif
-        endif
-    endif
-endif
-
-#-------------------------------------------------------------------------------
-
-I = -I../../AMD/Include -I../../AMD/Source -I../../COLAMD/Include \
-	$(I_WITH_PARTITION) -I../Include -I../../SuiteSparse_config
-
-#-------------------------------------------------------------------------------
-
-C = $(CC) $(CF) $(CHOLMOD_CONFIG) $(CONFIG)
-
-all: libcholmod.a
-
-library: libcholmod.a
-
-purge: distclean
-
-distclean: clean
-	- $(RM) libcholmod.a
-
-clean:
-	- $(RM) $(CLEAN)
-
-#-------------------------------------------------------------------------------
-# ../Include/ directory contains all include files:
-#-------------------------------------------------------------------------------
-
-INC =   ../Include/cholmod.h \
-	../Include/cholmod_blas.h \
-	../Include/cholmod_check.h \
-	../Include/cholmod_cholesky.h \
-	../Include/cholmod_complexity.h \
-	../Include/cholmod_config.h \
-	../Include/cholmod_core.h \
-	../Include/cholmod_internal.h \
-	../Include/cholmod_matrixops.h \
-	../Include/cholmod_modify.h \
-	../Include/cholmod_partition.h \
-	../Include/cholmod_supernodal.h \
-	../Include/cholmod_template.h \
-	../Include/cholmod_gpu.h
-
-#-------------------------------------------------------------------------------
-# The 7 CHOLMOD library modules (int, double)
-#-------------------------------------------------------------------------------
-
-CORE = cholmod_aat.o cholmod_add.o cholmod_band.o \
-	cholmod_change_factor.o cholmod_common.o cholmod_complex.o \
-	cholmod_copy.o cholmod_dense.o cholmod_error.o cholmod_factor.o \
-	cholmod_memory.o cholmod_sparse.o \
-	cholmod_transpose.o cholmod_triplet.o \
-        cholmod_version.o
-
-CHECK = cholmod_check.o cholmod_read.o cholmod_write.o
-
-CHOLESKY = cholmod_amd.o cholmod_analyze.o cholmod_colamd.o \
-	cholmod_etree.o cholmod_factorize.o cholmod_postorder.o \
-	cholmod_rcond.o cholmod_resymbol.o cholmod_rowcolcounts.o \
-	cholmod_rowfac.o cholmod_solve.o cholmod_spsolve.o
-
-MATRIXOPS = cholmod_drop.o cholmod_horzcat.o cholmod_norm.o \
-	cholmod_scale.o cholmod_sdmult.o cholmod_ssmult.o \
-	cholmod_submatrix.o cholmod_vertcat.o cholmod_symmetry.o
-
-PARTITION = cholmod_ccolamd.o cholmod_csymamd.o \
-	cholmod_metis.o cholmod_nesdis.o cholmod_camd.o
-
-MODIFY = cholmod_rowadd.o cholmod_rowdel.o cholmod_updown.o
-
-SUPERNODAL = cholmod_super_numeric.o cholmod_super_solve.o \
-	cholmod_super_symbolic.o
-
-ifneq ($(GPU_CONFIG),)
-GPU = cholmod_gpu.o cholmod_gpu_kernels.o
-else
-GPU =
-endif
-
-DI = $(CORE) $(CHECK) $(CHOLESKY) $(MATRIXOPS) $(MODIFY) $(SUPERNODAL) \
-	$(GPU) $(PARTITION) 
-
-#-------------------------------------------------------------------------------
-# CHOLMOD library modules (long, double)
-#-------------------------------------------------------------------------------
-
-LCORE = cholmod_l_aat.o cholmod_l_add.o cholmod_l_band.o \
-	cholmod_l_change_factor.o cholmod_l_common.o cholmod_l_complex.o \
-	cholmod_l_copy.o cholmod_l_dense.o cholmod_l_error.o \
-	cholmod_l_factor.o cholmod_l_memory.o \
-	cholmod_l_sparse.o cholmod_l_transpose.o cholmod_l_triplet.o \
-        cholmod_l_version.o
-
-LCHECK = cholmod_l_check.o cholmod_l_read.o cholmod_l_write.o
-
-LCHOLESKY = cholmod_l_amd.o cholmod_l_analyze.o cholmod_l_colamd.o \
-	cholmod_l_etree.o cholmod_l_factorize.o cholmod_l_postorder.o \
-	cholmod_l_rcond.o cholmod_l_resymbol.o cholmod_l_rowcolcounts.o \
-	cholmod_l_rowfac.o cholmod_l_solve.o cholmod_l_spsolve.o
-
-LMATRIXOPS = cholmod_l_drop.o cholmod_l_horzcat.o cholmod_l_norm.o \
-	cholmod_l_scale.o cholmod_l_sdmult.o cholmod_l_ssmult.o \
-	cholmod_l_submatrix.o cholmod_l_vertcat.o cholmod_l_symmetry.o
-
-LPARTITION = cholmod_l_ccolamd.o cholmod_l_csymamd.o \
-	cholmod_l_metis.o cholmod_l_nesdis.o cholmod_l_camd.o
-
-LMODIFY = cholmod_l_rowadd.o cholmod_l_rowdel.o cholmod_l_updown.o
-
-LSUPERNODAL = cholmod_l_super_numeric.o cholmod_l_super_solve.o \
-	cholmod_l_super_symbolic.o
-
-ifneq ($(GPU_CONFIG),)
-LGPU = cholmod_l_gpu.o cholmod_gpu_kernels.o
-else
-LGPU =
-endif
-
-DL = $(LCORE) $(LCHECK) $(LCHOLESKY) $(LMATRIXOPS) $(LMODIFY) $(LSUPERNODAL) \
-	$(LPARTITION) $(LGPU)
-
-#-------------------------------------------------------------------------------
-
-# to compile just the double/int version, use OBJ = $(DI)
-OBJ = $(DI) $(DL)
-
-libcholmod.a: $(OBJ)
-	$(ARCHIVE)  libcholmod.a $(OBJ)
-	- $(RANLIB) libcholmod.a
-
-$(OBJ): $(INC)
-
-#-------------------------------------------------------------------------------
-# Check Module:
-#-------------------------------------------------------------------------------
-
-cholmod_check.o: ../Check/cholmod_check.c
-	$(C) -c $(I) $<
-
-cholmod_read.o: ../Check/cholmod_read.c
-	$(C) -c $(I) $<
-
-cholmod_write.o: ../Check/cholmod_write.c
-	$(C) -c $(I) $<
-
-#-------------------------------------------------------------------------------
-
-cholmod_l_check.o: ../Check/cholmod_check.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_read.o: ../Check/cholmod_read.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_write.o: ../Check/cholmod_write.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-
-#-------------------------------------------------------------------------------
-# Core Module:
-#-------------------------------------------------------------------------------
-
-cholmod_common.o: ../Core/cholmod_common.c
-	$(C) -c $(I) $<
-
-cholmod_dense.o: ../Core/cholmod_dense.c ../Core/t_cholmod_dense.c
-	$(C) -c $(I) $<
-
-cholmod_factor.o: ../Core/cholmod_factor.c
-	$(C) -c $(I) $<
-
-cholmod_change_factor.o: ../Core/cholmod_change_factor.c \
-	../Core/t_cholmod_change_factor.c
-	$(C) -c $(I) $<
-
-cholmod_memory.o: ../Core/cholmod_memory.c
-	$(C) -c $(I) $<
-
-cholmod_sparse.o: ../Core/cholmod_sparse.c
-	$(C) -c $(I) $<
-
-cholmod_complex.o: ../Core/cholmod_complex.c
-	$(C) -c $(I) $<
-
-cholmod_transpose.o: ../Core/cholmod_transpose.c ../Core/t_cholmod_transpose.c
-	$(C) -c $(I) $<
-
-cholmod_band.o: ../Core/cholmod_band.c
-	$(C) -c $(I) $<
-
-cholmod_copy.o: ../Core/cholmod_copy.c
-	$(C) -c $(I) $<
-
-cholmod_triplet.o: ../Core/cholmod_triplet.c ../Core/t_cholmod_triplet.c
-	$(C) -c $(I) $<
-
-cholmod_error.o: ../Core/cholmod_error.c
-	$(C) -c $(I) $<
-
-cholmod_aat.o: ../Core/cholmod_aat.c
-	$(C) -c $(I) $<
-
-cholmod_add.o: ../Core/cholmod_add.c
-	$(C) -c $(I) $<
-
-cholmod_version.o: ../Core/cholmod_version.c
-	$(C) -c $(I) $<
-
-#-------------------------------------------------------------------------------
-
-cholmod_l_common.o: ../Core/cholmod_common.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_dense.o: ../Core/cholmod_dense.c ../Core/t_cholmod_dense.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_factor.o: ../Core/cholmod_factor.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_change_factor.o: ../Core/cholmod_change_factor.c \
-	../Core/t_cholmod_change_factor.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_memory.o: ../Core/cholmod_memory.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_sparse.o: ../Core/cholmod_sparse.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_complex.o: ../Core/cholmod_complex.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_transpose.o: ../Core/cholmod_transpose.c ../Core/t_cholmod_transpose.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_band.o: ../Core/cholmod_band.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_copy.o: ../Core/cholmod_copy.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_triplet.o: ../Core/cholmod_triplet.c ../Core/t_cholmod_triplet.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_error.o: ../Core/cholmod_error.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_aat.o: ../Core/cholmod_aat.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_add.o: ../Core/cholmod_add.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_version.o: ../Core/cholmod_version.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-
-#-------------------------------------------------------------------------------
-# Cholesky Module:
-#-------------------------------------------------------------------------------
-
-cholmod_amd.o: ../Cholesky/cholmod_amd.c
-	$(C) -c $(I) $<
-
-cholmod_analyze.o: ../Cholesky/cholmod_analyze.c
-	$(C) -c $(I) $<
-
-cholmod_colamd.o: ../Cholesky/cholmod_colamd.c
-	$(C) -c $(I) $<
-
-cholmod_etree.o: ../Cholesky/cholmod_etree.c
-	$(C) -c $(I) $<
-
-cholmod_factorize.o: ../Cholesky/cholmod_factorize.c
-	$(C) -c $(I) $<
-
-cholmod_postorder.o: ../Cholesky/cholmod_postorder.c
-	$(C) -c $(I) $<
-
-cholmod_rcond.o: ../Cholesky/cholmod_rcond.c
-	$(C) -c $(I) $<
-
-cholmod_resymbol.o: ../Cholesky/cholmod_resymbol.c
-	$(C) -c $(I) $<
-
-cholmod_rowcolcounts.o: ../Cholesky/cholmod_rowcolcounts.c
-	$(C) -c $(I) $<
-
-cholmod_solve.o: ../Cholesky/cholmod_solve.c ../Cholesky/t_cholmod_lsolve.c \
-	../Cholesky/t_cholmod_ltsolve.c ../Cholesky/t_cholmod_solve.c
-	$(C) -c $(I) $<
-
-cholmod_spsolve.o: ../Cholesky/cholmod_spsolve.c
-	$(C) -c $(I) $<
-
-cholmod_rowfac.o: ../Cholesky/cholmod_rowfac.c ../Cholesky/t_cholmod_rowfac.c
-	$(C) -c $(I) $<
-
-#-------------------------------------------------------------------------------
-
-cholmod_l_amd.o: ../Cholesky/cholmod_amd.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_analyze.o: ../Cholesky/cholmod_analyze.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_colamd.o: ../Cholesky/cholmod_colamd.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_etree.o: ../Cholesky/cholmod_etree.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_factorize.o: ../Cholesky/cholmod_factorize.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_postorder.o: ../Cholesky/cholmod_postorder.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_rcond.o: ../Cholesky/cholmod_rcond.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_resymbol.o: ../Cholesky/cholmod_resymbol.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_rowcolcounts.o: ../Cholesky/cholmod_rowcolcounts.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_solve.o: ../Cholesky/cholmod_solve.c ../Cholesky/t_cholmod_lsolve.c \
-	../Cholesky/t_cholmod_ltsolve.c ../Cholesky/t_cholmod_solve.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_spsolve.o: ../Cholesky/cholmod_spsolve.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_rowfac.o: ../Cholesky/cholmod_rowfac.c ../Cholesky/t_cholmod_rowfac.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-#-------------------------------------------------------------------------------
-# Partition Module:
-#-------------------------------------------------------------------------------
-
-cholmod_ccolamd.o: ../Partition/cholmod_ccolamd.c
-	$(C) -c $(I) $<
-
-cholmod_csymamd.o: ../Partition/cholmod_csymamd.c
-	$(C) -c $(I) $<
-
-cholmod_camd.o: ../Partition/cholmod_camd.c
-	$(C) -c $(I) $<
-
-cholmod_metis.o: ../Partition/cholmod_metis.c
-	$(C) -c $(I) $<
-
-cholmod_nesdis.o: ../Partition/cholmod_nesdis.c
-	$(C) -c $(I) $<
-
-#-------------------------------------------------------------------------------
-
-cholmod_l_ccolamd.o: ../Partition/cholmod_ccolamd.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_csymamd.o: ../Partition/cholmod_csymamd.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_camd.o: ../Partition/cholmod_camd.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_metis.o: ../Partition/cholmod_metis.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_nesdis.o: ../Partition/cholmod_nesdis.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-
-#-------------------------------------------------------------------------------
-# MatrixOps Module:
-#-------------------------------------------------------------------------------
-
-cholmod_horzcat.o: ../MatrixOps/cholmod_horzcat.c
-	$(C) -c $(I) $<
-
-cholmod_norm.o: ../MatrixOps/cholmod_norm.c
-	$(C) -c $(I) $<
-
-cholmod_scale.o: ../MatrixOps/cholmod_scale.c
-	$(C) -c $(I) $<
-
-cholmod_drop.o: ../MatrixOps/cholmod_drop.c
-	$(C) -c $(I) $<
-
-cholmod_sdmult.o: ../MatrixOps/cholmod_sdmult.c \
-	../MatrixOps/t_cholmod_sdmult.c
-	$(C) -c $(I) $<
-
-cholmod_ssmult.o: ../MatrixOps/cholmod_ssmult.c
-	$(C) -c $(I) $<
-
-cholmod_submatrix.o: ../MatrixOps/cholmod_submatrix.c
-	$(C) -c $(I) $<
-
-cholmod_vertcat.o: ../MatrixOps/cholmod_vertcat.c
-	$(C) -c $(I) $<
-
-cholmod_symmetry.o: ../MatrixOps/cholmod_symmetry.c
-	$(C) -c $(I) $<
-
-#-------------------------------------------------------------------------------
-
-cholmod_l_horzcat.o: ../MatrixOps/cholmod_horzcat.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_norm.o: ../MatrixOps/cholmod_norm.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_scale.o: ../MatrixOps/cholmod_scale.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_drop.o: ../MatrixOps/cholmod_drop.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_sdmult.o: ../MatrixOps/cholmod_sdmult.c \
-	../MatrixOps/t_cholmod_sdmult.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_ssmult.o: ../MatrixOps/cholmod_ssmult.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_submatrix.o: ../MatrixOps/cholmod_submatrix.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_vertcat.o: ../MatrixOps/cholmod_vertcat.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_symmetry.o: ../MatrixOps/cholmod_symmetry.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-#-------------------------------------------------------------------------------
-# Modify Module:
-#-------------------------------------------------------------------------------
-
-cholmod_rowadd.o: ../Modify/cholmod_rowadd.c
-	$(C) -c $(I) $<
-
-cholmod_rowdel.o: ../Modify/cholmod_rowdel.c
-	$(C) -c $(I) $<
-
-cholmod_updown.o: ../Modify/cholmod_updown.c \
-	../Modify/t_cholmod_updown.c ../Modify/t_cholmod_updown_numkr.c
-	$(C) -c $(I) $<
-
-#-------------------------------------------------------------------------------
-
-cholmod_l_rowadd.o: ../Modify/cholmod_rowadd.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_rowdel.o: ../Modify/cholmod_rowdel.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_updown.o: ../Modify/cholmod_updown.c \
-	../Modify/t_cholmod_updown.c ../Modify/t_cholmod_updown_numkr.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-
-#-------------------------------------------------------------------------------
-# Supernodal Module:
-#-------------------------------------------------------------------------------
-
-cholmod_super_numeric.o: ../Supernodal/cholmod_super_numeric.c \
-        ../GPU/t_cholmod_gpu.c \
-	../Supernodal/t_cholmod_super_numeric.c
-	$(C) -c $(I) $<
-
-cholmod_super_symbolic.o: ../Supernodal/cholmod_super_symbolic.c
-	$(C) -c $(I) $<
-
-cholmod_super_solve.o: ../Supernodal/cholmod_super_solve.c \
-	../Supernodal/t_cholmod_super_solve.c
-	$(C) -c $(I) $<
-
-#-------------------------------------------------------------------------------
-
-cholmod_l_super_numeric.o: ../Supernodal/cholmod_super_numeric.c \
-	../Supernodal/t_cholmod_super_numeric.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_super_symbolic.o: ../Supernodal/cholmod_super_symbolic.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-cholmod_l_super_solve.o: ../Supernodal/cholmod_super_solve.c \
-	../Supernodal/t_cholmod_super_solve.c
-	$(C) -DDLONG -c $(I) $< -o $@
-
-#-------------------------------------------------------------------------------
-# GPU module
-#-------------------------------------------------------------------------------
-
-cholmod_gpu_kernels.o: ../GPU/cholmod_gpu_kernels.cu
-	$(NVCC) -I../../SuiteSparse_config -Xcompiler -fPIC -O3  -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35 -c ../GPU/cholmod_gpu_kernels.cu
-
-cholmod_gpu.o: ../GPU/cholmod_gpu.c 
-	$(C) -c $(I) $<
-
-cholmod_l_gpu.o: ../GPU/cholmod_gpu.c 
-	$(C) -DDLONG -c $(I) $< -o $@
-
diff --git a/src/C/SuiteSparse/CHOLMOD/Makefile b/src/C/SuiteSparse/CHOLMOD/Makefile
deleted file mode 100644
index f5b82ec..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Makefile
+++ /dev/null
@@ -1,75 +0,0 @@
-#-------------------------------------------------------------------------------
-# CHOLMOD Makefile
-#-------------------------------------------------------------------------------
-
-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.
-# See ../SuiteSparse_config/SuiteSparse_config.mk .
-
-default: all
-
-include ../SuiteSparse_config/SuiteSparse_config.mk
-
-# Compile the C-callable libraries and the Demo programs.
-all:
-	( cd Demo ; $(MAKE) )
-
-# Compile the C-callable libraries only.
-library:
-	( cd Lib ; $(MAKE) )
-
-# Remove all files not in the original distribution
-purge:
-	( cd Tcov ; $(MAKE) purge )
-	( cd Lib ; $(MAKE) purge )
-	( cd Valgrind ; $(MAKE) dopurge )
-	( cd Demo ; $(MAKE) purge )
-	( cd Doc ; $(MAKE) purge )
-	( cd MATLAB ; $(RM) $(CLEAN) rename.h *.mex* )
-
-# Remove all files not in the original distribution, except keep the 
-# compiled libraries.
-clean:
-	( cd Tcov ; $(MAKE) clean )
-	( cd Lib ; $(MAKE) clean )
-	( cd Valgrind ; $(MAKE) clean )
-	( cd Demo ; $(MAKE) clean )
-	( cd MATLAB ; $(RM) $(CLEAN) )
-
-distclean: purge
-
-ccode: all
-
-# Run the test coverage suite.  Takes about 40 minutes on a 3.2GHz Pentium.
-# Requires Linux (gcc, gcov).
-cov:
-	( cd Tcov ; $(MAKE) )
-
-# Run the test coverage suite using Valgrind.  This takes a *** long *** time.
-valgrind:
-	( cd Valgrind ; $(MAKE) )
-
-# Compile the C-callable libraries and the Demo programs.
-demos:
-	( cd Demo ; $(MAKE) )
-
-# create PDF documents for the original distribution
-docs:
-	( cd Doc    ; $(MAKE) )
-
-# install CHOLMOD
-install:
-	$(CP) Lib/libcholmod.a $(INSTALL_LIB)/libcholmod.$(VERSION).a
-	( cd $(INSTALL_LIB) ; ln -sf libcholmod.$(VERSION).a libcholmod.a )
-	$(CP) Include/cholmod*.h $(INSTALL_INCLUDE)
-	$(RM) $(INSTALL_INCLUDE)/cholmod_internal.h
-	chmod 644 $(INSTALL_LIB)/libcholmod*.a
-	chmod 644 $(INSTALL_INCLUDE)/cholmod*.h
-
-# uninstall CHOLMOD
-uninstall:
-	$(RM) $(INSTALL_LIB)/libcholmod*.a
-	$(RM) $(INSTALL_INCLUDE)/cholmod*.h
-
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/License.txt b/src/C/SuiteSparse/CHOLMOD/MatrixOps/License.txt
deleted file mode 100644
index 8c23f46..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/License.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006,
-Timothy A. Davis
-CHOLMOD is also available under other licenses; contact authors for details.
-http://www.suitesparse.com
-
-Note that this license is for the CHOLMOD/MatrixOps module only.
-All CHOLMOD modules are licensed separately.
-
-
---------------------------------------------------------------------------------
-
-
-This Module is free software; you can 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 Module is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this Module; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_drop.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_drop.c
deleted file mode 100644
index de0ce8a..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_drop.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_drop =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* Drop small entries from A, and entries in the ignored part of A if A
- * is symmetric.  None of the matrix operations drop small numerical entries
- * from a matrix, except for this one.  NaN's and Inf's are kept.
- *
- * workspace: none
- *
- * Supports pattern and real matrices, complex and zomplex not supported.
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-
-/* ========================================================================== */
-/* === cholmod_drop ========================================================= */
-/* ========================================================================== */
-
-int CHOLMOD(drop)
-(
-    /* ---- input ---- */
-    double tol,		/* keep entries with absolute value > tol */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix to drop entries from */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double aij ;
-    double *Ax ;
-    Int *Ap, *Ai, *Anz ;
-    Int packed, i, j, nrow, ncol, p, pend, nz, values ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_REAL, FALSE) ;
-    Common->status = CHOLMOD_OK ;
-    ASSERT (CHOLMOD(dump_sparse) (A, "A predrop", Common) >= 0) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Anz = A->nz ;
-    packed = A->packed ;
-    ncol = A->ncol ;
-    nrow = A->nrow ;
-    values = (A->xtype != CHOLMOD_PATTERN) ;
-    nz = 0 ;
-
-    if (values)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* drop small numerical entries from A, and entries in ignored part */
-	/* ------------------------------------------------------------------ */
-
-	if (A->stype > 0)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* A is symmetric, with just upper triangular part stored */
-	    /* -------------------------------------------------------------- */
-
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		Ap [j] = nz ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    aij = Ax [p] ;
-		    if (i <= j && (fabs (aij) > tol || IS_NAN (aij)))
-		    {
-			Ai [nz] = i ;
-			Ax [nz] = aij ;
-			nz++ ;
-		    }
-		}
-	    }
-
-	}
-	else if (A->stype < 0)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* A is symmetric, with just lower triangular part stored */
-	    /* -------------------------------------------------------------- */
-
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		Ap [j] = nz ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    aij = Ax [p] ;
-		    if (i >= j && (fabs (aij) > tol || IS_NAN (aij)))
-		    {
-			Ai [nz] = i ;
-			Ax [nz] = aij ;
-			nz++ ;
-		    }
-		}
-	    }
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* both parts of A present, just drop small entries */
-	    /* -------------------------------------------------------------- */
-
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		Ap [j] = nz ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    aij = Ax [p] ;
-		    if (fabs (aij) > tol || IS_NAN (aij))
-		    {
-			Ai [nz] = i ;
-			Ax [nz] = aij ;
-			nz++ ;
-		    }
-		}
-	    }
-	}
-	Ap [ncol] = nz ;
-
-	/* reduce A->i and A->x in size */
-	ASSERT (MAX (1,nz) <= A->nzmax) ;
-	CHOLMOD(reallocate_sparse) (nz, A, Common) ;
-	ASSERT (Common->status >= CHOLMOD_OK) ;
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* consider only the pattern of A */
-	/* ------------------------------------------------------------------ */
-
-	/* Note that cholmod_band_inplace calls cholmod_reallocate_sparse */
-	if (A->stype > 0)
-	{
-	    CHOLMOD(band_inplace) (0, ncol, 0, A, Common) ;
-	}
-	else if (A->stype < 0)
-	{
-	    CHOLMOD(band_inplace) (-nrow, 0, 0, A, Common) ;
-	}
-    }
-
-    ASSERT (CHOLMOD(dump_sparse) (A, "A dropped", Common) >= 0) ;
-    return (TRUE) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_horzcat.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_horzcat.c
deleted file mode 100644
index b57961b..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_horzcat.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_horzcat ============================================ */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* Horizontal concatenation, C = [A , B] in MATLAB notation.
- *
- * A and B can be up/lo/unsym; C is unsymmetric and packed.
- * A and B must have the same number of rows.
- * C is sorted if both A and B are sorted.
- *
- * workspace: Iwork (max (A->nrow, A->ncol, B->nrow, B->ncol)).
- *	allocates temporary copies of A and B if they are symmetric.
- *
- * A and B must have the same numeric xtype, unless values is FALSE.
- * A and B cannot be complex or zomplex, unless values is FALSE.
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-
-/* ========================================================================== */
-/* === cholmod_horzcat ====================================================== */
-/* ========================================================================== */
-
-cholmod_sparse *CHOLMOD(horzcat)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* left matrix to concatenate */
-    cholmod_sparse *B,	/* right matrix to concatenate */
-    int values,		/* if TRUE compute the numerical values of C */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Bx, *Cx ;
-    Int *Ap, *Ai, *Anz, *Bp, *Bi, *Bnz, *Cp, *Ci ;
-    cholmod_sparse *C, *A2, *B2 ;
-    Int apacked, bpacked, ancol, bncol, ncol, nrow, anz, bnz, nz, j, p, pend,
-	pdest ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    RETURN_IF_NULL (B, NULL) ;
-    values = values &&
-	(A->xtype != CHOLMOD_PATTERN) && (B->xtype != CHOLMOD_PATTERN) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    RETURN_IF_XTYPE_INVALID (B, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    if (A->nrow != B->nrow)
-    {
-	/* A and B must have the same number of rows */
-	ERROR (CHOLMOD_INVALID, "A and B must have same # rows") ;
-	return (NULL) ;
-    }
-    /* A and B must have the same numerical type if values is TRUE (both must
-     * be CHOLMOD_REAL, this is implicitly checked above) */
-
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    ancol = A->ncol ;
-    bncol = B->ncol ;
-    nrow = A->nrow ;
-    CHOLMOD(allocate_work) (0, MAX3 (nrow, ancol, bncol), 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    /* convert A to unsymmetric, if necessary */
-    A2 = NULL ;
-    if (A->stype != 0)
-    {
-	/* workspace: Iwork (max (A->nrow,A->ncol)) */
-	A2 = CHOLMOD(copy) (A, 0, values, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    return (NULL) ;
-	}
-	A = A2 ;
-    }
-
-    /* convert B to unsymmetric, if necessary */
-    B2 = NULL ;
-    if (B->stype != 0)
-    {
-	/* workspace: Iwork (max (B->nrow,B->ncol)) */
-	B2 = CHOLMOD(copy) (B, 0, values, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    CHOLMOD(free_sparse) (&A2, Common) ;
-	    return (NULL) ;
-	}
-	B = B2 ;
-    }
-
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    apacked = A->packed ;
-
-    Bp  = B->p ;
-    Bnz = B->nz ;
-    Bi  = B->i ;
-    Bx  = B->x ;
-    bpacked = B->packed ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate C */
-    /* ---------------------------------------------------------------------- */
-
-    anz = CHOLMOD(nnz) (A, Common) ;
-    bnz = CHOLMOD(nnz) (B, Common) ;
-    ncol = ancol + bncol ;
-    nz = anz + bnz ;
-
-    C = CHOLMOD(allocate_sparse) (nrow, ncol, nz, A->sorted && B->sorted, TRUE,
-	    0, values ? A->xtype : CHOLMOD_PATTERN, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	CHOLMOD(free_sparse) (&A2, Common) ;
-	CHOLMOD(free_sparse) (&B2, Common) ;
-	return (NULL) ;
-    }
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* C = [A , B] */
-    /* ---------------------------------------------------------------------- */
-
-    pdest = 0 ;
-
-    /* copy A as the first A->ncol columns of C */
-    for (j = 0 ; j < ancol ; j++)
-    {
-	/* A(:,j) is the jth column of C */
-	p = Ap [j] ;
-	pend = (apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-	Cp [j] = pdest ;
-	for ( ; p < pend ; p++)
-	{
-	    Ci [pdest] = Ai [p] ;
-	    if (values) Cx [pdest] = Ax [p] ;
-	    pdest++ ;
-	}
-    }
-
-    /* copy B as the next B->ncol columns of C */
-    for (j = 0 ; j < bncol ; j++)
-    {
-	/* B(:,j) is the (ancol+j)th column of C */
-	p = Bp [j] ;
-	pend = (bpacked) ? (Bp [j+1]) : (p + Bnz [j]) ;
-	Cp [ancol + j] = pdest ;
-	for ( ; p < pend ; p++)
-	{
-	    Ci [pdest] = Bi [p] ;
-	    if (values) Cx [pdest] = Bx [p] ;
-	    pdest++ ;
-	}
-    }
-    Cp [ncol] = pdest ;
-    ASSERT (pdest == anz + bnz) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* free the unsymmetric copies of A and B, and return C */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(free_sparse) (&A2, Common) ;
-    CHOLMOD(free_sparse) (&B2, Common) ;
-    return (C) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_norm.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_norm.c
deleted file mode 100644
index 4864853..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_norm.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_norm =============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* r = norm (A), compute the infinity-norm, 1-norm, or 2-norm of a sparse or
- * dense matrix.  Can compute the 2-norm only for a dense column vector.
- * Returns -1 if an error occurs.
- *
- * Pattern, real, complex, and zomplex sparse matrices are supported.
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-
-/* ========================================================================== */
-/* === abs_value ============================================================ */
-/* ========================================================================== */
-
-/* Compute the absolute value of a real, complex, or zomplex value */
-
-static double abs_value
-(
-    int xtype,
-    double *Ax,
-    double *Az,
-    Int p,
-    cholmod_common *Common
-)
-{
-    double s = 0 ;
-    switch (xtype)
-    {
-	case CHOLMOD_PATTERN:
-	    s = 1 ;
-	    break ;
-
-	case CHOLMOD_REAL:
-	    s = fabs (Ax [p]) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    s = SuiteSparse_config.hypot_func (Ax [2*p], Ax [2*p+1]) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    s = SuiteSparse_config.hypot_func (Ax [p], Az [p]) ;
-	    break ;
-    }
-    return (s) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_norm_dense =================================================== */
-/* ========================================================================== */
-
-double CHOLMOD(norm_dense)
-(
-    /* ---- input ---- */
-    cholmod_dense *X,	/* matrix to compute the norm of */
-    int norm,		/* type of norm: 0: inf. norm, 1: 1-norm, 2: 2-norm */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double xnorm, s, x, z ;
-    double *Xx, *Xz, *W ;
-    Int nrow, ncol, d, i, j, use_workspace, xtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (EMPTY) ;
-    RETURN_IF_NULL (X, EMPTY) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, EMPTY) ;
-    Common->status = CHOLMOD_OK ;
-    ncol = X->ncol ;
-    if (norm < 0 || norm > 2 || (norm == 2 && ncol > 1))
-    {
-	ERROR (CHOLMOD_INVALID, "invalid norm") ;
-	return (EMPTY) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nrow = X->nrow ;
-    d = X->d ;
-    Xx = X->x ;
-    Xz = X->z ;
-    xtype = X->xtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace, if needed */
-    /* ---------------------------------------------------------------------- */
-
-    W = NULL ;
-    use_workspace = (norm == 0 && ncol > 4) ;
-    if (use_workspace)
-    {
-	CHOLMOD(allocate_work) (0, 0, nrow, Common) ;
-	W = Common->Xwork ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* oops, no workspace */
-	    use_workspace = FALSE ;
-	}
-    }
-
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the norm */
-    /* ---------------------------------------------------------------------- */
-
-    xnorm = 0 ;
-
-    if (use_workspace)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* infinity-norm = max row sum, using stride-1 access of X */
-	/* ------------------------------------------------------------------ */
-
-	DEBUG (for (i = 0 ; i < nrow ; i++) ASSERT (W [i] == 0)) ;
-
-	/* this is faster than stride-d, but requires O(nrow) workspace */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    for (i = 0 ; i < nrow ; i++)
-	    {
-		W [i] += abs_value (xtype, Xx, Xz, i+j*d, Common) ;
-	    }
-	}
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    s = W [i] ;
-	    if ((IS_NAN (s) || s > xnorm) && !IS_NAN (xnorm))
-	    {
-		xnorm = s ;
-	    }
-	    W [i] = 0 ;
-	}
-
-    }
-    else if (norm == 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* infinity-norm = max row sum, using stride-d access of X */
-	/* ------------------------------------------------------------------ */
-
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    s = 0 ;
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		s += abs_value (xtype, Xx, Xz, i+j*d, Common) ;
-	    }
-	    if ((IS_NAN (s) || s > xnorm) && !IS_NAN (xnorm))
-	    {
-		xnorm = s ;
-	    }
-	}
-
-    }
-    else if (norm == 1)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* 1-norm = max column sum */
-	/* ------------------------------------------------------------------ */
-
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    s = 0 ;
-	    for (i = 0 ; i < nrow ; i++)
-	    {
-		s += abs_value (xtype, Xx, Xz, i+j*d, Common) ;
-	    }
-	    if ((IS_NAN (s) || s > xnorm) && !IS_NAN (xnorm))
-	    {
-		xnorm = s ;
-	    }
-	}
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* 2-norm = sqrt (sum (X.^2)) */
-	/* ------------------------------------------------------------------ */
-
-	switch (xtype)
-	{
-
-	    case CHOLMOD_REAL:
-		for (i = 0 ; i < nrow ; i++)
-		{
-		    x = Xx [i] ;
-		    xnorm += x*x ;
-		}
-		break ; 
-
-	    case CHOLMOD_COMPLEX:
-		for (i = 0 ; i < nrow ; i++)
-		{
-		    x = Xx [2*i  ] ;
-		    z = Xx [2*i+1] ;
-		    xnorm += x*x + z*z ;
-		}
-		break ; 
-
-	    case CHOLMOD_ZOMPLEX:
-		for (i = 0 ; i < nrow ; i++)
-		{
-		    x = Xx [i] ;
-		    z = Xz [i] ;
-		    xnorm += x*x + z*z ;
-		}
-		break ; 
-	}
-
-	xnorm = sqrt (xnorm) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    return (xnorm) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_norm_sparse ================================================== */
-/* ========================================================================== */
-
-double CHOLMOD(norm_sparse)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to compute the norm of */
-    int norm,		/* type of norm: 0: inf. norm, 1: 1-norm */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double anorm, s ;
-    double *Ax, *Az, *W ;
-    Int *Ap, *Ai, *Anz ;
-    Int i, j, p, pend, nrow, ncol, packed, xtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (EMPTY) ;
-    RETURN_IF_NULL (A, EMPTY) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, EMPTY) ;
-    Common->status = CHOLMOD_OK ;
-    ncol = A->ncol ;
-    nrow = A->nrow ;
-    if (norm < 0 || norm > 1)
-    {
-	ERROR (CHOLMOD_INVALID, "invalid norm") ;
-	return (EMPTY) ;
-    }
-    if (A->stype && nrow != ncol)
-    {
-	ERROR (CHOLMOD_INVALID, "matrix invalid") ;
-	return (EMPTY) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Az = A->z ;
-    Anz = A->nz ;
-    packed = A->packed ;
-    xtype = A->xtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace, if needed */
-    /* ---------------------------------------------------------------------- */
-
-    W = NULL ;
-    if (A->stype || norm == 0)
-    {
-	CHOLMOD(allocate_work) (0, 0, nrow, Common) ;
-	W = Common->Xwork ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    return (EMPTY) ;
-	}
-	DEBUG (for (i = 0 ; i < nrow ; i++) ASSERT (W [i] == 0)) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the norm */
-    /* ---------------------------------------------------------------------- */
-
-    anorm = 0 ;
-
-    if (A->stype > 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A is symmetric with upper triangular part stored */
-	/* ------------------------------------------------------------------ */
-
-	/* infinity-norm = 1-norm = max row/col sum */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		s = abs_value (xtype, Ax, Az, p, Common) ;
-		if (i == j)
-		{
-		    W [i] += s ;
-		}
-		else if (i < j)
-		{
-		    W [i] += s ;
-		    W [j] += s ;
-		}
-	    }
-	}
-
-    }
-    else if (A->stype < 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A is symmetric with lower triangular part stored */
-	/* ------------------------------------------------------------------ */
-
-	/* infinity-norm = 1-norm = max row/col sum */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		i = Ai [p] ;
-		s = abs_value (xtype, Ax, Az, p, Common) ;
-		if (i == j)
-		{
-		    W [i] += s ;
-		}
-		else if (i > j)
-		{
-		    W [i] += s ;
-		    W [j] += s ;
-		}
-	    }
-	}
-
-    }
-    else if (norm == 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A is unsymmetric, compute the infinity-norm */
-	/* ------------------------------------------------------------------ */
-
-	/* infinity-norm = max row sum */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		W [Ai [p]] += abs_value (xtype, Ax, Az, p, Common) ;
-	    }
-	}
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A is unsymmetric, compute the 1-norm */
-	/* ------------------------------------------------------------------ */
-
-	/* 1-norm = max column sum */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    if (xtype == CHOLMOD_PATTERN)
-	    {
-		s = pend - p ;
-	    }
-	    else
-	    {
-		s = 0 ;
-		for ( ; p < pend ; p++)
-		{
-		    s += abs_value (xtype, Ax, Az, p, Common) ;
-		}
-	    }
-	    if ((IS_NAN (s) || s > anorm) && !IS_NAN (anorm))
-	    {
-		anorm = s ;
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* compute the max row sum */
-    /* ---------------------------------------------------------------------- */
-
-    if (A->stype || norm == 0)
-    {
-	for (i = 0 ; i < nrow ; i++)
-	{
-	    s = W [i] ;
-	    if ((IS_NAN (s) || s > anorm) && !IS_NAN (anorm))
-	    {
-		anorm = s ;
-	    }
-	    W [i] = 0 ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    return (anorm) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_scale.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_scale.c
deleted file mode 100644
index e2bf173..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_scale.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_scale ============================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* scale a matrix:  A = diag(s)*A, A*diag(s), s*A, or diag(s)*A*diag(s)
- *
- * A can be of any type (packed/unpacked, upper/lower/unsymmetric).
- * The symmetry of A is ignored; all entries in the matrix are modified.
- *
- * If A is m-by-n unsymmetric but scaled symmtrically, the result is
- * A = diag (s (1:m)) * A * diag (s (1:n)).
- *
- * Note: diag(s) should be interpretted as spdiags(s,0,n,n) where n=length(s).
- *
- * Row or column scaling of a symmetric matrix still results in a symmetric
- * matrix, since entries are still ignored by other routines.
- * For example, when row-scaling a symmetric matrix where just the upper
- * triangular part is stored (and lower triangular entries ignored)
- * A = diag(s)*triu(A) is performed, where the result A is also
- * symmetric-upper.  This has the effect of modifying the implicit lower
- * triangular part.  In MATLAB notation:
- *
- *	U = diag(s)*triu(A) ;
- *	L = tril (U',-1)
- *	A = L + U ;
- *
- * The scale parameter determines the kind of scaling to perform:
- *
- *	 CHOLMOD_SCALAR: s[0]*A
- *	 CHOLMOD_ROW:    diag(s)*A
- *	 CHOLMOD_COL:    A*diag(s)
- *	 CHOLMOD_SYM:    diag(s)*A*diag(s)
- *
- * The size of S depends on the scale parameter:
- *
- *	 CHOLMOD_SCALAR: size 1
- *	 CHOLMOD_ROW:    size nrow-by-1 or 1-by-nrow
- *	 CHOLMOD_COL:    size ncol-by-1 or 1-by-ncol
- *	 CHOLMOD_SYM:    size max(nrow,ncol)-by-1, or 1-by-max(nrow,ncol)
- *
- * workspace: none
- *
- * Only real matrices are supported.
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-
-/* ========================================================================== */
-/* === cholmod_scale ======================================================== */
-/* ========================================================================== */
-
-int CHOLMOD(scale)
-(
-    /* ---- input ---- */
-    cholmod_dense *S,	/* scale factors (scalar or vector) */
-    int scale,		/* type of scaling to compute */
-    /* ---- in/out --- */
-    cholmod_sparse *A,	/* matrix to scale */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double t ;
-    double *Ax, *s ;
-    Int *Ap, *Anz, *Ai ;
-    Int packed, j, ncol, nrow, p, pend, sncol, snrow, nn, ok ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (S, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_REAL, CHOLMOD_REAL, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (S, CHOLMOD_REAL, CHOLMOD_REAL, FALSE) ;
-    ncol = A->ncol ;
-    nrow = A->nrow ;
-    sncol = S->ncol ;
-    snrow = S->nrow ;
-    if (scale == CHOLMOD_SCALAR)
-    {
-	ok = (snrow == 1 && sncol == 1) ;
-    }
-    else if (scale == CHOLMOD_ROW)
-    {
-	ok = (snrow == nrow && sncol == 1) || (snrow == 1 && sncol == nrow) ;
-    }
-    else if (scale == CHOLMOD_COL)
-    {
-	ok = (snrow == ncol && sncol == 1) || (snrow == 1 && sncol == ncol) ;
-    }
-    else if (scale == CHOLMOD_SYM)
-    {
-	nn = MAX (nrow, ncol) ;
-	ok = (snrow == nn && sncol == 1) || (snrow == 1 && sncol == nn) ;
-    }
-    else
-    {
-	/* scale invalid */
-	ERROR (CHOLMOD_INVALID, "invalid scaling option") ;
-	return (FALSE) ;
-    }
-    if (!ok)
-    {
-	/* S is wrong size */
-	ERROR (CHOLMOD_INVALID, "invalid scale factors") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    packed = A->packed ;
-    s = S->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* scale the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    if (scale == CHOLMOD_ROW)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A = diag(s)*A, row scaling */
-	/* ------------------------------------------------------------------ */
-
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		Ax [p] *= s [Ai [p]] ;
-	    }
-	}
-
-    }
-    else if (scale == CHOLMOD_COL)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A = A*diag(s), column scaling */
-	/* ------------------------------------------------------------------ */
-
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    t = s [j] ;
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		Ax [p] *= t ;
-	    }
-	}
-
-    }
-    else if (scale == CHOLMOD_SYM)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A = diag(s)*A*diag(s), symmetric scaling */
-	/* ------------------------------------------------------------------ */
-
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    t = s [j] ;
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		Ax [p] *= t * s [Ai [p]] ;
-	    }
-	}
-
-    }
-    else if (scale == CHOLMOD_SCALAR)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* A = s[0] * A, scalar scaling */
-	/* ------------------------------------------------------------------ */
-
-	t = s [0] ;
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		Ax [p] *= t ;
-	    }
-	}
-    }
-
-    ASSERT (CHOLMOD(dump_sparse) (A, "A scaled", Common) >= 0) ;
-    return (TRUE) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_sdmult.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_sdmult.c
deleted file mode 100644
index 876921d..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_sdmult.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_sdmult ============================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* Sparse matrix times dense matrix:
- * Y = alpha*(A*X) + beta*Y or Y = alpha*(A'*X) + beta*Y,
- * where A is sparse and X and Y are dense.
- *
- * when using A,  X has A->ncol columns and Y has A->nrow rows
- * when using A', X has A->nrow columns and Y has A->ncol rows
- *
- * workspace: none in Common.  Temporary workspace of size 4*(X->nrow) is used
- * if A is stored in symmetric form and X has four columns or more.  If the
- * workspace is not available, a slower method is used instead that requires
- * no workspace.
- *
- * transpose = 0: use A
- * otherwise, use A'  (complex conjugate transpose)
- *
- * transpose is ignored if the matrix is symmetric or Hermitian.
- * (the array transpose A.' is not supported).
- *
- * Supports real, complex, and zomplex matrices, but the xtypes of A, X, and Y
- * must all match.
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-
-/* ========================================================================== */
-/* === TEMPLATE ============================================================= */
-/* ========================================================================== */
-
-#define REAL
-#include "t_cholmod_sdmult.c"
-#define COMPLEX
-#include "t_cholmod_sdmult.c"
-#define ZOMPLEX
-#include "t_cholmod_sdmult.c"
-
-/* ========================================================================== */
-/* === cholmod_sdmult ======================================================= */
-/* ========================================================================== */
-
-int CHOLMOD(sdmult)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* sparse matrix to multiply */
-    int transpose,	/* use A if 0, otherwise use A' */
-    double alpha [2],   /* scale factor for A */
-    double beta [2],    /* scale factor for Y */
-    cholmod_dense *X,	/* dense matrix to multiply */
-    /* ---- in/out --- */
-    cholmod_dense *Y,	/* resulting dense matrix */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *w ;
-    size_t nx, ny ;
-    Int e ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (X, FALSE) ;
-    RETURN_IF_NULL (Y, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (Y, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    ny = transpose ? A->ncol : A->nrow ;	/* required length of Y */
-    nx = transpose ? A->nrow : A->ncol ;	/* required length of X */
-    if (X->nrow != nx || X->ncol != Y->ncol || Y->nrow != ny)
-    {
-	/* X and/or Y have the wrong dimension */
-	ERROR (CHOLMOD_INVALID, "X and/or Y have wrong dimensions") ;
-	return (FALSE) ;
-    }
-    if (A->xtype != X->xtype || A->xtype != Y->xtype)
-    {
-	ERROR (CHOLMOD_INVALID, "A, X, and Y must have same xtype") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace, if required */
-    /* ---------------------------------------------------------------------- */
-
-    w = NULL ;
-    e = (A->xtype == CHOLMOD_REAL ? 1:2) ;
-    if (A->stype && X->ncol >= 4)
-    {
-	w = CHOLMOD(malloc) (nx, 4*e*sizeof (double), Common) ;
-    }
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;    /* out of memory */
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* Y = alpha*op(A)*X + beta*Y via template routine */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_sparse) (A, "A", Common) >= 0) ;
-    DEBUG (CHOLMOD(dump_dense) (X, "X", Common)) ;
-    DEBUG (if (IS_NONZERO (beta [0])
-	   || (IS_NONZERO (beta [1]) && A->xtype != CHOLMOD_REAL))
-	    CHOLMOD(dump_dense) (Y, "Y", Common)) ;
-
-    switch (A->xtype)
-    {
-
-	case CHOLMOD_REAL:
-	    r_cholmod_sdmult (A, transpose, alpha, beta, X, Y, w) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    c_cholmod_sdmult (A, transpose, alpha, beta, X, Y, w) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    z_cholmod_sdmult (A, transpose, alpha, beta, X, Y, w) ;
-	    break ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* free workspace */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(free) (4*nx, e*sizeof (double), w, Common) ;
-    DEBUG (CHOLMOD(dump_dense) (Y, "Y", Common)) ;
-    return (TRUE) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_ssmult.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_ssmult.c
deleted file mode 100644
index 13b3a40..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_ssmult.c
+++ /dev/null
@@ -1,489 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_ssmult ============================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* C = A*B.  Multiply two sparse matrices.
- *
- * A and B can be packed or unpacked, sorted or unsorted, and of any stype.
- * If A or B are symmetric, an internal unsymmetric copy is made first, however.
- * C is computed as if A and B are unsymmetric, and then if the stype input
- * parameter requests a symmetric form (upper or lower) the matrix is converted
- * into that form.
- *
- * C is returned as packed, and either unsorted or sorted, depending on the
- * "sorted" input parameter.  If C is returned sorted, then either C = (B'*A')'
- * or C = (A*B)'' is computed, depending on the number of nonzeros in A, B, and
- * C.
- *
- * workspace:
- *	if C unsorted: Flag (A->nrow), W (A->nrow) if values
- *	if C sorted:   Flag (B->ncol), W (B->ncol) if values
- *	Iwork (max (A->ncol, A->nrow, B->nrow, B->ncol))
- *	allocates temporary copies for A, B, and C, if required.
- *
- * Only pattern and real matrices are supported.  Complex and zomplex matrices
- * are supported only when the numerical values are not computed ("values"
- * is FALSE).
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-
-/* ========================================================================== */
-/* === cholmod_ssmult ======================================================= */
-/* ========================================================================== */
-
-cholmod_sparse *CHOLMOD(ssmult)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* left matrix to multiply */
-    cholmod_sparse *B,	/* right matrix to multiply */
-    int stype,		/* requested stype of C */
-    int values,		/* TRUE: do numerical values, FALSE: pattern only */
-    int sorted,		/* if TRUE then return C with sorted columns */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double bjt ;
-    double *Ax, *Bx, *Cx, *W ;
-    Int *Ap, *Anz, *Ai, *Bp, *Bnz, *Bi, *Cp, *Ci, *Flag ;
-    cholmod_sparse *C, *A2, *B2, *A3, *B3, *C2 ;
-    Int apacked, bpacked, j, i, pa, paend, pb, pbend, ncol, mark, cnz, t, p,
-	nrow, anz, bnz, do_swap_and_transpose, n1, n2 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    RETURN_IF_NULL (B, NULL) ;
-    values = values &&
-	(A->xtype != CHOLMOD_PATTERN) && (B->xtype != CHOLMOD_PATTERN) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, 
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    RETURN_IF_XTYPE_INVALID (B, CHOLMOD_PATTERN, 
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    if (A->ncol != B->nrow)
-    {
-	/* inner dimensions must agree */
-	ERROR (CHOLMOD_INVALID, "A and B inner dimensions must match") ;
-	return (NULL) ;
-    }
-    /* A and B must have the same numerical type if values is TRUE (both must
-     * be CHOLMOD_REAL, this is implicitly checked above) */
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    if (A->nrow <= 1)
-    {
-	/* C will be implicitly sorted, so no need to sort it here */
-	sorted = FALSE ;
-    }
-    if (sorted)
-    {
-	n1 = MAX (A->nrow, B->ncol) ;
-    }
-    else
-    {
-	n1 = A->nrow ;
-    }
-    n2 = MAX4 (A->ncol, A->nrow, B->nrow, B->ncol) ;
-    CHOLMOD(allocate_work) (n1, n2, values ? n1 : 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	return (NULL) ;
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1 : 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    /* convert A to unsymmetric, if necessary */
-    A2 = NULL ;
-    B2 = NULL ;
-    if (A->stype)
-    {
-	/* workspace: Iwork (max (A->nrow,A->ncol)) */
-	A2 = CHOLMOD(copy) (A, 0, values, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common)) ;
-	    return (NULL) ;
-	}
-	A = A2 ;
-    }
-
-    /* convert B to unsymmetric, if necessary */
-    if (B->stype)
-    {
-	/* workspace: Iwork (max (B->nrow,B->ncol)) */
-	B2 = CHOLMOD(copy) (B, 0, values, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    CHOLMOD(free_sparse) (&A2, Common) ;
-	    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common)) ;
-	    return (NULL) ;
-	}
-	B = B2 ;
-    }
-
-    ASSERT (CHOLMOD(dump_sparse) (A, "A", Common) >= 0) ;
-    ASSERT (CHOLMOD(dump_sparse) (B, "B", Common) >= 0) ;
-
-    /* get the A matrix */
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    apacked = A->packed ;
-
-    /* get the B matrix */
-    Bp  = B->p ;
-    Bnz = B->nz ;
-    Bi  = B->i ;
-    Bx  = B->x ;
-    bpacked = B->packed ;
-
-    /* get the size of C */
-    nrow = A->nrow ;
-    ncol = B->ncol ;
-
-    /* get workspace */
-    W = Common->Xwork ;		/* size nrow, unused if values is FALSE */
-    Flag = Common->Flag ;	/* size nrow, Flag [0..nrow-1] < mark on input*/
-
-    /* ---------------------------------------------------------------------- */
-    /* count the number of entries in the result C */
-    /* ---------------------------------------------------------------------- */
-
-    cnz = 0 ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	/* clear the Flag array */
-	/* mark = CHOLMOD(clear_flag) (Common) ; */
-	CHOLMOD_CLEAR_FLAG (Common) ;
-	mark = Common->mark ;
-
-	/* for each nonzero B(t,j) in column j, do: */
-	pb = Bp [j] ;
-	pbend = (bpacked) ? (Bp [j+1]) : (pb + Bnz [j]) ;
-	for ( ; pb < pbend ; pb++)
-	{
-	    /* B(t,j) is nonzero */
-	    t = Bi [pb] ;
-
-	    /* add the nonzero pattern of A(:,t) to the pattern of C(:,j) */
-	    pa = Ap [t] ;
-	    paend = (apacked) ? (Ap [t+1]) : (pa + Anz [t]) ;
-	    for ( ; pa < paend ; pa++)
-	    {
-		i = Ai [pa] ;
-		if (Flag [i] != mark)
-		{
-		    Flag [i] = mark ;
-		    cnz++ ;
-		}
-	    }
-	}
-	if (cnz < 0)
-	{
-	    break ;	    /* integer overflow case */
-	}
-    }
-
-    /* mark = CHOLMOD(clear_flag) (Common) ; */
-    CHOLMOD_CLEAR_FLAG (Common) ;
-    mark = Common->mark ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check for integer overflow */
-    /* ---------------------------------------------------------------------- */
-
-    if (cnz < 0)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	CHOLMOD(free_sparse) (&A2, Common) ;
-	CHOLMOD(free_sparse) (&B2, Common) ;
-	ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common)) ;
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* Determine how to return C sorted (if requested) */
-    /* ---------------------------------------------------------------------- */
-
-    do_swap_and_transpose = FALSE ;
-
-    if (sorted)
-    {
-	/* Determine the best way to return C with sorted columns.  Computing
-	 * C = (B'*A')' takes cnz + anz + bnz time (ignoring O(n) terms).
-	 * Sorting C when done, C = (A*B)'', takes 2*cnz time.  Pick the one
-	 * with the least amount of work. */
-
-	anz = CHOLMOD(nnz) (A, Common) ;
-	bnz = CHOLMOD(nnz) (B, Common) ;
-
-	do_swap_and_transpose = (anz + bnz < cnz) ;
-
-	if (do_swap_and_transpose)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* C = (B'*A')' */
-	    /* -------------------------------------------------------------- */
-
-	    /* workspace: Iwork (A->nrow) */
-	    A3 = CHOLMOD(ptranspose) (A, values, NULL, NULL, 0, Common) ;
-	    CHOLMOD(free_sparse) (&A2, Common) ;
-	    A2 = A3 ;
-	    if (Common->status < CHOLMOD_OK)
-	    {
-		/* out of memory */
-		CHOLMOD(free_sparse) (&A2, Common) ;
-		CHOLMOD(free_sparse) (&B2, Common) ;
-		ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common));
-		return (NULL) ;
-	    }
-	    /* workspace: Iwork (B->nrow) */
-	    B3 = CHOLMOD(ptranspose) (B, values, NULL, NULL, 0, Common) ;
-	    CHOLMOD(free_sparse) (&B2, Common) ;
-	    B2 = B3 ;
-	    if (Common->status < CHOLMOD_OK)
-	    {
-		/* out of memory */
-		CHOLMOD(free_sparse) (&A2, Common) ;
-		CHOLMOD(free_sparse) (&B2, Common) ;
-		ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common));
-		return (NULL) ;
-	    }
-	    A = B2 ;
-	    B = A2 ;
-
-	    /* get the new A matrix */
-	    Ap  = A->p ;
-	    Anz = A->nz ;
-	    Ai  = A->i ;
-	    Ax  = A->x ;
-	    apacked = A->packed ;
-
-	    /* get the new B matrix */
-	    Bp  = B->p ;
-	    Bnz = B->nz ;
-	    Bi  = B->i ;
-	    Bx  = B->x ;
-	    bpacked = B->packed ;
-
-	    /* get the size of C' */
-	    nrow = A->nrow ;
-	    ncol = B->ncol ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate C */
-    /* ---------------------------------------------------------------------- */
-
-    C = CHOLMOD(allocate_sparse) (nrow, ncol, cnz, FALSE, TRUE, 0,
-	    values ? A->xtype : CHOLMOD_PATTERN, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	CHOLMOD(free_sparse) (&A2, Common) ;
-	CHOLMOD(free_sparse) (&B2, Common) ;
-	ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common)) ;
-	return (NULL) ;
-    }
-
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* C = A*B */
-    /* ---------------------------------------------------------------------- */
-
-    cnz = 0 ;
-
-    if (values)
-    {
-
-	/* pattern and values */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    /* clear the Flag array */
-	    /* mark = CHOLMOD(clear_flag (Common)) ; */
-	    CHOLMOD_CLEAR_FLAG (Common) ;
-	    mark = Common->mark ;
-
-	    /* start column j of C */
-	    Cp [j] = cnz ;
-
-	    /* for each nonzero B(t,j) in column j, do: */
-	    pb = Bp [j] ;
-	    pbend = (bpacked) ? (Bp [j+1]) : (pb + Bnz [j]) ;
-	    for ( ; pb < pbend ; pb++)
-	    {
-		/* B(t,j) is nonzero */
-		t = Bi [pb] ;
-		bjt = Bx [pb] ;
-
-		/* add the nonzero pattern of A(:,t) to the pattern of C(:,j)
-		 * and scatter the values into W */
-		pa = Ap [t] ;
-		paend = (apacked) ? (Ap [t+1]) : (pa + Anz [t]) ;
-		for ( ; pa < paend ; pa++)
-		{
-		    i = Ai [pa] ;
-		    if (Flag [i] != mark)
-		    {
-			Flag [i] = mark ;
-			Ci [cnz++] = i ;
-		    }
-		    W [i] += Ax [pa] * bjt ;
-		}
-	    }
-
-	    /* gather the values into C(:,j) */
-	    for (p = Cp [j] ; p < cnz ; p++)
-	    {
-		i = Ci [p] ;
-		Cx [p] = W [i] ;
-		W [i] = 0 ;
-	    }
-	}
-
-    }
-    else
-    {
-
-	/* pattern only */
-	for (j = 0 ; j < ncol ; j++)
-	{
-	    /* clear the Flag array */
-	    /* mark = CHOLMOD(clear_flag) (Common) ; */
-	    CHOLMOD_CLEAR_FLAG (Common) ;
-	    mark = Common->mark ;
-
-	    /* start column j of C */
-	    Cp [j] = cnz ;
-
-	    /* for each nonzero B(t,j) in column j, do: */
-	    pb = Bp [j] ;
-	    pbend = (bpacked) ? (Bp [j+1]) : (pb + Bnz [j]) ;
-	    for ( ; pb < pbend ; pb++)
-	    {
-		/* B(t,j) is nonzero */
-		t = Bi [pb] ;
-
-		/* add the nonzero pattern of A(:,t) to the pattern of C(:,j) */
-		pa = Ap [t] ;
-		paend = (apacked) ? (Ap [t+1]) : (pa + Anz [t]) ;
-		for ( ; pa < paend ; pa++)
-		{
-		    i = Ai [pa] ;
-		    if (Flag [i] != mark)
-		    {
-			Flag [i] = mark ;
-			Ci [cnz++] = i ;
-		    }
-		}
-	    }
-	}
-    }
-
-    Cp [ncol] = cnz ;
-    ASSERT (MAX (1,cnz) == C->nzmax) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* clear workspace and free temporary matrices */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(free_sparse) (&A2, Common) ;
-    CHOLMOD(free_sparse) (&B2, Common) ;
-    /* CHOLMOD(clear_flag) (Common) ; */
-    CHOLMOD_CLEAR_FLAG (Common) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* convert C to a symmetric upper/lower matrix if requested */
-    /* ---------------------------------------------------------------------- */
-
-    /* convert C in place, which cannot fail since no memory is allocated */
-    if (stype > 0)
-    {
-	/* C = triu (C), in place */
-	(void) CHOLMOD(band_inplace) (0, ncol, values, C, Common) ;
-	C->stype = 1 ;
-    }
-    else if (stype < 0)
-    {
-	/* C = tril (C), in place */
-	(void) CHOLMOD(band_inplace) (-nrow, 0, values, C, Common) ;
-	C->stype = -1 ;
-    }
-    ASSERT (Common->status >= CHOLMOD_OK) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* sort C, if requested */
-    /* ---------------------------------------------------------------------- */
-
-    if (sorted)
-    {
-	if (do_swap_and_transpose)
-	{
-	    /* workspace: Iwork (C->ncol), which is A->nrow since C=(B'*A') */
-	    C2 = CHOLMOD(ptranspose) (C, values, NULL, NULL, 0, Common) ;
-	    CHOLMOD(free_sparse) (&C, Common) ;
-	    if (Common->status < CHOLMOD_OK)
-	    {
-		/* out of memory */
-		ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common));
-		return (NULL) ;
-	    }
-	    C = C2 ;
-	}
-	else
-	{
-	    /* workspace: Iwork (max (C->nrow,C->ncol)) */
-	    if (!CHOLMOD(sort) (C, Common))
-	    {
-		/* out of memory */
-		CHOLMOD(free_sparse) (&C, Common) ;
-		ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common));
-		return (NULL) ;
-	    }
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    DEBUG (CHOLMOD(dump_sparse) (C, "ssmult", Common) >= 0) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, values ? n1:0, Common)) ;
-    return (C) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_submatrix.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_submatrix.c
deleted file mode 100644
index 7acb9c0..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_submatrix.c
+++ /dev/null
@@ -1,427 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_submatrix ========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* C = A (rset,cset), where C becomes length(rset)-by-length(cset) in dimension.
- * rset and cset can have duplicate entries.  A and C must be unsymmetric.   C
- * is packed.  If the sorted flag is TRUE on input, or rset is sorted and A is
- * sorted, then C is sorted; otherwise C is unsorted.
- *
- * A NULL rset or cset means "[ ]" in MATLAB notation.
- * If the length of rset or cset is negative, it denotes ":" in MATLAB notation.
- *
- * For permuting a matrix, this routine is an alternative to cholmod_ptranspose
- * (which permutes and transposes a matrix and can work on symmetric matrices).
- *
- * The time taken by this routine is O(A->nrow) if the Common workspace needs
- * to be initialized, plus O(C->nrow + C->ncol + nnz (A (:,cset))).  Thus, if C
- * is small and the workspace is not initialized, the time can be dominated by
- * the call to cholmod_allocate_work.  However, once the workspace is
- * allocated, subsequent calls take less time.
- *
- * workspace:  Iwork (max (A->nrow + length (rset), length (cset))).
- *	allocates temporary copy of C if it is to be returned sorted.
- *
- * Future work:  A common case occurs where A has sorted columns, and rset is in
- * the form lo:hi in MATLAB notation.  This routine could exploit that case
- * to run even faster when the matrix is sorted, particularly when lo is small.
- *
- * Only pattern and real matrices are supported.  Complex and zomplex matrices
- * are supported only when "values" is FALSE.
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-/* ========================================================================== */
-/* === check_subset ========================================================= */
-/* ========================================================================== */
-
-/* Check the rset or cset, and return TRUE if valid, FALSE if invalid */
-
-static int check_subset (Int *set, Int len, Int n)
-{
-    Int k ;
-    if (set == NULL)
-    {
-	return (TRUE) ;
-    }
-    for (k = 0 ; k < len ; k++)
-    {
-	if (set [k] < 0 || set [k] >= n)
-	{
-	    return (FALSE) ;
-	}
-    }
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_submatrix ==================================================== */
-/* ========================================================================== */
-
-cholmod_sparse *CHOLMOD(submatrix)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to subreference */
-    Int *rset,		/* set of row indices, duplicates OK */
-    SuiteSparse_long rsize,	/* size of rset, or -1 for ":" */
-    Int *cset,		/* set of column indices, duplicates OK */
-    SuiteSparse_long csize,	/* size of cset, or -1 for ":" */
-    int values,		/* if TRUE compute the numerical values of C */
-    int sorted,		/* if TRUE then return C with sorted columns */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double aij = 0 ;
-    double *Ax, *Cx ;
-    Int *Ap, *Ai, *Anz, *Ci, *Cp, *Head, *Rlen, *Rnext, *Iwork ;
-    cholmod_sparse *C ;
-    Int packed, ancol, anrow, cnrow, cncol, nnz, i, j, csorted, ilast, p,
-	pend, pdest, ci, cj, head, nr, nc ;
-    size_t s ;
-    int ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    values = (values && (A->xtype != CHOLMOD_PATTERN)) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    if (A->stype != 0)
-    {
-	/* A must be unsymmetric */
-	ERROR (CHOLMOD_INVALID, "symmetric upper or lower case not supported") ;
-	return (NULL) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    ancol = A->ncol ;
-    anrow = A->nrow ;
-    nr = rsize ;
-    nc = csize ;
-    if (rset == NULL)
-    {
-	/* nr = 0 denotes rset = [ ], nr < 0 denotes rset = 0:anrow-1 */
-	nr = (nr < 0) ? (-1) : 0 ;
-    }
-    if (cset == NULL)
-    {
-	/* nr = 0 denotes cset = [ ], nr < 0 denotes cset = 0:ancol-1 */
-	nc = (nc < 0) ? (-1) : 0 ;
-    }
-    cnrow = (nr < 0) ? anrow : nr ;  /* negative rset means rset = 0:anrow-1 */
-    cncol = (nc < 0) ? ancol : nc ;  /* negative cset means cset = 0:ancol-1 */
-
-    if (nr < 0 && nc < 0)
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* C = A (:,:), use cholmod_copy instead */
-	/* ------------------------------------------------------------------ */
-
-	/* workspace: Iwork (max (C->nrow,C->ncol)) */
-	PRINT1 (("submatrix C = A (:,:)\n")) ;
-	C = CHOLMOD(copy) (A, 0, values, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    return (NULL) ;
-	}
-	return (C) ;
-    }
-    PRINT1 (("submatrix nr "ID" nc "ID" Cnrow "ID" Cncol "ID""
-	    "  Anrow "ID" Ancol "ID"\n", nr, nc, cnrow, cncol, anrow, ancol)) ;
-
-    /* s = MAX3 (anrow+MAX(0,nr), cncol, cnrow) ; */
-    s = CHOLMOD(add_size_t) (anrow, MAX (0,nr), &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (NULL) ;
-    }
-    s = MAX3 (s, ((size_t) cncol), ((size_t) cnrow)) ;
-
-    CHOLMOD(allocate_work) (anrow, s, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	return (NULL) ;
-    }
-
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    packed = A->packed ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    Head  = Common->Head ;	    /* size anrow */
-    Iwork = Common->Iwork ;
-    Rlen  = Iwork ;		    /* size anrow (i/i/l) */
-    Rnext = Iwork + anrow ;	    /* size nr (i/i/l), not used if nr < 0 */
-
-    /* ---------------------------------------------------------------------- */
-    /* construct inverse of rset and compute nnz (C) */
-    /* ---------------------------------------------------------------------- */
-
-    PRINT1 (("nr "ID" nc "ID"\n", nr, nc)) ;
-    PRINT1 (("anrow "ID" ancol "ID"\n", anrow, ancol)) ;
-    PRINT1 (("cnrow "ID" cncol "ID"\n", cnrow, cncol)) ;
-    DEBUG (for (i = 0 ; i < nr ; i++) PRINT2 (("rset ["ID"] = "ID"\n",
-		    i, rset [i])));
-    DEBUG (for (i = 0 ; i < nc ; i++) PRINT2 (("cset ["ID"] = "ID"\n",
-		    i, cset [i])));
-
-    /* C is sorted if A and rset are sorted, or if C has one row or less */
-    csorted = A->sorted || (cnrow <= 1) ;
-
-    if (!check_subset (rset, nr, anrow))
-    {
-	ERROR (CHOLMOD_INVALID, "invalid rset") ;
-	return (NULL) ;
-    }
-
-    if (!check_subset (cset, nc, ancol))
-    {
-	ERROR (CHOLMOD_INVALID, "invalid cset") ;
-	return (NULL) ;
-    }
-
-    nnz = 0 ;
-    if (nr < 0)
-    {
-	/* C = A (:,cset) where cset = [ ] or cset is not empty */
-	ASSERT (IMPLIES (cncol > 0, cset != NULL)) ;
-	for (cj = 0 ; cj < cncol ; cj++)
-	{
-	    /* construct column cj of C, which is column j of A */
-	    j = cset [cj] ;
-	    nnz += (packed) ? (Ap [j+1] - Ap [j]) : MAX (0, Anz [j]) ;
-	}
-    }
-    else
-    {
-	/* C = A (rset,cset), where rset is not empty but cset might be empty */
-	/* create link lists in reverse order to preserve natural order */
-	ilast = anrow ;
-	for (ci = nr-1 ; ci >= 0 ; ci--)
-	{
-	    /* row i of A becomes row ci of C; add ci to ith link list */
-	    i = rset [ci] ;
-	    head = Head [i] ;
-	    Rlen [i] = (head == EMPTY) ? 1 : (Rlen [i] + 1) ;
-	    Rnext [ci] = head ;
-	    Head [i] = ci ;
-	    if (i > ilast)
-	    {
-		/* row indices in columns of C will not be sorted */
-		csorted = FALSE ;
-	    }
-	    ilast = i ;
-	}
-
-#ifndef NDEBUG
-	for (i = 0 ; i < anrow ; i++)
-	{
-	    Int k = 0 ;
-	    Int rlen = (Head [i] != EMPTY) ? Rlen [i] : -1 ;
-	    PRINT1 (("Row "ID" Rlen "ID": ", i, rlen)) ;
-	    for (ci = Head [i] ; ci != EMPTY ; ci = Rnext [ci])
-	    {
-		k++ ;
-		PRINT2 ((""ID" ", ci)) ;
-	    }
-	    PRINT1 (("\n")) ;
-	    ASSERT (IMPLIES (Head [i] != EMPTY, k == Rlen [i])) ;
-	}
-#endif
-
-	/* count nonzeros in C */
-	for (cj = 0 ; cj < cncol ; cj++)
-	{
-	    /* count rows in column cj of C, which is column j of A */
-	    j = (nc < 0) ? cj : (cset [cj]) ;
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		/* row i of A becomes multiple rows (ci) of C */
-		i = Ai [p] ;
-		ASSERT (i >= 0 && i < anrow) ;
-		if (Head [i] != EMPTY)
-		{
-		    nnz += Rlen [i] ;
-		}
-	    }
-	}
-    }
-    PRINT1 (("nnz (C) "ID"\n", nnz)) ;
-
-    /* rset and cset are now valid */
-    DEBUG (CHOLMOD(dump_subset) (rset, rsize, anrow, "rset", Common)) ;
-    DEBUG (CHOLMOD(dump_subset) (cset, csize, ancol, "cset", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate C */
-    /* ---------------------------------------------------------------------- */
-
-    C = CHOLMOD(allocate_sparse) (cnrow, cncol, nnz, csorted, TRUE, 0,
-	    values ? A->xtype : CHOLMOD_PATTERN, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	for (i = 0 ; i < anrow ; i++)
-	{
-	    Head [i] = EMPTY ;
-	}
-	ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-	return (NULL) ;
-    }
-
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* C = A (rset,cset) */
-    /* ---------------------------------------------------------------------- */
-
-    pdest = 0 ;
-    if (nnz == 0)
-    {
-	/* C has no nonzeros */
-	for (cj = 0 ; cj <= cncol ; cj++)
-	{
-	    Cp [cj] = 0 ;
-	}
-    }
-    else if (nr < 0)
-    {
-	/* C = A (:,cset), where cset is not empty */
-	for (cj = 0 ; cj < cncol ; cj++)
-	{
-	    /* construct column cj of C, which is column j of A */
-	    PRINT1 (("construct cj = j = "ID"\n", cj)) ;
-	    j = cset [cj] ;
-	    Cp [cj] = pdest ;
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		Ci [pdest] = Ai [p] ;
-		if (values)
-		{
-		    Cx [pdest] = Ax [p] ;
-		}
-		pdest++ ;
-		ASSERT (pdest <= nnz) ;
-	    }
-	}
-    }
-    else
-    {
-	/* C = A (rset,cset), where rset is not empty but cset might be empty */
-	for (cj = 0 ; cj < cncol ; cj++)
-	{
-	    /* construct column cj of C, which is column j of A */
-	    PRINT1 (("construct cj = "ID"\n", cj)) ;
-	    j = (nc < 0) ? cj : (cset [cj]) ;
-	    PRINT1 (("cj = "ID"\n", j)) ;
-	    Cp [cj] = pdest ;
-	    p = Ap [j] ;
-	    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-	    for ( ; p < pend ; p++)
-	    {
-		/* row (Ai [p]) of A becomes multiple rows (ci) of C */
-		PRINT2 (("i: "ID" becomes: ", Ai [p])) ;
-		if (values)
-		{
-		    aij = Ax [p] ;
-		}
-		for (ci = Head [Ai [p]] ; ci != EMPTY ; ci = Rnext [ci])
-		{
-		    PRINT3 ((""ID" ", ci)) ;
-		    Ci [pdest] = ci ;
-		    if (values)
-		    {
-			Cx [pdest] = aij ;
-		    }
-		    pdest++ ;
-		    ASSERT (pdest <= nnz) ;
-		}
-		PRINT2 (("\n")) ;
-	    }
-	}
-    }
-    Cp [cncol] = pdest ;
-    ASSERT (nnz == pdest) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* clear workspace */
-    /* ---------------------------------------------------------------------- */
-
-    for (ci = 0 ; ci < nr ; ci++)
-    {
-	Head [rset [ci]] = EMPTY ;
-    }
-
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* sort C, if requested */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_sparse) (C , "C before sort", Common) >= 0) ;
-
-    if (sorted && !csorted)
-    {
-	/* workspace: Iwork (max (C->nrow,C->ncol)) */
-	if (!CHOLMOD(sort) (C, Common))
-	{
-	    /* out of memory */
-	    CHOLMOD(free_sparse) (&C, Common) ;
-	    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-	    return (NULL) ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return result */
-    /* ---------------------------------------------------------------------- */
-
-    ASSERT (CHOLMOD(dump_sparse) (C , "Final C", Common) >= 0) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-    return (C) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_symmetry.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_symmetry.c
deleted file mode 100644
index a82ab05..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_symmetry.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_symmetry =========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* Determines if a sparse matrix is rectangular, unsymmetric, symmetric,
- * skew-symmetric, or Hermitian.  It does so by looking at its numerical values
- * of both upper and lower triangular parts of a CHOLMOD "unsymmetric"
- * matrix, where A->stype == 0.  The transpose of A is NOT constructed.
- *
- * If not unsymmetric, it also determines if the matrix has a diagonal whose
- * entries are all real and positive (and thus a candidate for sparse Cholesky
- * if A->stype is changed to a nonzero value).
- *
- * Note that a Matrix Market "general" matrix is either rectangular or
- * unsymmetric.
- *
- * The row indices in the column of each matrix MUST be sorted for this function
- * to work properly (A->sorted must be TRUE).  This routine returns EMPTY if
- * A->stype is not zero, or if A->sorted is FALSE.  The exception to this rule
- * is if A is rectangular.
- *
- * If option == 0, then this routine returns immediately when it finds a
- * non-positive diagonal entry (or one with nonzero imaginary part).   If the
- * matrix is not a candidate for sparse Cholesky, it returns the value
- * CHOLMOD_MM_UNSYMMETRIC, even if the matrix might in fact be symmetric or
- * Hermitian.
- *
- * This routine is useful inside the MATLAB backslash, which must look at an
- * arbitrary matrix (A->stype == 0) and determine if it is a candidate for
- * sparse Cholesky.  In that case, option should be 0.
- *
- * This routine is also useful when writing a MATLAB matrix to a file in
- * Rutherford/Boeing or Matrix Market format.  Those formats require a
- * determination as to the symmetry of the matrix, and thus this routine should
- * not return upon encountering the first non-positive diagonal.  In this case,
- * option should be 1.
- *
- * If option is 2, this function can be used to compute the numerical and
- * pattern symmetry, where 0 is a completely unsymmetric matrix, and 1 is a
- * perfectly symmetric matrix.  This option is used when computing the following
- * statistics for the matrices in the UF Sparse Matrix Collection.
- *
- *	numerical symmetry: number of matched offdiagonal nonzeros over
- *	the total number of offdiagonal entries.  A real entry A(i,j), i ~= j,
- *	is matched if A (j,i) == A (i,j), but this is only counted if both
- *	A(j,i) and A(i,j) are nonzero.  This does not depend on Z.
- *	(If A is complex, then the above test is modified; A (i,j) is matched
- *	if conj (A (j,i)) == A (i,j)).
- *
- *	Then numeric symmetry = xmatched / nzoffdiag, or 1 if nzoffdiag = 0.
- *  
- *	pattern symmetry: number of matched offdiagonal entries over the
- *	total number of offdiagonal entries.  An entry A(i,j), i ~= j, is
- *	matched if A (j,i) is also an entry.
- *
- *	Then pattern symmetry = pmatched / nzoffdiag, or 1 if nzoffdiag = 0.
- *  
- * The symmetry of a matrix with no offdiagonal entries is equal to 1.
- *
- * A workspace of size ncol integers is allocated; EMPTY is returned if this
- * allocation fails.
- *
- * Summary of return values:
- *
- *  EMPTY (-1)			    out of memory, stype not zero, A not sorted
- *  CHOLMOD_MM_RECTANGULAR 1	    A is rectangular
- *  CHOLMOD_MM_UNSYMMETRIC 2	    A is unsymmetric
- *  CHOLMOD_MM_SYMMETRIC 3	    A is symmetric, but with non-pos. diagonal
- *  CHOLMOD_MM_HERMITIAN 4	    A is Hermitian, but with non-pos. diagonal
- *  CHOLMOD_MM_SKEW_SYMMETRIC 5	    A is skew symmetric
- *  CHOLMOD_MM_SYMMETRIC_POSDIAG 6  A is symmetric with positive diagonal
- *  CHOLMOD_MM_HERMITIAN_POSDIAG 7  A is Hermitian with positive diagonal
- *
- * See also the spsym mexFunction, which is a MATLAB interface for this code.
- *
- * If the matrix is a candidate for sparse Cholesky, it will return a result
- * CHOLMOD_MM_SYMMETRIC_POSDIAG if real, or CHOLMOD_MM_HERMITIAN_POSDIAG if
- * complex.  Otherwise, it will return a value less than this.  This is true
- * regardless of the value of the option parameter.
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-
-/* ========================================================================== */
-/* === get_value ============================================================ */
-/* ========================================================================== */
-
-/* Get the pth value in the matrix. */
-
-static void get_value
-(
-    double *Ax,	    /* real values, or real/imag. for CHOLMOD_COMPLEX type */
-    double *Az,	    /* imaginary values for CHOLMOD_ZOMPLEX type */
-    Int p,	    /* get the pth entry */
-    Int xtype,	    /* A->xtype: pattern, real, complex, or zomplex */
-    double *x,	    /* the real part */
-    double *z	    /* the imaginary part */
-)
-{
-    switch (xtype)
-    {
-	case CHOLMOD_PATTERN:
-	    *x = 1 ;
-	    *z = 0 ;
-	    break ;
-
-	case CHOLMOD_REAL:
-	    *x = Ax [p] ;
-	    *z = 0 ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    *x = Ax [2*p] ;
-	    *z = Ax [2*p+1] ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    *x = Ax [p] ;
-	    *z = Az [p] ;
-	    break ;
-    }
-}
-
-
-/* ========================================================================== */
-/* === cholmod_symmetry ===================================================== */
-/* ========================================================================== */
-
-/* Determine the symmetry of a matrix, and check its diagonal.
- *
- * option 0:  Do not count # of matched pairs.  Quick return if the
- *	      the matrix has a zero, negative, or imaginary diagonal entry.
- *
- * option 1:  Do not count # of matched pairs.  Do not return quickly if
- *	      the matrix has a zero, negative, or imaginary diagonal entry.
- *	The result 1 to 7 is accurately computed:
- *
- *	EMPTY (-1)		out of memory, stype not zero, A not sorted
- *	CHOLMOD_MM_RECTANGULAR 1	A is rectangular
- *	CHOLMOD_MM_UNSYMMETRIC 2	A is unsymmetric
- *	CHOLMOD_MM_SYMMETRIC 3		A is symmetric, with non-pos. diagonal
- *	CHOLMOD_MM_HERMITIAN 4		A is Hermitian, with non-pos. diagonal
- *	CHOLMOD_MM_SKEW_SYMMETRIC 5	A is skew symmetric
- *	CHOLMOD_MM_SYMMETRIC_POSDIAG 6  is symmetric with positive diagonal
- *	CHOLMOD_MM_HERMITIAN_POSDIAG 7  A is Hermitian with positive diagonal
- *
- *	The routine returns as soon as the above is determined (that is, it
- *	can return as soon as it determines the matrix is unsymmetric).
- *
- * option 2:  All of the above, but also compute the number of matched off-
- *	diagonal entries (of two types).  xmatched is the number of 
- *	nonzero entries for which A(i,j) = conj(A(j,i)).  pmatched is
- *	the number of entries (i,j) for which A(i,j) and A(j,i) are both in
- *	the pattern of A (the value doesn't matter).  nzoffdiag is the total
- *	number of off-diagonal entries in the pattern.  nzdiag is the number of
- *	diagonal entries in the pattern.
- *
- * With option 0 or 1, or if the matrix is rectangular, xmatched, pmatched,
- * nzoffdiag, and nzdiag are not computed.
- *
- * Note that a matched pair, A(i,j) and A(j,i) for i != j, is counted twice
- * (once per entry).
- */
-
-int CHOLMOD(symmetry)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,
-    int option,			/* option 0, 1, or 2 (see above) */
-    /* ---- output --- */	/* outputs ignored if any are NULL */
-    Int *p_xmatched,		/* # of matched numerical entries */
-    Int *p_pmatched,		/* # of matched entries in pattern */
-    Int *p_nzoffdiag,		/* # of off diagonal entries */
-    Int *p_nzdiag,		/* # of diagonal entries */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double aij_real = 0, aij_imag = 0, aji_real = 0, aji_imag = 0 ;
-    double *Ax, *Az ;
-    Int *Ap, *Ai, *Anz, *munch ;
-    Int packed, nrow, ncol, xtype, is_symmetric, is_skew, is_hermitian, posdiag,
-	j, p, pend, i, piend, result, xmatched, pmatched, nzdiag, i2, found ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (EMPTY) ;
-    RETURN_IF_NULL (A, EMPTY) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, EMPTY) ;
-    Common->status = CHOLMOD_OK ;
-    ASSERT (CHOLMOD(dump_sparse) (A, "cholmod_symmetry", Common) >= 0) ;
-
-    if (p_xmatched == NULL || p_pmatched == NULL
-	|| p_nzoffdiag == NULL || p_nzdiag == NULL)
-    {
-	/* option 2 is not performed if any output parameter is NULL */
-	option = MAX (option, 1) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Az = A->z ;
-    Anz = A->nz ;
-    packed = A->packed ;
-    ncol = A->ncol ;
-    nrow = A->nrow ;
-    xtype = A->xtype ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check if rectangular, unsorted, or stype is not zero */
-    /* ---------------------------------------------------------------------- */
-
-    if (nrow != ncol)
-    {
-	/* matrix is rectangular */
-	return (CHOLMOD_MM_RECTANGULAR) ;
-    }
-
-    if (!(A->sorted) || A->stype != 0)
-    {
-	/* this function cannot determine the type or symmetry */
-	return (EMPTY) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* this function requires uninitialized Int workspace of size ncol */
-    CHOLMOD(allocate_work) (0, ncol, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	return (EMPTY) ;
-    }
-
-    munch = Common->Iwork ;	    /* the munch array is size ncol */
-
-    /* ---------------------------------------------------------------------- */
-    /* determine symmetry of a square matrix */
-    /* ---------------------------------------------------------------------- */
-
-    /* a complex or zomplex matrix is Hermitian until proven otherwise */
-    is_hermitian = (xtype >= CHOLMOD_COMPLEX) ;
-
-    /* any matrix is symmetric until proven otherwise */
-    is_symmetric = TRUE ;
-
-    /* a non-pattern matrix is skew-symmetric until proven otherwise */
-    is_skew = (xtype != CHOLMOD_PATTERN) ;
-
-    /* a matrix has positive diagonal entries until proven otherwise */
-    posdiag = TRUE ;
-
-    /* munch pointers start at the top of each column */
-    for (j = 0 ; j < ncol ; j++)
-    {
-	munch [j] = Ap [j] ;
-    }
-
-    xmatched = 0 ;
-    pmatched = 0 ;
-    nzdiag = 0 ;
-
-    for (j = 0 ; j < ncol ; j++)	/* examine each column of A */
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* look at the entire munch column j */
-	/* ------------------------------------------------------------------ */
-
-	/* start at the munch point of column j, and go to end of the column */
-	p = munch [j] ;
-	pend = (packed) ? (Ap [j+1]) : (Ap [j] + Anz [j]) ;
-
-	for ( ; p < pend ; p++)
-	{
-	    /* get the row index of A(i,j) */
-	    i = Ai [p] ;
-
-	    if (i < j)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* A(i,j) in triu(A), but matching A(j,i) not in tril(A) */
-		/* ---------------------------------------------------------- */
-
-		/* entry A(i,j) is unmatched; it appears in the upper triangular
-		 * part, but not the lower triangular part.  The matrix is
-		 * unsymmetric. */
-		is_hermitian = FALSE ;
-		is_symmetric = FALSE ;
-		is_skew = FALSE ;
-
-	    }
-	    else if (i == j)
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* the diagonal A(j,j) is present; check its value */
-		/* ---------------------------------------------------------- */
-
-		get_value (Ax, Az, p, xtype, &aij_real, &aij_imag) ;
-		if (aij_real != 0. || aij_imag != 0.)
-		{
-		    /* diagonal is nonzero; matrix is not skew-symmetric */
-		    nzdiag++ ;
-		    is_skew = FALSE ;
-		}
-		if (aij_real <= 0. || aij_imag != 0.)
-		{
-		    /* diagonal negative or imaginary; not chol candidate */
-		    posdiag = FALSE ;
-		}
-		if (aij_imag != 0.)
-		{
-		    /* imaginary part is present; not Hermitian */
-		    is_hermitian = FALSE ;
-		}
-
-	    }
-	    else /* i > j */
-	    {
-
-		/* ---------------------------------------------------------- */
-		/* consider column i, up to and including row j */
-		/* ---------------------------------------------------------- */
-
-		/* munch the entry at top of column i up to and incl row j */
-		piend = (packed) ? (Ap [i+1]) : (Ap [i] + Anz [i]) ;
-
-		found = FALSE ;
-
-		for ( ; munch [i] < piend ; munch [i]++)
-		{
-
-		    i2 = Ai [munch [i]] ;
-
-		    if (i2 < j)
-		    {
-
-			/* -------------------------------------------------- */
-			/* A(i2,i) in triu(A) but A(i,i2) not in tril(A) */
-			/* -------------------------------------------------- */
-
-			/* The matrix is unsymmetric. */
-			is_hermitian = FALSE ;
-			is_symmetric = FALSE ;
-			is_skew = FALSE ;
-
-		    }
-		    else if (i2 == j)
-		    {
-
-			/* -------------------------------------------------- */
-			/* both A(i,j) and A(j,i) exist in the matrix */
-			/* -------------------------------------------------- */
-
-			/* this is one more matching entry in the pattern */
-			pmatched += 2 ;
-			found = TRUE ;
-
-			/* get the value of A(i,j) */
-			get_value (Ax, Az, p, xtype, &aij_real, &aij_imag) ;
-
-			/* get the value of A(j,i) */
-			get_value (Ax, Az, munch [i],
-			    xtype, &aji_real, &aji_imag) ;
-
-			/* compare A(i,j) with A(j,i) */
-			if (aij_real != aji_real || aij_imag != aji_imag)
-			{
-			    /* the matrix cannot be symmetric */
-			    is_symmetric = FALSE ;
-			}
-			if (aij_real != -aji_real || aij_imag != aji_imag)
-			{
-			    /* the matrix cannot be skew-symmetric */
-			    is_skew = FALSE ;
-			}
-			if (aij_real != aji_real || aij_imag != -aji_imag)
-			{
-			    /* the matrix cannot be Hermitian */
-			    is_hermitian = FALSE ;
-			}
-			else
-			{
-			    /* A(i,j) and A(j,i) are numerically matched */
-			    xmatched += 2 ;
-			}
-
-		    }
-		    else /* i2 > j */
-		    {
-
-			/* -------------------------------------------------- */
-			/* entry A(i2,i) is not munched; consider it later */
-			/* -------------------------------------------------- */
-
-			break ;
-		    }
-		}
-
-		if (!found)
-		{
-		    /* A(i,j) in tril(A) but A(j,i) not in triu(A).
-		     * The matrix is unsymmetric. */
-		    is_hermitian = FALSE ;
-		    is_symmetric = FALSE ;
-		    is_skew = FALSE ;
-		}
-	    }
-
-	    if (option < 2 && !(is_symmetric || is_skew || is_hermitian))
-	    {
-		/* matrix is unsymmetric; terminate the test */
-		return (CHOLMOD_MM_UNSYMMETRIC) ;
-	    }
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* quick return if not Cholesky candidate */
-	/* ------------------------------------------------------------------ */
-
-	if (option < 1 && (!posdiag || nzdiag <= j))
-	{
-	    /* Diagonal entry not present, or present but negative or with
-	     * nonzero imaginary part.  Quick return for option 0. */
-	    return (CHOLMOD_MM_UNSYMMETRIC) ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* return the results */
-    /* ---------------------------------------------------------------------- */
-
-    if (nzdiag < ncol)
-    {
-        /* not all diagonal entries are present */
-        posdiag = FALSE ;
-    }
-
-    if (option >= 2)
-    {
-	*p_xmatched = xmatched ;
-	*p_pmatched = pmatched ;
-	*p_nzoffdiag = CHOLMOD(nnz) (A, Common) - nzdiag ;
-	*p_nzdiag = nzdiag ;
-    }
-
-    result = CHOLMOD_MM_UNSYMMETRIC ;
-    if (is_hermitian)
-    {
-	/* complex Hermitian matrix, with either pos. or non-pos. diagonal */
-	result = posdiag ? CHOLMOD_MM_HERMITIAN_POSDIAG : CHOLMOD_MM_HERMITIAN ;
-    }
-    else if (is_symmetric)
-    {
-	/* real or complex symmetric matrix, with pos. or non-pos. diagonal */
-	result = posdiag ? CHOLMOD_MM_SYMMETRIC_POSDIAG : CHOLMOD_MM_SYMMETRIC ;
-    }
-    else if (is_skew)
-    {
-	/* real or complex skew-symmetric matrix */
-	result = CHOLMOD_MM_SKEW_SYMMETRIC ;
-    }
-    return (result) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_vertcat.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_vertcat.c
deleted file mode 100644
index 5641ae3..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/cholmod_vertcat.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/cholmod_vertcat ============================================ */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* Vertical concatenation, C = [A ; B] in MATLAB notation.
- *
- * A and B can be up/lo/unsym; C is unsymmetric and packed.
- * A and B must have the same number of columns.
- * C is sorted if both A and B are sorted.
- *
- * workspace: Iwork (max (A->nrow, A->ncol, B->nrow, B->ncol)).
- *	allocates temporary copies of A and B if they are symmetric.
- *
- * Only pattern and real matrices are supported.  Complex and zomplex matrices
- * are supported only if "values" is FALSE.
- */
-
-#ifndef NGPL
-#ifndef NMATRIXOPS
-
-#include "cholmod_internal.h"
-#include "cholmod_matrixops.h"
-
-
-/* ========================================================================== */
-/* === cholmod_vertcat ====================================================== */
-/* ========================================================================== */
-
-cholmod_sparse *CHOLMOD(vertcat)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* left matrix to concatenate */
-    cholmod_sparse *B,	/* right matrix to concatenate */
-    int values,		/* if TRUE compute the numerical values of C */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Ax, *Bx, *Cx ;
-    Int *Ap, *Ai, *Anz, *Bp, *Bi, *Bnz, *Cp, *Ci ;
-    cholmod_sparse *C, *A2, *B2 ;
-    Int apacked, bpacked, anrow, bnrow, ncol, nrow, anz, bnz, nz, j, p, pend,
-	pdest ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (NULL) ;
-    RETURN_IF_NULL (A, NULL) ;
-    RETURN_IF_NULL (B, NULL) ;
-    values = values &&
-	(A->xtype != CHOLMOD_PATTERN) && (B->xtype != CHOLMOD_PATTERN) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    RETURN_IF_XTYPE_INVALID (B, CHOLMOD_PATTERN,
-	    values ? CHOLMOD_REAL : CHOLMOD_ZOMPLEX, NULL) ;
-    if (A->ncol != B->ncol)
-    {
-	/* A and B must have the same number of columns */
-	ERROR (CHOLMOD_INVALID, "A and B must have same # of columns") ;
-	return (NULL) ;
-    }
-    /* A and B must have the same numerical type if values is TRUE (both must
-     * be CHOLMOD_REAL, this is implicitly checked above) */
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    anrow = A->nrow ;
-    bnrow = B->nrow ;
-    ncol = A->ncol ;
-    CHOLMOD(allocate_work) (0, MAX3 (anrow, bnrow, ncol), 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	return (NULL) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    /* convert A to unsymmetric, if necessary */
-    A2 = NULL ;
-    if (A->stype != 0)
-    {
-	/* workspace: Iwork (max (A->nrow,A->ncol)) */
-	A2 = CHOLMOD(copy) (A, 0, values, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    return (NULL) ;
-	}
-	A = A2 ;
-    }
-
-    /* convert B to unsymmetric, if necessary */
-    B2 = NULL ;
-    if (B->stype != 0)
-    {
-	/* workspace: Iwork (max (B->nrow,B->ncol)) */
-	B2 = CHOLMOD(copy) (B, 0, values, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* out of memory */
-	    CHOLMOD(free_sparse) (&A2, Common) ;
-	    return (NULL) ;
-	}
-	B = B2 ;
-    }
-
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    apacked = A->packed ;
-
-    Bp  = B->p ;
-    Bnz = B->nz ;
-    Bi  = B->i ;
-    Bx  = B->x ;
-    bpacked = B->packed ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate C */
-    /* ---------------------------------------------------------------------- */
-
-    anz = CHOLMOD(nnz) (A, Common) ;
-    bnz = CHOLMOD(nnz) (B, Common) ;
-    nrow = anrow + bnrow ;
-    nz = anz + bnz ;
-
-    C = CHOLMOD(allocate_sparse) (nrow, ncol, nz, A->sorted && B->sorted, TRUE,
-	    0, values ? A->xtype : CHOLMOD_PATTERN, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	CHOLMOD(free_sparse) (&A2, Common) ;
-	CHOLMOD(free_sparse) (&B2, Common) ;
-	return (NULL) ;
-    }
-    Cp = C->p ;
-    Ci = C->i ;
-    Cx = C->x ;
-
-    /* ---------------------------------------------------------------------- */
-    /* C = [A ; B] */
-    /* ---------------------------------------------------------------------- */
-
-    pdest = 0 ;
-    for (j = 0 ; j < ncol ; j++)
-    {
-	/* attach A(:,j) as the first part of C(:,j) */
-	p = Ap [j] ;
-	pend = (apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-	Cp [j] = pdest ;
-	for ( ; p < pend ; p++)
-	{
-	    Ci [pdest] = Ai [p] ;
-	    if (values)
-	    {
-		Cx [pdest] = Ax [p] ;
-	    }
-	    pdest++ ;
-	}
-
-	/* attach B(:,j) as the second part of C(:,j) */
-	p = Bp [j] ;
-	pend = (bpacked) ? (Bp [j+1]) : (p + Bnz [j]) ;
-	for ( ; p < pend ; p++)
-	{
-	    Ci [pdest] = Bi [p] + anrow ;
-	    if (values)
-	    {
-		Cx [pdest] = Bx [p] ;
-	    }
-	    pdest++ ;
-	}
-    }
-    Cp [ncol] = pdest ;
-    ASSERT (pdest == nz) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* free the unsymmetric copies of A and B, and return C */
-    /* ---------------------------------------------------------------------- */
-
-    CHOLMOD(free_sparse) (&A2, Common) ;
-    CHOLMOD(free_sparse) (&B2, Common) ;
-    return (C) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/gpl.txt b/src/C/SuiteSparse/CHOLMOD/MatrixOps/gpl.txt
deleted file mode 100644
index 3912109..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/gpl.txt
+++ /dev/null
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/src/C/SuiteSparse/CHOLMOD/MatrixOps/t_cholmod_sdmult.c b/src/C/SuiteSparse/CHOLMOD/MatrixOps/t_cholmod_sdmult.c
deleted file mode 100644
index 7ddd3b6..0000000
--- a/src/C/SuiteSparse/CHOLMOD/MatrixOps/t_cholmod_sdmult.c
+++ /dev/null
@@ -1,726 +0,0 @@
-/* ========================================================================== */
-/* === MatrixOps/t_cholmod_sdmult =========================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/MatrixOps Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/MatrixOps 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
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_sdmult */
-
-#include "cholmod_template.h"
-
-#undef ADVANCE
-
-#ifdef REAL
-#define ADVANCE(x,z,d) x += d
-#elif defined (COMPLEX)
-#define ADVANCE(x,z,d) x += 2*d
-#else
-#define ADVANCE(x,z,d) x += d ; z += d
-#endif
-
-/* ========================================================================== */
-/* === t_cholmod_sdmult ===================================================== */
-/* ========================================================================== */
-
-static void TEMPLATE (cholmod_sdmult)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* sparse matrix to multiply */
-    int transpose,	/* use A if 0, or A' otherwise */
-    double alpha [2],   /* scale factor for A */
-    double beta [2],    /* scale factor for Y */
-    cholmod_dense *X,	/* dense matrix to multiply */
-    /* ---- in/out --- */
-    cholmod_dense *Y,	/* resulting dense matrix */
-    /* -- workspace -- */
-    double *W		/* size 4*nx if needed, twice that for c/zomplex case */
-)
-{
-
-    double yx [8], xx [8], ax [2] ;
-#ifdef ZOMPLEX
-    double yz [4], xz [4], az [1] ;
-    double betaz [1], alphaz [1] ;
-#endif
-
-    double *Ax, *Az, *Xx, *Xz, *Yx, *Yz, *w, *Wz ;
-    Int *Ap, *Ai, *Anz ;
-    size_t nx, ny, dx, dy ;
-    Int packed, nrow, ncol, j, k, p, pend, kcol, i ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-#ifdef ZOMPLEX
-    betaz  [0] = beta  [1] ;
-    alphaz [0] = alpha [1] ;
-#endif
-
-    ny = transpose ? A->ncol : A->nrow ;	/* required length of Y */
-    nx = transpose ? A->nrow : A->ncol ;	/* required length of X */
-
-    nrow = A->nrow ;
-    ncol = A->ncol ;
-
-    Ap  = A->p ;
-    Anz = A->nz ;
-    Ai  = A->i ;
-    Ax  = A->x ;
-    Az  = A->z ;
-    packed = A->packed ;
-    Xx = X->x ;
-    Xz = X->z ;
-    Yx = Y->x ;
-    Yz = Y->z ;
-    kcol = X->ncol ;
-    dy = Y->d ;
-    dx = X->d ;
-    w = W ;
-    Wz = W + 4*nx ;
-
-    /* ---------------------------------------------------------------------- */
-    /* Y = beta * Y */
-    /* ---------------------------------------------------------------------- */
-
-    if (ENTRY_IS_ZERO (beta, betaz, 0))
-    {
-	for (k = 0 ; k < kcol ; k++)
-	{
-	    for (i = 0 ; i < ((Int) ny) ; i++)
-	    {
-		/* y [i] = 0. ; */
-		CLEAR (Yx, Yz, i) ;
-	    }
-	    /* y += dy ; */
-	    ADVANCE (Yx,Yz,dy) ;
-	}
-    }
-    else if (!ENTRY_IS_ONE (beta, betaz, 0))
-    {
-	for (k = 0 ; k < kcol ; k++)
-	{
-	    for (i = 0 ; i < ((Int) ny) ; i++)
-	    {
-		/* y [i] *= beta [0] ; */
-		MULT (Yx,Yz,i, Yx,Yz,i, beta,betaz, 0) ;
-	    }
-	    /* y += dy ; */
-	    ADVANCE (Yx,Yz,dy) ;
-	}
-    }
-
-    if (ENTRY_IS_ZERO (alpha, alphaz, 0))
-    {
-	/* nothing else to do */
-	return ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* Y += alpha * op(A) * X, where op(A)=A or A' */
-    /* ---------------------------------------------------------------------- */
-
-    Yx = Y->x ;
-    Yz = Y->z ;
-
-    k = 0 ;
-
-    if (A->stype == 0)
-    {
-
-	if (transpose)
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* Y += alpha * A' * x, unsymmetric case */
-	    /* -------------------------------------------------------------- */
-
-	    if (kcol % 4 == 1)
-	    {
-
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    /* yj = 0. ; */
-		    CLEAR (yx, yz, 0) ;
-		    p = Ap [j] ;
-		    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		    for ( ; p < pend ; p++)
-		    {
-			/* yj += conj(Ax [p]) * x [Ai [p]] ; */
-			i = Ai [p] ;
-			ASSIGN_CONJ (ax,az,0, Ax,Az,p) ;
-			MULTADD (yx,yz,0, ax,az,0, Xx,Xz,i) ;
-		    }
-		    /* y [j] += alpha [0] * yj ; */
-		    MULTADD (Yx,Yz,j, alpha,alphaz,0, yx,yz,0) ;
-		}
-		/* y += dy ; */
-		/* x += dx ; */
-		ADVANCE (Yx,Yz,dy) ;
-		ADVANCE (Xx,Xz,dx) ;
-		k++ ;
-
-	    }
-	    else if (kcol % 4 == 2)
-	    {
-
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    /* yj0 = 0. ; */
-		    /* yj1 = 0. ; */
-		    CLEAR (yx,yz,0) ;
-		    CLEAR (yx,yz,1) ;
-
-		    p = Ap [j] ;
-		    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		    for ( ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			/* aij = conj (Ax [p]) ; */
-			ASSIGN_CONJ (ax,az,0, Ax,Az,p) ;
-
-			/* yj0 += aij * x [i   ] ; */
-			/* yj1 += aij * x [i+dx] ; */
-			MULTADD (yx,yz,0, ax,az,0, Xx,Xz,i) ;
-			MULTADD (yx,yz,1, ax,az,0, Xx,Xz,i+dx) ;
-		    }
-		    /* y [j   ] += alpha [0] * yj0 ; */
-		    /* y [j+dy] += alpha [0] * yj1 ; */
-		    MULTADD (Yx,Yz,j,      alpha,alphaz,0, yx,yz,0) ;
-		    MULTADD (Yx,Yz,j+dy,   alpha,alphaz,0, yx,yz,1) ;
-		}
-		/* y += 2*dy ; */
-		/* x += 2*dx ; */
-		ADVANCE (Yx,Yz,2*dy) ;
-		ADVANCE (Xx,Xz,2*dx) ;
-		k += 2 ;
-
-	    }
-	    else if (kcol % 4 == 3)
-	    {
-
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    /* yj0 = 0. ; */
-		    /* yj1 = 0. ; */
-		    /* yj2 = 0. ; */
-		    CLEAR (yx,yz,0) ;
-		    CLEAR (yx,yz,1) ;
-		    CLEAR (yx,yz,2) ;
-
-		    p = Ap [j] ;
-		    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		    for ( ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			/* aij = conj (Ax [p]) ; */
-			ASSIGN_CONJ (ax,az,0, Ax,Az,p) ;
-
-			/* yj0 += aij * x [i     ] ; */
-			/* yj1 += aij * x [i+  dx] ; */
-			/* yj2 += aij * x [i+2*dx] ; */
-			MULTADD (yx,yz,0, ax,az,0, Xx,Xz,i) ;
-			MULTADD (yx,yz,1, ax,az,0, Xx,Xz,i+dx) ;
-			MULTADD (yx,yz,2, ax,az,0, Xx,Xz,i+2*dx) ;
-		    }
-		    /* y [j     ] += alpha [0] * yj0 ; */
-		    /* y [j+  dy] += alpha [0] * yj1 ; */
-		    /* y [j+2*dy] += alpha [0] * yj2 ; */
-		    MULTADD (Yx,Yz,j,      alpha,alphaz,0, yx,yz,0) ;
-		    MULTADD (Yx,Yz,j+dy,   alpha,alphaz,0, yx,yz,1) ;
-		    MULTADD (Yx,Yz,j+2*dy, alpha,alphaz,0, yx,yz,2) ;
-		}
-		/* y += 3*dy ; */
-		/* x += 3*dx ; */
-		ADVANCE (Yx,Yz,3*dy) ;
-		ADVANCE (Xx,Xz,3*dx) ;
-		k += 3 ;
-	    }
-
-	    for ( ; k < kcol ; k += 4)
-	    {
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    /* yj0 = 0. ; */
-		    /* yj1 = 0. ; */
-		    /* yj2 = 0. ; */
-		    /* yj3 = 0. ; */
-		    CLEAR (yx,yz,0) ;
-		    CLEAR (yx,yz,1) ;
-		    CLEAR (yx,yz,2) ;
-		    CLEAR (yx,yz,3) ;
-
-		    p = Ap [j] ;
-		    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		    for ( ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			/* aij = conj(Ax [p]) ; */
-			ASSIGN_CONJ (ax,az,0, Ax,Az,p) ;
-
-			/* yj0 += aij * x [i     ] ; */
-			/* yj1 += aij * x [i+  dx] ; */
-			/* yj2 += aij * x [i+2*dx] ; */
-			/* yj3 += aij * x [i+3*dx] ; */
-			MULTADD (yx,yz,0, ax,az,0, Xx,Xz,i) ;
-			MULTADD (yx,yz,1, ax,az,0, Xx,Xz,i+dx) ;
-			MULTADD (yx,yz,2, ax,az,0, Xx,Xz,i+2*dx) ;
-			MULTADD (yx,yz,3, ax,az,0, Xx,Xz,i+3*dx) ;
-
-		    }
-		    /* y [j     ] += alpha [0] * yj0 ; */
-		    /* y [j+  dy] += alpha [0] * yj1 ; */
-		    /* y [j+2*dy] += alpha [0] * yj2 ; */
-		    /* y [j+3*dy] += alpha [0] * yj3 ; */
-		    MULTADD (Yx,Yz,j,      alpha,alphaz,0, yx,yz,0) ;
-		    MULTADD (Yx,Yz,j+dy,   alpha,alphaz,0, yx,yz,1) ;
-		    MULTADD (Yx,Yz,j+2*dy, alpha,alphaz,0, yx,yz,2) ;
-		    MULTADD (Yx,Yz,j+3*dy, alpha,alphaz,0, yx,yz,3) ;
-		}
-		/* y += 4*dy ; */
-		/* x += 4*dx ; */
-		ADVANCE (Yx,Yz,4*dy) ;
-		ADVANCE (Xx,Xz,4*dx) ;
-	    }
-
-	}
-	else
-	{
-
-	    /* -------------------------------------------------------------- */
-	    /* Y += alpha * A * x, unsymmetric case */
-	    /* -------------------------------------------------------------- */
-
-	    if (kcol % 4 == 1)
-	    {
-
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    /*  xj = alpha [0] * x [j] ; */
-		    MULT (xx,xz,0, alpha,alphaz,0, Xx,Xz,j) ;
-
-		    p = Ap [j] ;
-		    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		    for ( ; p < pend ; p++)
-		    {
-			/* y [Ai [p]] += Ax [p] * xj ; */
-			i = Ai [p] ;
-			MULTADD (Yx,Yz,i, Ax,Az,p, xx,xz,0) ;
-		    }
-		}
-		/* y += dy ; */
-		/* x += dx ; */
-		ADVANCE (Yx,Yz,dy) ;
-		ADVANCE (Xx,Xz,dx) ;
-		k++ ;
-
-	    }
-	    else if (kcol % 4 == 2)
-	    {
-
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    /* xj0 = alpha [0] * x [j   ] ; */
-		    /* xj1 = alpha [0] * x [j+dx] ; */
-		    MULT (xx,xz,0, alpha,alphaz,0, Xx,Xz,j) ;
-		    MULT (xx,xz,1, alpha,alphaz,0, Xx,Xz,j+dx) ;
-
-		    p = Ap [j] ;
-		    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		    for ( ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i   ] += aij * xj0 ; */
-			/* y [i+dy] += aij * xj1 ; */
-			MULTADD (Yx,Yz,i,    ax,az,0, xx,xz,0) ;
-			MULTADD (Yx,Yz,i+dy, ax,az,0, xx,xz,1) ;
-		    }
-		}
-		/* y += 2*dy ; */
-		/* x += 2*dx ; */
-		ADVANCE (Yx,Yz,2*dy) ;
-		ADVANCE (Xx,Xz,2*dx) ;
-		k += 2 ;
-
-	    }
-	    else if (kcol % 4 == 3)
-	    {
-
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    /* xj0 = alpha [0] * x [j     ] ; */
-		    /* xj1 = alpha [0] * x [j+  dx] ; */
-		    /* xj2 = alpha [0] * x [j+2*dx] ; */
-		    MULT (xx,xz,0, alpha,alphaz,0, Xx,Xz,j) ;
-		    MULT (xx,xz,1, alpha,alphaz,0, Xx,Xz,j+dx) ;
-		    MULT (xx,xz,2, alpha,alphaz,0, Xx,Xz,j+2*dx) ;
-
-		    p = Ap [j] ;
-		    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		    for ( ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i     ] += aij * xj0 ; */
-			/* y [i+  dy] += aij * xj1 ; */
-			/* y [i+2*dy] += aij * xj2 ; */
-			MULTADD (Yx,Yz,i,      ax,az,0, xx,xz,0) ;
-			MULTADD (Yx,Yz,i+dy,   ax,az,0, xx,xz,1) ;
-			MULTADD (Yx,Yz,i+2*dy, ax,az,0, xx,xz,2) ;
-		    }
-		}
-		/* y += 3*dy ; */
-		/* x += 3*dx ; */
-		ADVANCE (Yx,Yz,3*dy) ;
-		ADVANCE (Xx,Xz,3*dx) ;
-		k += 3 ;
-	    }
-
-	    for ( ; k < kcol ; k += 4)
-	    {
-		for (j = 0 ; j < ncol ; j++)
-		{
-		    /* xj0 = alpha [0] * x [j     ] ; */
-		    /* xj1 = alpha [0] * x [j+  dx] ; */
-		    /* xj2 = alpha [0] * x [j+2*dx] ; */
-		    /* xj3 = alpha [0] * x [j+3*dx] ; */
-		    MULT (xx,xz,0, alpha,alphaz,0, Xx,Xz,j) ;
-		    MULT (xx,xz,1, alpha,alphaz,0, Xx,Xz,j+dx) ;
-		    MULT (xx,xz,2, alpha,alphaz,0, Xx,Xz,j+2*dx) ;
-		    MULT (xx,xz,3, alpha,alphaz,0, Xx,Xz,j+3*dx) ;
-
-		    p = Ap [j] ;
-		    pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		    for ( ; p < pend ; p++)
-		    {
-			i = Ai [p] ;
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i     ] += aij * xj0 ; */
-			/* y [i+  dy] += aij * xj1 ; */
-			/* y [i+2*dy] += aij * xj2 ; */
-			/* y [i+3*dy] += aij * xj3 ; */
-			MULTADD (Yx,Yz,i,      ax,az,0, xx,xz,0) ;
-			MULTADD (Yx,Yz,i+dy,   ax,az,0, xx,xz,1) ;
-			MULTADD (Yx,Yz,i+2*dy, ax,az,0, xx,xz,2) ;
-			MULTADD (Yx,Yz,i+3*dy, ax,az,0, xx,xz,3) ;
-		    }
-		}
-		/* y += 4*dy ; */
-		/* x += 4*dx ; */
-		ADVANCE (Yx,Yz,4*dy) ;
-		ADVANCE (Xx,Xz,4*dx) ;
-	    }
-	}
-
-    }
-    else
-    {
-
-	/* ------------------------------------------------------------------ */
-	/* Y += alpha * (A or A') * x, symmetric case (upper/lower) */
-	/* ------------------------------------------------------------------ */
-
-	/* Only the upper/lower triangular part and the diagonal of A is used.
-	 * Since both x and y are written to in the innermost loop, this
-	 * code can experience cache bank conflicts if x is used directly.
-	 * Thus, a copy is made of x, four columns at a time, if x has
-	 * four or more columns.
-	 */
-
-	if (kcol % 4 == 1)
-	{
-
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		/* yj = 0. ; */
-		CLEAR (yx,yz,0) ;
-
-		/* xj = alpha [0] * x [j] ; */
-		MULT (xx,xz,0, alpha,alphaz,0, Xx,Xz,j) ;
-
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i == j)
-		    {
-			/* y [i] += Ax [p] * xj ; */
-			MULTADD (Yx,Yz,i, Ax,Az,p, xx,xz,0) ;
-		    }
-		    else if ((A->stype > 0 && i < j) || (A->stype < 0 && i > j))
-		    {
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i] += aij * xj ; */
-			/* yj    += aij * x [i] ; */
-			MULTADD     (Yx,Yz,i, ax,az,0, xx,xz,0) ;
-			MULTADDCONJ (yx,yz,0, ax,az,0, Xx,Xz,i) ;
-
-
-		    }
-		}
-		/* y [j] += alpha [0] * yj ; */
-		MULTADD (Yx,Yz,j, alpha,alphaz,0, yx,yz,0) ;
-
-	    }
-	    /* y += dy ; */
-	    /* x += dx ; */
-	    ADVANCE (Yx,Yz,dy) ;
-	    ADVANCE (Xx,Xz,dx) ;
-	    k++ ;
-
-	}
-	else if (kcol % 4 == 2)
-	{
-
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		/* yj0 = 0. ; */
-		/* yj1 = 0. ; */
-		CLEAR (yx,yz,0) ;
-		CLEAR (yx,yz,1) ;
-
-		/* xj0 = alpha [0] * x [j   ] ; */
-		/* xj1 = alpha [0] * x [j+dx] ; */
-		MULT (xx,xz,0, alpha,alphaz,0, Xx,Xz,j) ;
-		MULT (xx,xz,1, alpha,alphaz,0, Xx,Xz,j+dx) ;
-
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i == j)
-		    {
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i   ] += aij * xj0 ; */
-			/* y [i+dy] += aij * xj1 ; */
-			MULTADD (Yx,Yz,i,    ax,az,0, xx,xz,0) ;
-			MULTADD (Yx,Yz,i+dy, ax,az,0, xx,xz,1) ;
-
-		    }
-		    else if ((A->stype > 0 && i < j) || (A->stype < 0 && i > j))
-		    {
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i   ] += aij * xj0 ; */
-			/* y [i+dy] += aij * xj1 ; */
-			/* yj0 += aij * x [i   ] ; */
-			/* yj1 += aij * x [i+dx] ; */
-			MULTADD     (Yx,Yz,i,    ax,az,0, xx,xz,0) ;
-			MULTADD     (Yx,Yz,i+dy, ax,az,0, xx,xz,1) ;
-			MULTADDCONJ (yx,yz,0,    ax,az,0, Xx,Xz,i) ;
-			MULTADDCONJ (yx,yz,1,    ax,az,0, Xx,Xz,i+dx) ;
-
-		    }
-		}
-		/* y [j   ] += alpha [0] * yj0 ; */
-		/* y [j+dy] += alpha [0] * yj1 ; */
-		MULTADD (Yx,Yz,j,    alpha,alphaz,0, yx,yz,0) ;
-		MULTADD (Yx,Yz,j+dy, alpha,alphaz,0, yx,yz,1) ;
-
-	    }
-	    /* y += 2*dy ; */
-	    /* x += 2*dx ; */
-	    ADVANCE (Yx,Yz,2*dy) ;
-	    ADVANCE (Xx,Xz,2*dx) ;
-	    k += 2 ;
-
-	}
-	else if (kcol % 4 == 3)
-	{
-
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		/* yj0 = 0. ; */
-		/* yj1 = 0. ; */
-		/* yj2 = 0. ; */
-		CLEAR (yx,yz,0) ;
-		CLEAR (yx,yz,1) ;
-		CLEAR (yx,yz,2) ;
-
-		/* xj0 = alpha [0] * x [j     ] ; */
-		/* xj1 = alpha [0] * x [j+  dx] ; */
-		/* xj2 = alpha [0] * x [j+2*dx] ; */
-		MULT (xx,xz,0, alpha,alphaz,0, Xx,Xz,j) ;
-		MULT (xx,xz,1, alpha,alphaz,0, Xx,Xz,j+dx) ;
-		MULT (xx,xz,2, alpha,alphaz,0, Xx,Xz,j+2*dx) ;
-
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i == j)
-		    {
-
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i     ] += aij * xj0 ; */
-			/* y [i+  dy] += aij * xj1 ; */
-			/* y [i+2*dy] += aij * xj2 ; */
-			MULTADD (Yx,Yz,i,      ax,az,0, xx,xz,0) ;
-			MULTADD (Yx,Yz,i+dy,   ax,az,0, xx,xz,1) ;
-			MULTADD (Yx,Yz,i+2*dy, ax,az,0, xx,xz,2) ;
-
-		    }
-		    else if ((A->stype > 0 && i < j) || (A->stype < 0 && i > j))
-		    {
-
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i     ] += aij * xj0 ; */
-			/* y [i+  dy] += aij * xj1 ; */
-			/* y [i+2*dy] += aij * xj2 ; */
-			/* yj0 += aij * x [i     ] ; */
-			/* yj1 += aij * x [i+  dx] ; */
-			/* yj2 += aij * x [i+2*dx] ; */
-			MULTADD     (Yx,Yz,i,      ax,az,0, xx,xz,0) ;
-			MULTADD     (Yx,Yz,i+dy,   ax,az,0, xx,xz,1) ;
-			MULTADD     (Yx,Yz,i+2*dy, ax,az,0, xx,xz,2) ;
-			MULTADDCONJ (yx,yz,0,      ax,az,0, Xx,Xz,i) ;
-			MULTADDCONJ (yx,yz,1,      ax,az,0, Xx,Xz,i+dx) ;
-			MULTADDCONJ (yx,yz,2,      ax,az,0, Xx,Xz,i+2*dx) ;
-
-		    }
-		}
-		/* y [j     ] += alpha [0] * yj0 ; */
-		/* y [j+  dy] += alpha [0] * yj1 ; */
-		/* y [j+2*dy] += alpha [0] * yj2 ; */
-		MULTADD (Yx,Yz,j,      alpha,alphaz,0, yx,yz,0) ;
-		MULTADD (Yx,Yz,j+dy,   alpha,alphaz,0, yx,yz,1) ;
-		MULTADD (Yx,Yz,j+2*dy, alpha,alphaz,0, yx,yz,2) ;
-
-	    }
-	    /* y += 3*dy ; */
-	    /* x += 3*dx ; */
-	    ADVANCE (Yx,Yz,3*dy) ;
-	    ADVANCE (Xx,Xz,3*dx) ;
-
-	    k += 3 ;
-	}
-
-	/* copy four columns of X into W, and put in row form */
-	for ( ; k < kcol ; k += 4)
-	{
-
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		/* w [4*j  ] = x [j     ] ; */
-		/* w [4*j+1] = x [j+  dx] ; */
-		/* w [4*j+2] = x [j+2*dx] ; */
-		/* w [4*j+3] = x [j+3*dx] ; */
-		ASSIGN (w,Wz,4*j  , Xx,Xz,j     ) ;
-		ASSIGN (w,Wz,4*j+1, Xx,Xz,j+dx  ) ;
-		ASSIGN (w,Wz,4*j+2, Xx,Xz,j+2*dx) ;
-		ASSIGN (w,Wz,4*j+3, Xx,Xz,j+3*dx) ;
-	    }
-
-	    for (j = 0 ; j < ncol ; j++)
-	    {
-		/* yj0 = 0. ; */
-		/* yj1 = 0. ; */
-		/* yj2 = 0. ; */
-		/* yj3 = 0. ; */
-		CLEAR (yx,yz,0) ;
-		CLEAR (yx,yz,1) ;
-		CLEAR (yx,yz,2) ;
-		CLEAR (yx,yz,3) ;
-
-		/* xj0 = alpha [0] * w [4*j  ] ; */
-		/* xj1 = alpha [0] * w [4*j+1] ; */
-		/* xj2 = alpha [0] * w [4*j+2] ; */
-		/* xj3 = alpha [0] * w [4*j+3] ; */
-		MULT (xx,xz,0, alpha,alphaz,0, w,Wz,4*j) ;
-		MULT (xx,xz,1, alpha,alphaz,0, w,Wz,4*j+1) ;
-		MULT (xx,xz,2, alpha,alphaz,0, w,Wz,4*j+2) ;
-		MULT (xx,xz,3, alpha,alphaz,0, w,Wz,4*j+3) ;
-
-		p = Ap [j] ;
-		pend = (packed) ? (Ap [j+1]) : (p + Anz [j]) ;
-		for ( ; p < pend ; p++)
-		{
-		    i = Ai [p] ;
-		    if (i == j)
-		    {
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i     ] += aij * xj0 ; */
-			/* y [i+  dy] += aij * xj1 ; */
-			/* y [i+2*dy] += aij * xj2 ; */
-			/* y [i+3*dy] += aij * xj3 ; */
-			MULTADD (Yx,Yz,i     , ax,az,0, xx,xz,0) ;
-			MULTADD (Yx,Yz,i+dy  , ax,az,0, xx,xz,1) ;
-			MULTADD (Yx,Yz,i+2*dy, ax,az,0, xx,xz,2) ;
-			MULTADD (Yx,Yz,i+3*dy, ax,az,0, xx,xz,3) ;
-
-		    }
-		    else if ((A->stype > 0 && i < j) || (A->stype < 0 && i > j))
-		    {
-			/* aij = Ax [p] ; */
-			ASSIGN (ax,az,0, Ax,Az,p) ;
-
-			/* y [i     ] += aij * xj0 ; */
-			/* y [i+  dy] += aij * xj1 ; */
-			/* y [i+2*dy] += aij * xj2 ; */
-			/* y [i+3*dy] += aij * xj3 ; */
-			/* yj0 += aij * w [4*i  ] ; */
-			/* yj1 += aij * w [4*i+1] ; */
-			/* yj2 += aij * w [4*i+2] ; */
-			/* yj3 += aij * w [4*i+3] ; */
-			MULTADD     (Yx,Yz,i,      ax,az,0, xx,xz,0) ;
-			MULTADD     (Yx,Yz,i+dy,   ax,az,0, xx,xz,1) ;
-			MULTADD     (Yx,Yz,i+2*dy, ax,az,0, xx,xz,2) ;
-			MULTADD     (Yx,Yz,i+3*dy, ax,az,0, xx,xz,3) ;
-			MULTADDCONJ (yx,yz,0,     ax,az,0, w,Wz,4*i) ;
-			MULTADDCONJ (yx,yz,1,     ax,az,0, w,Wz,4*i+1) ;
-			MULTADDCONJ (yx,yz,2,     ax,az,0, w,Wz,4*i+2) ;
-			MULTADDCONJ (yx,yz,3,     ax,az,0, w,Wz,4*i+3) ;
-
-		    }
-		}
-		/* y [j     ] += alpha [0] * yj0 ; */
-		/* y [j+  dy] += alpha [0] * yj1 ; */
-		/* y [j+2*dy] += alpha [0] * yj2 ; */
-		/* y [j+3*dy] += alpha [0] * yj3 ; */
-		MULTADD (Yx,Yz,j     , alpha,alphaz,0, yx,yz,0) ;
-		MULTADD (Yx,Yz,j+dy  , alpha,alphaz,0, yx,yz,1) ;
-		MULTADD (Yx,Yz,j+2*dy, alpha,alphaz,0, yx,yz,2) ;
-		MULTADD (Yx,Yz,j+3*dy, alpha,alphaz,0, yx,yz,3) ;
-
-	    }
-	    /* y += 4*dy ; */
-	    /* x += 4*dx ; */
-	    ADVANCE (Yx,Yz,4*dy) ;
-	    ADVANCE (Xx,Xz,4*dx) ;
-
-	}
-    }
-}
-
-
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/CHOLMOD/README.txt b/src/C/SuiteSparse/CHOLMOD/README.txt
deleted file mode 100644
index 212b0dd..0000000
--- a/src/C/SuiteSparse/CHOLMOD/README.txt
+++ /dev/null
@@ -1,81 +0,0 @@
-CHOLMOD: a sparse CHOLesky MODification package, Copyright (c) 2005-2014.
-http://www.suitesparse.com
------------------------------------------------
-
-    CHOLMOD is a set of routines for factorizing sparse symmetric positive
-    definite matrices of the form A or AA', updating/downdating a sparse
-    Cholesky factorization, solving linear systems, updating/downdating
-    the solution to the triangular system Lx=b, and many other sparse matrix
-    functions for both symmetric and unsymmetric matrices.  Its supernodal
-    Cholesky factorization relies on LAPACK and the Level-3 BLAS, and obtains
-    a substantial fraction of the peak performance of the BLAS.  Both real and
-    complex matrices are supported.  CHOLMOD is written in ANSI/ISO C, with both
-    C and MATLAB interfaces.  This code works on Microsoft Windows and many
-    versions of Unix and Linux.
-
-
-Some Modules of CHOLMOD are copyrighted by the University of Florida (the
-Core and Partition Modules).  The rest are copyrighted by the authors:
-Timothy A. Davis (all of them), and William W. Hager (the Modify Module).
-
-CHOLMOD relies on several other packages:  AMD, CAMD, COLAMD, CCOLAMD,
-SuiteSparse_config, METIS, the BLAS, and LAPACK.  All but METIS, the BLAS, and
-LAPACK are part of SuiteSparse.
-
-AMD is authored by T. Davis, Iain Duff, and Patrick Amestoy.
-COLAMD is authored by T. Davis and Stefan Larimore, with algorithmic design
-in collaboration with John Gilbert and Esmond Ng.
-CCOLAMD is authored by T. Davis and Siva Rajamanickam.
-CAMD is authored by T. Davis and Y. Chen.
-
-LAPACK and the BLAS are authored by Jack Dongarra and many others.
-LAPACK is available at http://www.netlib.org/lapack
-
-METIS is authored by George Karypis, Univ. of Minnesota.  Its use in CHOLMOD
-is optional.  See http://www-users.cs.umn.edu/~karypis/metis.
-Place a copy of the metis-4.0 directory in the same directory that
-contains the CHOLMOD, AMD, COLAMD, and CCOLAMD directories prior to compiling
-with "make".
-
-If you do not wish to use METIS, you must edit SuiteSparse_config and change
-the line:
-
-    CHOLMOD_CONFIG =
-
-to
-
-    CHOLMOD_CONFIG = -DNPARTITION
-
-The CHOLMOD, AMD, COLAMD, CCOLAMD, and SuiteSparse)config directories must all
-reside in a common parent directory.  To compile all these libraries, edit
-SuiteSparse)config/SuiteSparse)config.mk to reflect your environment (C
-compiler, location of the BLAS, and so on) and then type "make" in either the
-CHOLMOD directory or in the parent directory of CHOLMOD.  See each package for
-more details on how to compile them.
-
-For use in MATLAB (on any system, including Windows):  start MATLAB,
-cd to the CHOLMOD/MATLAB directory, and type cholmod_make in the MATLAB
-Command Window.  This is the best way to compile CHOLMOD for MATLAB; it
-provides a workaround for a METIS design feature, in which METIS terminates
-your program (and thus MATLAB) if it runs out of memory.  Using cholmod_make
-also ensures your mexFunctions are compiled with -fexceptions, so that
-exceptions are handled properly (when hitting control-C in the MATLAB command
-window, for example).
-
-On the Pentium, do NOT use the Intel MKL BLAS prior to MKL Version 8.0 with
-CHOLMOD.  Older versions (prior to 8.0) have a bug in dgemm when computing
-A*B'.  The bug generates a NaN result, when the inputs are well-defined.  Use
-the Goto BLAS or the MKL v8.0 BLAS instead.  The Goto BLAS is faster and more
-reliable.  See http://www.tacc.utexas.edu/~kgoto/ or
-http://www.cs.utexas.edu/users/flame/goto/.
-Sadly, the Intel MKL BLAS 7.x is the default for MATLAB 7.0.4.  See
-http://www.mathworks.com/support/bugreports/details.html?rp=252103 for more
-details.  To workaround this problem on Linux, set environment variable
-BLAS_VERSION to libmkl_p3.so:libguide.so. On Windows, set environment variable
-BLAS_VERSION to mkl_p3.dll.  Better yet, get MATLAB 7sp3 (MATLAB 7.1) or later.
-
-Acknowledgements:  this work was supported in part by the National Science
-Foundation (NFS CCR-0203270 and DMS-9803599), and a grant from Sandia National
-Laboratories (Dept. of Energy) which supported the development of CHOLMOD's
-Partition Module.
-
diff --git a/src/C/SuiteSparse/CHOLMOD/Supernodal/License.txt b/src/C/SuiteSparse/CHOLMOD/Supernodal/License.txt
deleted file mode 100644
index d6b6abf..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Supernodal/License.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-CHOLMOD/Supernodal Module.
-Copyright (C) 2005-2006, Timothy A. Davis
-CHOLMOD is also available under other licenses; contact authors for details.
-http://www.suitesparse.com
-
-Note that this license is for the CHOLMOD/Supernodal module only.
-All CHOLMOD modules are licensed separately.
-
-
---------------------------------------------------------------------------------
-
-
-This Module is free software; you can 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 Module is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this Module; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
diff --git a/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_numeric.c b/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_numeric.c
deleted file mode 100644
index 7cfee27..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_numeric.c
+++ /dev/null
@@ -1,313 +0,0 @@
-/* ========================================================================== */
-/* === Supernodal/cholmod_super_numeric ===================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Supernodal Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Supernodal 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
- * -------------------------------------------------------------------------- */
-
-/* Computes the Cholesky factorization of A+beta*I or A*F+beta*I.  Only the
- * the lower triangular part of A+beta*I or A*F+beta*I is accessed.  The
- * matrices A and F must already be permuted according to the fill-reduction
- * permutation L->Perm.  cholmod_factorize is an "easy" wrapper for this code
- * which applies that permutation.  beta is real.
- *
- * Symmetric case: A is a symmetric (lower) matrix.  F is not accessed.
- * With a fill-reducing permutation, A(p,p) should be passed instead, where is
- * p is L->Perm.
- *
- * Unsymmetric case: A is unsymmetric, and F must be present.  Normally, F=A'.
- * With a fill-reducing permutation, A(p,f) and A(p,f)' should be passed as A
- * and F, respectively, where f is a list of the subset of the columns of A.
- *
- * The input factorization L must be supernodal (L->is_super is TRUE).  It can
- * either be symbolic or numeric.  In the first case, L has been analyzed by
- * cholmod_analyze or cholmod_super_symbolic, but the matrix has not yet been
- * numerically factorized.  The numerical values are allocated here and the
- * factorization is computed.  In the second case, a prior matrix has been
- * analyzed and numerically factorized, and a new matrix is being factorized.
- * The numerical values of L are replaced with the new numerical factorization.
- *
- * L->is_ll is ignored, and set to TRUE.  This routine always computes an LL'
- * factorization.  Supernodal LDL' factorization is not (yet) supported.
- * FUTURE WORK: perform a supernodal LDL' factorization if L->is_ll is FALSE.
- *
- * Uses BLAS routines dsyrk, dgemm, dtrsm, and the LAPACK routine dpotrf.
- * The supernodal solver uses BLAS routines dtrsv, dgemv, dtrsm, and dgemm.
- *
- * If the matrix is not positive definite the routine returns TRUE, but sets
- * Common->status to CHOLMOD_NOT_POSDEF and L->minor is set to the column at
- * which the failure occurred.  The supernode containing the non-positive
- * diagonal entry is set to zero (this includes columns to the left of L->minor
- * in the same supernode), as are all subsequent supernodes.
- *
- * workspace: Flag (nrow), Head (nrow+1), Iwork (2*nrow + 5*nsuper).
- *	Allocates temporary space of size L->maxcsize * sizeof(double)
- *	(twice that for the complex/zomplex case).
- *
- * If L is supernodal symbolic on input, it is converted to a supernodal numeric
- * factor on output, with an xtype of real if A is real, or complex if A is
- * complex or zomplex.  If L is supernodal numeric on input, its xtype must
- * match A (except that L can be complex and A zomplex).  The xtype of A and F
- * must match.
- */
-
-#ifndef NGPL
-#ifndef NSUPERNODAL
-
-#include "cholmod_internal.h"
-#include "cholmod_supernodal.h"
-
-#ifdef GPU_BLAS
-#include "cholmod_gpu.h"
-#endif
-
-/* ========================================================================== */
-/* === TEMPLATE codes for GPU and regular numeric factorization ============= */
-/* ========================================================================== */
-
-#ifdef DLONG
-#ifdef GPU_BLAS
-#define REAL
-#include "../GPU/t_cholmod_gpu.c"
-#define COMPLEX
-#include "../GPU/t_cholmod_gpu.c"
-#define ZOMPLEX
-/* no #include of "../GPU/t_cholmod_gpu.c".  Zomplex case relies on complex */
-#endif
-#endif
-
-#define REAL
-#include "t_cholmod_super_numeric.c"
-#define COMPLEX
-#include "t_cholmod_super_numeric.c"
-#define ZOMPLEX
-#include "t_cholmod_super_numeric.c"
-
-/* ========================================================================== */
-/* === cholmod_super_numeric ================================================ */
-/* ========================================================================== */
-
-/* Returns TRUE if successful, or if the matrix is not positive definite.
- * Returns FALSE if out of memory, inputs are invalid, or other fatal error
- * occurs.
- */
-
-int CHOLMOD(super_numeric)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to factorize */
-    cholmod_sparse *F,	/* F = A' or A(:,f)' */
-    double beta [2],	/* beta*I is added to diagonal of matrix to factorize */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* factorization */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    cholmod_dense *C ;
-    Int *Super, *Map, *SuperMap ;
-    size_t maxcsize ;
-    Int nsuper, n, i, k, s, stype, nrow ;
-    int ok = TRUE, symbolic ;
-    size_t t, w ;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_PATTERN, CHOLMOD_COMPLEX, FALSE) ;
-    stype = A->stype ;
-    if (stype < 0)
-    {
-	if (A->nrow != A->ncol || A->nrow != L->n)
-	{
-	    ERROR (CHOLMOD_INVALID, "invalid dimensions") ;
-	    return (FALSE) ;
-	}
-    }
-    else if (stype == 0)
-    {
-	if (A->nrow != L->n)
-	{
-	    ERROR (CHOLMOD_INVALID, "invalid dimensions") ;
-	    return (FALSE) ;
-	}
-	RETURN_IF_NULL (F, FALSE) ;
-	RETURN_IF_XTYPE_INVALID (F, CHOLMOD_REAL, CHOLMOD_ZOMPLEX, FALSE) ;
-	if (A->nrow != F->ncol || A->ncol != F->nrow || F->stype != 0)
-	{
-	    ERROR (CHOLMOD_INVALID, "F invalid") ;
-	    return (FALSE) ;
-	}
-	if (A->xtype != F->xtype)
-	{
-	    ERROR (CHOLMOD_INVALID, "A and F must have same xtype") ;
-	    return (FALSE) ;
-	}
-    }
-    else
-    {
-	/* symmetric upper case not suppored */
-	ERROR (CHOLMOD_INVALID, "symmetric upper case not supported") ;
-	return (FALSE) ;
-    }
-    if (!(L->is_super))
-    {
-	ERROR (CHOLMOD_INVALID, "L not supernodal") ;
-	return (FALSE) ;
-    }
-    if (L->xtype != CHOLMOD_PATTERN)
-    {
-	if (! ((A->xtype == CHOLMOD_REAL    && L->xtype == CHOLMOD_REAL)
-	    || (A->xtype == CHOLMOD_COMPLEX && L->xtype == CHOLMOD_COMPLEX)
-	    || (A->xtype == CHOLMOD_ZOMPLEX && L->xtype == CHOLMOD_COMPLEX)))
-	{
-	    ERROR (CHOLMOD_INVALID, "complex type mismatch") ;
-	    return (FALSE) ;
-	}
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace in Common */
-    /* ---------------------------------------------------------------------- */
-
-    nsuper = L->nsuper ;
-    maxcsize = L->maxcsize ;
-    nrow = A->nrow ;
-    n = nrow ;
-
-    PRINT1 (("nsuper "ID" maxcsize %g\n", nsuper, (double) maxcsize)) ;
-    ASSERT (nsuper >= 0 && maxcsize > 0) ;
-
-    /* w = 2*n + 5*nsuper */
-    w = CHOLMOD(mult_size_t) (n, 2, &ok) ;
-    t = CHOLMOD(mult_size_t) (nsuper, 5, &ok) ;
-    w = CHOLMOD(add_size_t) (w, t, &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (n, w, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	return (FALSE) ;
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get the current factor L and allocate numerical part, if needed */
-    /* ---------------------------------------------------------------------- */
-
-    Super = L->super ;
-    symbolic = (L->xtype == CHOLMOD_PATTERN) ;
-    if (symbolic)
-    {
-	/* convert to supernodal numeric by allocating L->x */
-	CHOLMOD(change_factor) (
-		(A->xtype == CHOLMOD_REAL) ? CHOLMOD_REAL : CHOLMOD_COMPLEX,
-		TRUE, TRUE, TRUE, TRUE, L, Common) ;
-	if (Common->status < CHOLMOD_OK)
-	{
-	    /* the factor L remains in symbolic supernodal form */
-	    return (FALSE) ;
-	}
-    }
-    ASSERT (L->dtype == DTYPE) ;
-    ASSERT (L->xtype == CHOLMOD_REAL || L->xtype == CHOLMOD_COMPLEX) ;
-
-    /* supernodal LDL' is not supported */
-    L->is_ll = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get more workspace */
-    /* ---------------------------------------------------------------------- */
-
-    C = CHOLMOD(allocate_dense) (maxcsize, 1, maxcsize, L->xtype, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	int status = Common->status ;
-	if (symbolic)
-	{
-	    /* Change L back to symbolic, since the numeric values are not
-	     * initialized.  This cannot fail. */
-	    CHOLMOD(change_factor) (CHOLMOD_PATTERN, TRUE, TRUE, TRUE, TRUE,
-		    L, Common) ;
-	}
-	/* the factor L is now back to the form it had on input */
-	Common->status = status ;
-	return (FALSE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    SuperMap = Common->Iwork ;		/* size n (i/i/l) */
-    Map = Common->Flag ;    /* size n, use Flag as workspace for Map array */
-    for (i = 0 ; i < n ; i++)
-    {
-	Map [i] = EMPTY ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* find the mapping of nodes to relaxed supernodes */
-    /* ---------------------------------------------------------------------- */
-
-    /* SuperMap [k] = s if column k is contained in supernode s */
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	PRINT1 (("Super ["ID"] "ID" ncols "ID"\n",
-		    s, Super[s], Super[s+1]-Super[s]));
-	for (k = Super [s] ; k < Super [s+1] ; k++)
-	{
-	    SuperMap [k] = s ;
-	    PRINT2 (("relaxed SuperMap ["ID"] = "ID"\n", k, SuperMap [k])) ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* supernodal numerical factorization, using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (A->xtype)
-    {
-	case CHOLMOD_REAL:
-	    ok = r_cholmod_super_numeric (A, F, beta, L, C, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    ok = c_cholmod_super_numeric (A, F, beta, L, C, Common) ;
-	    break ;
-
-	case CHOLMOD_ZOMPLEX:
-	    /* This operates on complex L, not zomplex */
-	    ok = z_cholmod_super_numeric (A, F, beta, L, C, Common) ;
-	    break ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* clear Common workspace, free temp workspace C, and return */
-    /* ---------------------------------------------------------------------- */
-
-    /* Flag array was used as workspace, clear it */
-    Common->mark = EMPTY ;
-    /* CHOLMOD(clear_flag) (Common) ; */
-    CHOLMOD_CLEAR_FLAG (Common) ;
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-    CHOLMOD(free_dense) (&C, Common) ;
-    return (ok) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_solve.c b/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_solve.c
deleted file mode 100644
index ff5bf00..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_solve.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/* ========================================================================== */
-/* === Supernodal/cholmod_super_solve ======================================= */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Supernodal Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Supernodal 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
- * -------------------------------------------------------------------------- */
-
-/* Solve Lx=b or L'x=b for a supernodal factorization.  These routines do not
- * apply the permutation L->Perm.  See cholmod_solve for a more general
- * interface that performs that operation.
- */
-
-#ifndef NGPL
-#ifndef NSUPERNODAL
-
-#include "cholmod_internal.h"
-#include "cholmod_supernodal.h"
-
-/* ========================================================================== */
-/* === TEMPLATE ============================================================= */
-/* ========================================================================== */
-
-#define REAL
-#include "t_cholmod_super_solve.c"
-#define COMPLEX
-#include "t_cholmod_super_solve.c"
-
-/* ========================================================================== */
-/* === cholmod_super_lsolve ================================================= */
-/* ========================================================================== */
-
-/* Solve Lx=b where x and b are of size n-by-nrhs.  b is overwritten by the
- * solution x.  On input, b is stored in col-major order with leading dimension
- * of d, and on output x is stored in the same manner.
- *
- * The contents of the workspace E are undefined on both input and output.
- *
- * workspace: none
- */
-
-int CHOLMOD(super_lsolve)   /* TRUE if OK, FALSE if BLAS overflow occured */
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to use for the forward solve */
-    /* ---- output ---- */
-    cholmod_dense *X,	/* b on input, solution to Lx=b on output */
-    /* ---- workspace ---- */
-    cholmod_dense *E,	/* workspace of size nrhs*(L->maxesize) */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_NULL (X, FALSE) ;
-    RETURN_IF_NULL (E, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_COMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_COMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (E, CHOLMOD_REAL, CHOLMOD_COMPLEX, FALSE) ;
-    if (L->xtype != X->xtype)
-    {
-	ERROR (CHOLMOD_INVALID, "L and X must have the same xtype") ;
-	return (FALSE) ;
-    }
-    if (L->xtype != E->xtype)
-    {
-	ERROR (CHOLMOD_INVALID, "L and E must have the same xtype") ;
-	return (FALSE) ;
-    }
-    if (X->d < X->nrow || L->n != X->nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "X and L dimensions must match") ;
-	return (FALSE) ;
-    }
-    if (E->nzmax < X->ncol * (L->maxesize))
-    {
-	ERROR (CHOLMOD_INVALID, "workspace E not large enough") ;
-	return (FALSE) ;
-    }
-    if (!(L->is_ll) || !(L->is_super))
-    {
-	ERROR (CHOLMOD_INVALID, "L not supernodal") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-    ASSERT (IMPLIES (L->n == 0, L->nsuper == 0)) ;
-    if (L->n == 0 || X->ncol == 0)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* solve Lx=b using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (L->xtype)
-    {
-
-	case CHOLMOD_REAL:
-	    r_cholmod_super_lsolve (L, X, E, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    c_cholmod_super_lsolve (L, X, E, Common) ;
-	    break ;
-    }
-
-    if (CHECK_BLAS_INT && !Common->blas_ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large for the BLAS") ;
-    }
-    return (Common->blas_ok) ;
-}
-
-
-/* ========================================================================== */
-/* === cholmod_super_ltsolve ================================================ */
-/* ========================================================================== */
-
-/* Solve L'x=b where x and b are of size n-by-nrhs.  b is overwritten by the
- * solution x.  On input, b is stored in col-major order with leading dimension
- * of d, and on output x is stored in the same manner.
- *
- * The contents of the workspace E are undefined on both input and output.
- *
- * workspace: none
- */
-
-int CHOLMOD(super_ltsolve)  /* TRUE if OK, FALSE if BLAS overflow occured */
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to use for the backsolve */
-    /* ---- output ---- */
-    cholmod_dense *X,	/* b on input, solution to L'x=b on output */
-    /* ---- workspace ---- */
-    cholmod_dense *E,	/* workspace of size nrhs*(L->maxesize) */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_NULL (X, FALSE) ;
-    RETURN_IF_NULL (E, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_REAL, CHOLMOD_COMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (X, CHOLMOD_REAL, CHOLMOD_COMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (E, CHOLMOD_REAL, CHOLMOD_COMPLEX, FALSE) ;
-    if (L->xtype != X->xtype)
-    {
-	ERROR (CHOLMOD_INVALID, "L and X must have the same xtype") ;
-	return (FALSE) ;
-    }
-    if (L->xtype != E->xtype)
-    {
-	ERROR (CHOLMOD_INVALID, "L and E must have the same xtype") ;
-	return (FALSE) ;
-    }
-    if (X->d < X->nrow || L->n != X->nrow)
-    {
-	ERROR (CHOLMOD_INVALID, "X and L dimensions must match") ;
-	return (FALSE) ;
-    }
-    if (E->nzmax < X->ncol * (L->maxesize))
-    {
-	ERROR (CHOLMOD_INVALID, "workspace E not large enough") ;
-	return (FALSE) ;
-    }
-    if (!(L->is_ll) || !(L->is_super))
-    {
-	ERROR (CHOLMOD_INVALID, "L not supernodal") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-    ASSERT (IMPLIES (L->n == 0, L->nsuper == 0)) ;
-    if (L->n == 0 || X->ncol == 0)
-    {
-	/* nothing to do */
-	return (TRUE) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* solve Lx=b using template routine */
-    /* ---------------------------------------------------------------------- */
-
-    switch (L->xtype)
-    {
-
-	case CHOLMOD_REAL:
-	    r_cholmod_super_ltsolve (L, X, E, Common) ;
-	    break ;
-
-	case CHOLMOD_COMPLEX:
-	    c_cholmod_super_ltsolve (L, X, E, Common) ;
-	    break ;
-    }
-
-    if (CHECK_BLAS_INT && !Common->blas_ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large for the BLAS") ;
-    }
-    return (Common->blas_ok) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_symbolic.c b/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_symbolic.c
deleted file mode 100644
index 72491b8..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Supernodal/cholmod_super_symbolic.c
+++ /dev/null
@@ -1,994 +0,0 @@
-/* ========================================================================== */
-/* === Supernodal/cholmod_super_symbolic ==================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Supernodal Module. Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Supernodal 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
- * -------------------------------------------------------------------------- */
-
-/* Supernodal symbolic analysis of the LL' factorization of A, A*A',
- * A(:,f)*A(:,f)'.
- *
- * This routine must be preceded by a simplicial symbolic analysis
- * (cholmod_rowcolcounts).  See cholmod_analyze.c for an example of how to use
- * this routine.
- *
- * The user need not call this directly; cholmod_analyze is a "simple" wrapper
- * for this routine.
- *
- * Symmetric case:
- *
- *	A is stored in column form, with entries stored in the upper triangular
- *	part.  Entries in the lower triangular part are ignored.
- *
- * Unsymmetric case:
- *
- *	A is stored in column form.  If F is equal to the transpose of A, then
- *	A*A' is analyzed.  F can include a subset of the columns of A
- *	(F=A(:,f)'), in which case F*F' is analyzed.
- *
- * Requires Parent and L->ColCount to be defined on input; these are the
- * simplicial Parent and ColCount arrays as computed by cholmod_rowcolcounts.
- * Does not use L->Perm; the input matrices A and F must already be properly
- * permuted.  Allocates and computes the supernodal pattern of L (L->super,
- * L->pi, L->px, and L->s).  Does not allocate the real part (L->x).
- *
- * Supports any xtype (pattern, real, complex, or zomplex).
- */
-
-#ifndef NGPL
-#ifndef NSUPERNODAL
-
-#include "cholmod_internal.h"
-#include "cholmod_supernodal.h"
-
-#ifdef GPU_BLAS
-#include "cholmod_gpu.h"
-#endif
-
-/* ========================================================================== */
-/* === subtree ============================================================== */
-/* ========================================================================== */
-
-/* In the symmetric case, traverse the kth row subtree from the nonzeros in
- * A (0:k1-1,k) and add the new entries found to the pattern of the kth row
- * of L.  The current supernode s contains the diagonal block k1:k2-1, so it
- * can be skipped.
- *
- * In the unsymmetric case, the nonzero pattern of A*F is computed one column
- * at a time (thus, the total time spent in this function is bounded below by
- * the time taken to multiply A*F, which can be high if A is tall and thin).
- * The kth column is A*F(:,k), or the set union of all columns A(:,j) for which
- * F(j,k) is nonzero.  This routine is called once for each entry j.  Only the
- * upper triangular part is needed, so only A (0:k1-1,j) is accessed, where
- * k1:k2-1 are the columns of the current supernode s (k is in the range k1 to
- * k2-1).
- *
- * If A is sorted, then the total time taken by this function is proportional
- * to the number of nonzeros in the strictly block upper triangular part of A,
- * plus the number of entries in the strictly block lower triangular part of
- * the supernodal part of L.  This excludes entries in the diagonal blocks
- * corresponding to the columns in each supernode.  That is, if k1:k2-1 are
- * in a single supernode, then only A (0:k1-1,k1:k2-1) are accessed.
- *
- * For the unsymmetric case, only the strictly block upper triangular part
- * of A*F is constructed.
- *
- * Only adds column indices corresponding to the leading columns of each
- * relaxed supernode.
- */
-
-static void subtree
-(
-    /* inputs, not modified: */
-    Int j,		/* j = k for symmetric case */
-    Int k,
-    Int Ap [ ],
-    Int Ai [ ],
-    Int Anz [ ],
-    Int SuperMap [ ],
-    Int Sparent [ ],
-    Int mark,
-    Int sorted,         /* true if the columns of A are sorted */
-    Int k1,             /* only consider A (0:k1-1,k) */
-
-    /* input/output: */
-    Int Flag [ ],
-    Int Ls [ ],
-    Int Lpi2 [ ]
-)
-{
-    Int p, pend, i, si ;
-    p = Ap [j] ;
-    pend = (Anz == NULL) ? (Ap [j+1]) : (p + Anz [j]) ;
-
-    for ( ; p < pend ; p++)
-    {
-	i = Ai [p] ;
-	if (i < k1)
-	{
-	    /* (i,k) is an entry in the upper triangular part of A or A*F'.
-	     * symmetric case:   A(i,k) is nonzero (j=k).
-	     * unsymmetric case: A(i,j) and F(j,k) are both nonzero.
-	     *
-	     * Column i is in supernode si = SuperMap [i].  Follow path from si
-	     * to root of supernodal etree, stopping at the first flagged
-	     * supernode.  The root of the row subtree is supernode SuperMap[k],
-	     * which is flagged already. This traversal will stop there, or it
-	     * might stop earlier if supernodes have been flagged by previous
-	     * calls to this routine for the same k. */
-	    for (si = SuperMap [i] ; Flag [si] < mark ; si = Sparent [si])
-	    {
-		ASSERT (si <= SuperMap [k]) ;
-		Ls [Lpi2 [si]++] = k ;
-		Flag [si] = mark ;
-	    }
-	}
-        else if (sorted)
-        {
-            break ;
-        }
-    }
-}
-
-
-/* clear workspace used by cholmod_super_symbolic */
-#define FREE_WORKSPACE \
-{ \
-    /* CHOLMOD(clear_flag) (Common) ; */ \
-    CHOLMOD_CLEAR_FLAG (Common) ; \
-    for (k = 0 ; k <= nfsuper ; k++) \
-    { \
-	Head [k] = EMPTY ; \
-    } \
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ; \
-} \
-
-
-/* ========================================================================== */
-/* === cholmod_super_symbolic2 ============================================== */
-/* ========================================================================== */
-
-/* Analyze for supernodal Cholesky or multifrontal QR. */
-
-int CHOLMOD(super_symbolic2)
-(
-    /* ---- input ---- */
-    int for_whom,       /* FOR_SPQR     (0): for SPQR but not GPU-accelerated
-                           FOR_CHOLESKY (1): for Cholesky (GPU or not)
-                           FOR_SPQRGPU  (2): for SPQR with GPU acceleration */
-    cholmod_sparse *A,	/* matrix to analyze */
-    cholmod_sparse *F,	/* F = A' or A(:,f)' */
-    Int *Parent,	/* elimination tree */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* simplicial symbolic on input,
-			 * supernodal symbolic on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double zrelax0, zrelax1, zrelax2, xxsize ;
-    Int *Wi, *Wj, *Super, *Snz, *Ap, *Ai, *Flag, *Head, *Ls, *Lpi, *Lpx, *Fnz,
-	*Sparent, *Anz, *SuperMap, *Merged, *Nscol, *Zeros, *Fp, *Fj,
-	*ColCount, *Lpi2, *Lsuper, *Iwork ;
-    Int nsuper, d, n, j, k, s, mark, parent, p, pend, k1, k2, packed, nscol,
-	nsrow, ndrow1, ndrow2, stype, ssize, xsize, sparent, plast, slast,
-	csize, maxcsize, ss, nscol0, nscol1, ns, nfsuper, newzeros, totzeros,
-	merge, snext, esize, maxesize, nrelax0, nrelax1, nrelax2, Asorted ;
-    size_t w ;
-    int ok = TRUE, find_xsize ;
-    const char* env_use_gpu;
-    const char* env_max_bytes;
-    size_t max_bytes;
-    const char* env_max_fraction;
-    double max_fraction;
-
-    /* ---------------------------------------------------------------------- */
-    /* check inputs */
-    /* ---------------------------------------------------------------------- */
-
-    RETURN_IF_NULL_COMMON (FALSE) ;
-    RETURN_IF_NULL (A, FALSE) ;
-    RETURN_IF_NULL (L, FALSE) ;
-    RETURN_IF_NULL (Parent, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (A, CHOLMOD_PATTERN, CHOLMOD_ZOMPLEX, FALSE) ;
-    RETURN_IF_XTYPE_INVALID (L, CHOLMOD_PATTERN, CHOLMOD_PATTERN, FALSE) ;
-    stype = A->stype ;
-    if (stype < 0)
-    {
-	/* invalid symmetry; symmetric lower form not supported */
-	ERROR (CHOLMOD_INVALID, "symmetric lower not supported") ;
-	return (FALSE) ;
-    }
-    if (stype == 0)
-    {
-	/* F must be present in the unsymmetric case */
-	RETURN_IF_NULL (F, FALSE) ;
-    }
-    if (L->is_super)
-    {
-	/* L must be a simplicial symbolic factor */
-	ERROR (CHOLMOD_INVALID, "L must be symbolic on input") ;
-	return (FALSE) ;
-    }
-    Common->status = CHOLMOD_OK ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate workspace */
-    /* ---------------------------------------------------------------------- */
-
-    n = A->nrow ;
-
-    /* w = 5*n */
-    w = CHOLMOD(mult_size_t) (n, 5, &ok) ;
-    if (!ok)
-    {
-	ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	return (FALSE) ;
-    }
-
-    CHOLMOD(allocate_work) (n, w, 0, Common) ;
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory */
-	return (FALSE) ;
-    }
-    ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate GPU workspace */
-    /* ---------------------------------------------------------------------- */
-
-    L->useGPU = 0 ;     /* only used for Cholesky factorization, not QR */
-
-#ifdef GPU_BLAS
-
-    /* GPU module is installed */
-    if ( for_whom == CHOLMOD_ANALYZE_FOR_CHOLESKY )
-    {
-        /* only allocate GPU workspace for supernodal Cholesky, and only when
-           the GPU is requested and available. */
-
-        max_bytes = 0;
-        max_fraction = 0;
-
-#ifdef DLONG
-        if ( Common->useGPU == EMPTY )
-        {
-            /* useGPU not explicity requested by the user, but not explicitly
-             * prohibited either.  Query OS environment variables for request.*/
-            env_use_gpu  = getenv("CHOLMOD_USE_GPU");
-
-            if ( env_use_gpu )
-            {
-                /* CHOLMOD_USE_GPU environment variable is set to something */
-                if ( atoi ( env_use_gpu ) == 0 )
-                {
-                    Common->useGPU = 0; /* don't use the gpu */
-                }
-                else
-                {
-                    Common->useGPU = 1; /* use the gpu */
-                    env_max_bytes = getenv("CHOLMOD_GPU_MEM_BYTES");
-                    env_max_fraction = getenv("CHOLMOD_GPU_MEM_FRACTION");
-                    if ( env_max_bytes )
-                    {
-                        max_bytes = atol(env_max_bytes);
-                        Common->maxGpuMemBytes = max_bytes;
-                    }
-                    if ( env_max_fraction )
-                    {
-                        max_fraction = atof (env_max_fraction);
-                        if ( max_fraction < 0 ) max_fraction = 0;
-                        if ( max_fraction > 1 ) max_fraction = 1;
-                        Common->maxGpuMemFraction = max_fraction;
-                    }	  
-                }
-            }
-            else
-            {
-                /* CHOLMOD_USE_GPU environment variable not set, so no GPU
-                 * acceleration will be used */
-                Common->useGPU = 0;
-            }
-            /* fprintf (stderr, "useGPU queried: %d\n", Common->useGPU) ; */
-        }
-
-        /* Ensure that a GPU is present */
-        if ( Common->useGPU == 1 )
-        {
-            /* fprintf (stderr, "\nprobe GPU:\n") ; */
-            Common->useGPU = CHOLMOD(gpu_probe) (Common); 
-            /* fprintf (stderr, "\nprobe GPU: result %d\n", Common->useGPU) ; */
-        }
-
-        if ( Common->useGPU == 1 )
-        {
-            /* Cholesky + GPU, so allocate space */
-            /* fprintf (stderr, "allocate GPU:\n") ; */
-            CHOLMOD(gpu_allocate) ( Common );
-            /* fprintf (stderr, "allocate GPU done\n") ; */
-        }
-#else
-        /* GPU acceleration is only supported for long int version */
-        Common->useGPU = 0;
-#endif
-
-        /* Cache the fact that the symbolic factorization supports 
-         * GPU acceleration */
-        L->useGPU = Common->useGPU;
-
-    }
-
-#else
-    /* GPU module is not installed */
-    Common->useGPU = 0 ;
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    /* A is now either A or triu(A(p,p)) for the symmetric case.  It is either
-     * A or A(p,f) for the unsymmetric case (both in column form).  It can be
-     * either packed or unpacked, and either sorted or unsorted.  Entries in
-     * the lower triangular part may be present if A is symmetric, but these
-     * are ignored. */
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Anz = A->nz ;
-
-    if (stype != 0)
-    {
-	/* F not accessed */
-	Fp = NULL ;
-	Fj = NULL ;
-	Fnz = NULL ;
-	packed = TRUE ;
-    }
-    else
-    {
-	/* F = A(:,f) or A(p,f) in packed row form, either sorted or unsorted */
-	Fp = F->p ;
-	Fj = F->i ;
-	Fnz = F->nz ;
-	packed = F->packed ;
-    }
-
-    ColCount = L->ColCount ;
-
-    nrelax0 = Common->nrelax [0] ;
-    nrelax1 = Common->nrelax [1] ;
-    nrelax2 = Common->nrelax [2] ;
-
-    zrelax0 = Common->zrelax [0] ;
-    zrelax1 = Common->zrelax [1] ;
-    zrelax2 = Common->zrelax [2] ;
-
-    zrelax0 = IS_NAN (zrelax0) ? 0 : zrelax0 ;
-    zrelax1 = IS_NAN (zrelax1) ? 0 : zrelax1 ;
-    zrelax2 = IS_NAN (zrelax2) ? 0 : zrelax2 ;
-
-    ASSERT (CHOLMOD(dump_parent) (Parent, n, "Parent", Common)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get workspace */
-    /* ---------------------------------------------------------------------- */
-
-    /* Sparent, Snz, and Merged could be allocated later, of size nfsuper */
-
-    Iwork = Common->Iwork ;
-    Wi      = Iwork ;	    /* size n (i/l/l).  Lpi2 is i/l/l */
-    Wj      = Iwork + n ;   /* size n (i/l/l).  Zeros is i/l/l */
-    Sparent = Iwork + 2*((size_t) n) ; /* size nfsuper <= n [ */
-    Snz     = Iwork + 3*((size_t) n) ; /* size nfsuper <= n [ */
-    Merged  = Iwork + 4*((size_t) n) ; /* size nfsuper <= n [ */
-
-    Flag = Common->Flag ;   /* size n */
-    Head = Common->Head ;   /* size n+1 */
-
-    /* ---------------------------------------------------------------------- */
-    /* find the fundamental supernodes */
-    /* ---------------------------------------------------------------------- */
-
-    /* count the number of children of each node, using Wi [ */
-    for (j = 0 ; j < n ; j++)
-    {
-	Wi [j] = 0 ;
-    }
-    for (j = 0 ; j < n ; j++)
-    {
-	parent = Parent [j] ;
-	if (parent != EMPTY)
-	{
-	    Wi [parent]++ ;
-	}
-    }
-
-    Super = Head ;  /* use Head [0..nfsuper] as workspace for Super list ( */
-
-    /* column 0 always starts a new supernode */
-    nfsuper = (n == 0) ? 0 : 1 ;	/* number of fundamental supernodes */
-    Super [0] = 0 ;
-
-    for (j = 1 ; j < n ; j++)
-    {
-	/* check if j starts new supernode, or in the same supernode as j-1 */
-	if (Parent [j-1] != j	    /* parent of j-1 is not j */
-	    || (ColCount [j-1] != ColCount [j] + 1) /* j-1 not subset of j*/
-	    || Wi [j] > 1	    /* j has more than one child */
-#ifdef GPU_BLAS
-	    /* Ensure that the supernode will fit in the GPU buffers */
-	    /* Data size of 16 bytes must be assumed for case of PATTERN */
-	    || (for_whom == CHOLMOD_ANALYZE_FOR_CHOLESKY && L->useGPU && 
-		 (j-Super[nfsuper-1]+1) * 
-		 ColCount[Super[nfsuper-1]] * sizeof(double) * 2 >= 
-		 Common->devBuffSize)
-#endif
-	    )
-	{
-	    /* j is the leading node of a supernode */
-	    Super [nfsuper++] = j ;
-	}
-    }
-    Super [nfsuper] = n ;
-
-    /* contents of Wi no longer needed for child count ] */
-
-    Nscol = Wi ; /* use Wi as size-nfsuper workspace for Nscol [ */
-
-    /* ---------------------------------------------------------------------- */
-    /* find the mapping of fundamental nodes to supernodes */
-    /* ---------------------------------------------------------------------- */
-
-    SuperMap = Wj ;	/* use Wj as workspace for SuperMap [ */
-
-    /* SuperMap [k] = s if column k is contained in supernode s */
-    for (s = 0 ; s < nfsuper ; s++)
-    {
-	for (k = Super [s] ; k < Super [s+1] ; k++)
-	{
-	    SuperMap [k] = s ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* construct the fundamental supernodal etree */
-    /* ---------------------------------------------------------------------- */
-
-    for (s = 0 ; s < nfsuper ; s++)
-    {
-	j = Super [s+1] - 1 ;	/* last node in supernode s */
-	parent = Parent [j] ;	/* parent of last node */
-	Sparent [s] = (parent == EMPTY) ? EMPTY : SuperMap [parent] ;
-	PRINT1 (("Sparent ["ID"] = "ID"\n", s, Sparent [s])) ;
-    }
-
-    /* contents of Wj no longer needed as workspace for SuperMap ]
-     * SuperMap will be recomputed below, for the relaxed supernodes. */
-
-    Zeros = Wj ;   /* use Wj for Zeros, workspace of size nfsuper [ */
-
-    /* ---------------------------------------------------------------------- */
-    /* relaxed amalgamation */
-    /* ---------------------------------------------------------------------- */
-
-    for (s = 0 ; s < nfsuper ; s++)
-    {
-	Merged [s] = EMPTY ;			/* s not merged into another */
-	Nscol [s] = Super [s+1] - Super [s] ;	/* # of columns in s */
-	Zeros [s] = 0 ;				/* # of zero entries in s */
-	ASSERT (s <= Super [s]) ;
-	Snz [s] = ColCount [Super [s]] ;  /* # of entries in leading col of s */
-	PRINT2 (("lnz ["ID"] "ID"\n", s, Snz [s])) ;
-    }
-
-    for (s = nfsuper-2 ; s >= 0 ; s--)
-    {
-        double lnz1 ;
-
-	/* should supernodes s and s+1 merge into a new node s? */
-	PRINT1 (("\n========= Check relax of s "ID" and s+1 "ID"\n", s, s+1)) ;
-
-	ss = Sparent [s] ;
-	if (ss == EMPTY)
-	{
-	    PRINT1 (("s "ID" is a root, no merge with s+1 = "ID"\n", s, s+1)) ;
-	    continue ;
-	}
-
-	/* find the current parent of s (perform path compression as needed) */
-	for (ss = Sparent [s] ; Merged [ss] != EMPTY ; ss = Merged [ss]) ;
-	sparent = ss ;
-	PRINT2 (("Current sparent of s "ID" is "ID"\n", s, sparent)) ;
-
-	/* ss is the current parent of s */
-	for (ss = Sparent [s] ; Merged [ss] != EMPTY ; ss = snext)
-	{
-	    snext = Merged [ss] ;
-	    PRINT2 (("ss "ID" is dead, merged into snext "ID"\n", ss, snext)) ;
-	    Merged [ss] = sparent ;
-	}
-
-	/* if s+1 is not the current parent of s, do not merge */
-	if (sparent != s+1)
-	{
-	    continue ;
-	}
-
-	nscol0 = Nscol [s] ;	/* # of columns in s */
-	nscol1 = Nscol [s+1] ;	/* # of columns in s+1 */
-	ns = nscol0 + nscol1 ;
-	PRINT2 (("ns "ID" nscol0 "ID" nscol1 "ID"\n", ns, nscol0, nscol1)) ;
-
-	totzeros = Zeros [s+1] ;	/* current # of zeros in s+1 */
-	lnz1 = (double) (Snz [s+1]) ;	/* # entries in leading column of s+1 */
-
-	/* determine if supernodes s and s+1 should merge */
-	if (ns <= nrelax0)
-	{
-	    PRINT2 (("ns is tiny ("ID"), so go ahead and merge\n", ns)) ;
-	    merge = TRUE ;
-	}
-	else
-	{
-	    /* use double to avoid integer overflow */
-	    double lnz0 = Snz [s] ;	/* # entries in leading column of s */
-	    double xnewzeros = nscol0 * (lnz1 + nscol0 - lnz0) ;
-
-	    /* use Int for the final update of Zeros [s] below */
-	    newzeros = nscol0 * (Snz [s+1] + nscol0 - Snz [s]) ;
-	    ASSERT (newzeros == xnewzeros) ;
-
-	    PRINT2 (("lnz0 %g lnz1 %g xnewzeros %g\n", lnz0, lnz1, xnewzeros)) ;
-	    if (xnewzeros == 0)
-	    {
-		/* no new zeros, so go ahead and merge */
-		PRINT2 (("no new fillin, so go ahead and merge\n")) ;
-		merge = TRUE ;
-	    }
-	    else
-	    {
-		/* # of zeros if merged */
-		double xtotzeros = ((double) totzeros) + xnewzeros ;
-
-		/* xtotsize: total size of merged supernode, if merged: */
-		double xns = (double) ns ;
-		double xtotsize  = (xns * (xns+1) / 2) + xns * (lnz1 - nscol1) ;
-		double z = xtotzeros / xtotsize ;
-
-		Int totsize ;
-		totsize  = (ns * (ns+1) / 2) + ns * (Snz [s+1] - nscol1) ;
-
-		PRINT2 (("oldzeros "ID" newzeros "ID" xtotsize %g z %g\n",
-			    Zeros [s+1], newzeros, xtotsize, z)) ;
-
-		/* use Int for the final update of Zeros [s] below */
-		totzeros += newzeros ;
-
-		/* do not merge if supernode would become too big
-		 * (Int overflow).  Continue computing; not (yet) an error. */
-		/* fl.pt. compare, but no NaN's can occur here */
-		merge = ((ns <= nrelax1 && z < zrelax0) ||
-			 (ns <= nrelax2 && z < zrelax1) ||
-					  (z < zrelax2)) &&
-			(xtotsize < Int_max / sizeof (double)) ;
-
-	    }
-	}
-
-#ifdef GPU_BLAS
-	if ( for_whom == CHOLMOD_ANALYZE_FOR_CHOLESKY && L->useGPU ) {
-	  /* Ensure that the aggregated supernode fits in the device 
-	     supernode buffers */
-	  double xns = (double) ns;
-	  if ( ((xns * xns) + xns * (lnz1 - nscol1))*sizeof(double)*2  >= 
-	       Common->devBuffSize ) {
-	    merge = FALSE;
-	  }
-	}
-#endif
-
-	if (merge)
-	{
-	    PRINT1 (("Merge node s ("ID") and s+1 ("ID")\n", s, s+1)) ;
-	    Zeros [s] = totzeros ;
-	    Merged [s+1] = s ;
-	    Snz [s] = nscol0 + Snz [s+1] ;
-	    Nscol [s] += Nscol [s+1] ;
-	}
-    }
-
-    /* contents of Wj no longer needed for Zeros ] */
-    /* contents of Wi no longer needed for Nscol ] */
-    /* contents of Sparent no longer needed (recomputed below) */
-
-    /* ---------------------------------------------------------------------- */
-    /* construct the relaxed supernode list */
-    /* ---------------------------------------------------------------------- */
-
-    nsuper = 0 ;
-    for (s = 0 ; s < nfsuper ; s++)
-    {
-	if (Merged [s] == EMPTY)
-	{
-	    PRINT1 (("live supernode: "ID" snz "ID"\n", s, Snz [s])) ;
-	    Super [nsuper] = Super [s] ;
-	    Snz [nsuper] = Snz [s] ;
-	    nsuper++ ;
-	}
-    }
-    Super [nsuper] = n ;
-    PRINT1 (("Fundamental supernodes: "ID"  relaxed "ID"\n", nfsuper, nsuper)) ;
-
-    /* Merged no longer needed ] */
-
-    /* ---------------------------------------------------------------------- */
-    /* find the mapping of relaxed nodes to supernodes */
-    /* ---------------------------------------------------------------------- */
-
-    /* use Wj as workspace for SuperMap { */
-
-    /* SuperMap [k] = s if column k is contained in supernode s */
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	for (k = Super [s] ; k < Super [s+1] ; k++)
-	{
-	    SuperMap [k] = s ;
-	}
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* construct the relaxed supernodal etree */
-    /* ---------------------------------------------------------------------- */
-
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	j = Super [s+1] - 1 ;	/* last node in supernode s */
-	parent = Parent [j] ;	/* parent of last node */
-	Sparent [s] = (parent == EMPTY) ? EMPTY : SuperMap [parent] ;
-	PRINT1 (("new Sparent ["ID"] = "ID"\n", s, Sparent [s])) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* determine the size of L->s and L->x */
-    /* ---------------------------------------------------------------------- */
-
-    ssize = 0 ;
-    xsize = 0 ;
-    xxsize = 0 ;
-    find_xsize = for_whom == CHOLMOD_ANALYZE_FOR_CHOLESKY ||
-                 for_whom == CHOLMOD_ANALYZE_FOR_SPQRGPU ;
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	nscol = Super [s+1] - Super [s] ;
-	nsrow = Snz [s] ;
-	ASSERT (nscol > 0) ;
-	ssize += nsrow ;
-        if (find_xsize)
-        {
-            xsize += nscol * nsrow ;
-            /* also compute xsize in double to guard against Int overflow */
-            xxsize += ((double) nscol) * ((double) nsrow) ;
-        }
-	if (ssize < 0 ||(find_xsize && xxsize > Int_max))
-	{
-	    /* Int overflow, clear workspace and return.
-               QR factorization will not use xxsize, so that error is ignored.
-               For Cholesky factorization, however, memory of space xxsize
-               will be allocated, so this is a failure.  Both QR and Cholesky
-               fail if ssize overflows. */
-	    ERROR (CHOLMOD_TOO_LARGE, "problem too large") ;
-	    FREE_WORKSPACE ;
-	    return (FALSE) ;
-	}
-	ASSERT (ssize > 0) ;
-        ASSERT (IMPLIES (find_xsize, xsize > 0)) ;
-    }
-    xsize = MAX (1, xsize) ;
-    ssize = MAX (1, ssize) ;
-    PRINT1 (("ix sizes: "ID" "ID" nsuper "ID"\n", ssize, xsize, nsuper)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* allocate L (all except real part L->x) */
-    /* ---------------------------------------------------------------------- */
-
-    L->ssize = ssize ;
-    L->xsize = xsize ;
-    L->nsuper = nsuper ;
-
-    CHOLMOD(change_factor) (CHOLMOD_PATTERN, TRUE, TRUE, TRUE, TRUE, L, Common);
-
-    if (Common->status < CHOLMOD_OK)
-    {
-	/* out of memory; L is still a valid simplicial symbolic factor */
-	FREE_WORKSPACE ;
-	return (FALSE) ;
-    }
-
-    DEBUG (CHOLMOD(dump_factor) (L, "L to symbolic super", Common)) ;
-    ASSERT (L->is_ll && L->xtype == CHOLMOD_PATTERN && L->is_super) ;
-
-    Lpi = L->pi ;
-    Lpx = L->px ;
-    Ls = L->s ;
-    Ls [0] = 0 ;    /* flag for cholmod_check_factor; supernodes are defined */
-    Lsuper = L->super ;
-
-    /* copy the list of relaxed supernodes into the final list in L */
-    for (s = 0 ; s <= nsuper ; s++)
-    {
-	Lsuper [s] = Super [s] ;
-    }
-
-    /* Head no longer needed as workspace for fundamental Super list ) */
-
-    Super = Lsuper ;	    /* Super is now the list of relaxed supernodes */
-
-    /* ---------------------------------------------------------------------- */
-    /* construct column pointers of relaxed supernodal pattern (L->pi) */
-    /* ---------------------------------------------------------------------- */
-
-    p = 0 ;
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	Lpi [s] = p ;
-	p += Snz [s] ;
-	PRINT1 (("Snz ["ID"] = "ID", Super ["ID"] = "ID"\n",
-		    s, Snz [s], s, Super[s])) ;
-    }
-    Lpi [nsuper] = p ;
-    ASSERT ((Int) (L->ssize) == MAX (1,p)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* construct pointers for supernodal values (L->px) */
-    /* ---------------------------------------------------------------------- */
-
-    if (for_whom == CHOLMOD_ANALYZE_FOR_CHOLESKY ||
-        for_whom == CHOLMOD_ANALYZE_FOR_SPQRGPU)
-    {
-        Lpx [0] = 0 ;
-        p = 0 ;
-        for (s = 0 ; s < nsuper ; s++)
-        {
-            nscol = Super [s+1] - Super [s] ;   /* number of columns in s */
-            nsrow = Snz [s] ;           /* # of rows, incl triangular part*/
-            Lpx [s] = p ;               /* pointer to numerical part of s */
-            p += nscol * nsrow ;
-        }
-        Lpx [s] = p ;
-        ASSERT ((Int) (L->xsize) == MAX (1,p)) ;
-    }
-    else
-    {
-        /* L->px is not needed for non-GPU accelerated QR factorization (it may
-         * lead to Int overflow, anyway, if xsize caused Int overflow above).
-         * Use a magic number to tell cholmod_check_factor to ignore Lpx. */
-        Lpx [0] = 123456 ;
-    }
-
-    /* Snz no longer needed ] */
-
-    /* ---------------------------------------------------------------------- */
-    /* symbolic analysis to construct the relaxed supernodal pattern (L->s) */
-    /* ---------------------------------------------------------------------- */
-
-    Lpi2 = Wi ;	    /* copy Lpi into Lpi2, using Wi as workspace for Lpi2 [ */
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	Lpi2 [s] = Lpi [s] ;
-    }
-
-    Asorted = A->sorted ;
-
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	/* sth supernode is in columns k1 to k2-1.
-	 * compute nonzero pattern of L (k1:k2-1,:). */
-
-	/* place rows k1 to k2-1 in leading column of supernode s */
-	k1 = Super [s] ;
-	k2 = Super [s+1] ;
-	PRINT1 (("=========>>> Supernode "ID" k1 "ID" k2-1 "ID"\n",
-		    s, k1, k2-1)) ;
-	for (k = k1 ; k < k2 ; k++)
-	{
-	    Ls [Lpi2 [s]++] = k ;
-	}
-
-	/* compute nonzero pattern each row k1 to k2-1 */
-	for (k = k1 ; k < k2 ; k++)
-	{
-	    /* compute row k of L.  In the symmetric case, the pattern of L(k,:)
-	     * is the set of nodes reachable in the supernodal etree from any
-	     * row i in the nonzero pattern of A(0:k,k).  In the unsymmetric
-	     * case, the pattern of the kth column of A*A' is the set union
-	     * of all columns A(0:k,j) for each nonzero F(j,k). */
-
-	    /* clear the Flag array and mark the current supernode */
-	    /* mark = CHOLMOD(clear_flag) (Common) ; */
-	    CHOLMOD_CLEAR_FLAG (Common) ;
-	    mark = Common->mark ;
-	    Flag [s] = mark ;
-	    ASSERT (s == SuperMap [k]) ;
-
-	    /* traverse the row subtree for each nonzero in A or AA' */
-	    if (stype != 0)
-	    {
-		subtree (k, k, Ap, Ai, Anz, SuperMap, Sparent, mark,
-                        Asorted, k1, Flag, Ls, Lpi2) ;
-	    }
-	    else
-	    {
-		/* for each j nonzero in F (:,k) do */
-		p = Fp [k] ;
-		pend = (packed) ? (Fp [k+1]) : (p + Fnz [k]) ;
-		for ( ; p < pend ; p++)
-		{
-		    subtree (Fj [p], k, Ap, Ai, Anz, SuperMap, Sparent, mark,
-			    Asorted, k1, Flag, Ls, Lpi2) ;
-		}
-	    }
-	}
-    }
-#ifndef NDEBUG
-    for (s = 0 ; s < nsuper ; s++)
-    {
-	PRINT1 (("Lpi2[s] "ID" Lpi[s+1] "ID"\n", Lpi2 [s], Lpi [s+1])) ;
-	ASSERT (Lpi2 [s] == Lpi [s+1]) ;
-	CHOLMOD(dump_super) (s, Super, Lpi, Ls, NULL, NULL, 0, Common) ;
-    }
-#endif
-
-    /* contents of Wi no longer needed for Lpi2 ] */
-    /* Sparent no longer needed ] */
-
-    /* ---------------------------------------------------------------------- */
-    /* determine the largest update matrix (L->maxcsize) */
-    /* ---------------------------------------------------------------------- */
-
-    /* maxcsize could be determined before L->s is allocated and defined, which
-     * would mean that all memory requirements for both the symbolic and numeric
-     * factorizations could be computed using O(nnz(A)+O(n)) space.  However, it
-     * would require a lot of extra work.  The analysis phase, above, would need
-     * to be duplicated, but with Ls not kept; instead, the algorithm would keep
-     * track of the current s and slast for each supernode d, and update them
-     * when a new row index appears in supernode d.  An alternative would be to
-     * do this computation only if the allocation of L->s failed, in which case
-     * the following code would be skipped.
-     *
-     * The csize for a supernode is the size of its largest contribution to
-     * a subsequent ancestor supernode.  For example, suppose the rows of #'s
-     * in the figure below correspond to the columns of a subsequent supernode,
-     * and the dots are the entries in that ancestore.
-     *
-     *	    c
-     *	    c c
-     *	    c c c
-     *	    x x x
-     *	    x x x
-     *	    # # #   .
-     *	    # # #   . .
-     *	    * * *   . .
-     *	    * * *   . .
-     *	    * * *   . .
-     *	            . .
-     *
-     * Then for this update, the csize is 3-by-2, or 6, because there are 3
-     * rows of *'s which is the number of rows in the update, and there are
-     * 2 rows of #'s, which is the number columns in the update.  The csize
-     * of a supernode is the largest such contribution for any ancestor
-     * supernode.  maxcsize, for the whole matrix, has a rough upper bound of
-     * the maximum size of any supernode.  This bound is loose, because the
-     * the contribution must be less than the size of the ancestor supernodal
-     * that it's updating.  maxcsize of a completely dense matrix, with one
-     * supernode, is zero.
-     *
-     * maxesize is the column dimension for the workspace E needed for the
-     * solve.  E is of size nrhs-by-maxesize, where the nrhs is the number of
-     * columns in the right-hand-side.  The maxesize is the largest esize of
-     * any supernode.  The esize of a supernode is the number of row indices
-     * it contains, excluding the column indices of the supernode itself.
-     * For the following example, esize is 4:
-     *
-     *	    c
-     *	    c c
-     *	    c c c
-     *	    x x x
-     *	    x x x
-     *	    x x x
-     *	    x x x
-     *
-     * maxesize can be no bigger than n.
-     */
-
-    maxcsize = 1 ;
-    maxesize = 1 ;
-
-    /* Do not need to guard csize against Int overflow since xsize is OK. */
-
-    if (for_whom == CHOLMOD_ANALYZE_FOR_CHOLESKY ||
-        for_whom == CHOLMOD_ANALYZE_FOR_SPQRGPU)
-    {
-        /* this is not needed for non-GPU accelerated QR factorization */
-        for (d = 0 ; d < nsuper ; d++)
-        {
-            nscol = Super [d+1] - Super [d] ;
-            p = Lpi [d] + nscol ;
-            plast = p ;
-            pend = Lpi [d+1] ;
-            esize = pend - p ;
-            maxesize = MAX (maxesize, esize) ;
-            slast = (p == pend) ? (EMPTY) : (SuperMap [Ls [p]]) ;
-            for ( ; p <= pend ; p++)
-            {
-                s = (p == pend) ? (EMPTY) : (SuperMap [Ls [p]]) ;
-                if (s != slast)
-                {
-                    /* row i is the start of a new supernode */
-                    ndrow1 = p - plast ;
-                    ndrow2 = pend - plast ;
-                    csize = ndrow2 * ndrow1 ;
-                    PRINT1 (("Supernode "ID" ancestor "ID" C: "ID"-by-"ID
-                        "  csize "ID"\n", d, slast, ndrow1, ndrow2, csize)) ;
-                    maxcsize = MAX (maxcsize, csize) ;
-                    plast = p ;
-                    slast = s ;
-                }
-            }
-        }
-        PRINT1 (("max csize "ID"\n", maxcsize)) ;
-    }
-
-    /* Wj no longer needed for SuperMap } */
-
-    L->maxcsize = maxcsize ;
-    L->maxesize = maxesize ;
-    L->is_super = TRUE ;
-    ASSERT (L->xtype == CHOLMOD_PATTERN && L->is_ll) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* supernodal symbolic factorization is complete */
-    /* ---------------------------------------------------------------------- */
-
-    FREE_WORKSPACE ;
-    return (TRUE) ;
-}
-
-/* ========================================================================== */
-/* === cholmod_super_symbolic =============================================== */
-/* ========================================================================== */
-
-/* Analyzes A, AA', or A(:,f)*A(:,f)' in preparation for a supernodal numeric
- * factorization.  The user need not call this directly; cholmod_analyze is
- * a "simple" wrapper for this routine.
- * 
- * This function does all the analysis for a supernodal Cholesky factorization.
- *
- * workspace: Flag (nrow), Head (nrow), Iwork (2*nrow),
- * and temporary space of size 3*nfsuper*sizeof(Int), where nfsuper <= n
- * is the number of fundamental supernodes.
- */
-
-int CHOLMOD(super_symbolic)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,	/* matrix to analyze */
-    cholmod_sparse *F,	/* F = A' or A(:,f)' */
-    Int *Parent,	/* elimination tree */
-    /* ---- in/out --- */
-    cholmod_factor *L,	/* simplicial symbolic on input,
-			 * supernodal symbolic on output */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    return (CHOLMOD(super_symbolic2) (TRUE, A, F, Parent, L, Common)) ;
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/CHOLMOD/Supernodal/gpl.txt b/src/C/SuiteSparse/CHOLMOD/Supernodal/gpl.txt
deleted file mode 100644
index 3912109..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Supernodal/gpl.txt
+++ /dev/null
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/src/C/SuiteSparse/CHOLMOD/Supernodal/t_cholmod_super_numeric.c b/src/C/SuiteSparse/CHOLMOD/Supernodal/t_cholmod_super_numeric.c
deleted file mode 100644
index 0b50242..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Supernodal/t_cholmod_super_numeric.c
+++ /dev/null
@@ -1,1087 +0,0 @@
-/* ========================================================================== */
-/* === Supernodal/t_cholmod_super_numeric =================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Supernodal Module.  Copyright (C) 2005-2012, Timothy A. Davis
- * The CHOLMOD/Supernodal 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
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_super_numeric.  All xtypes supported, except
- * that a zomplex A and F result in a complex L (there is no supernodal
- * zomplex L).
- */
-
-/* ========================================================================== */
-/* === complex arithmetic =================================================== */
-/* ========================================================================== */
-
-#include "cholmod_template.h"
-
-#undef L_ENTRY
-#undef L_CLEAR
-#undef L_ASSIGN
-#undef L_MULTADD
-#undef L_ASSEMBLE
-#undef L_ASSEMBLESUB
-
-#ifdef REAL
-
-/* -------------------------------------------------------------------------- */
-/* A, F, and L are all real */
-/* -------------------------------------------------------------------------- */
-
-#define L_ENTRY 1
-#define L_CLEAR(Lx,p)               Lx [p] = 0
-#define L_ASSIGN(Lx,q, Ax,Az,p)     Lx [q] = Ax [p]
-#define L_MULTADD(Lx,q, Ax,Az,p, f) Lx [q] += Ax [p] * f [0]
-#define L_ASSEMBLE(Lx,q,b)          Lx [q] += b [0]
-#define L_ASSEMBLESUB(Lx,q,C,p)     Lx [q] -= C [p]
-
-#else
-
-/* -------------------------------------------------------------------------- */
-/* A and F are complex or zomplex, L and C are complex */
-/* -------------------------------------------------------------------------- */
-
-#define L_ENTRY 2
-#define L_CLEAR(Lx,p)               Lx [2*(p)] = 0 ; Lx [2*(p)+1] = 0
-#define L_ASSEMBLE(Lx,q,b)          Lx [2*(q)] += b [0] ;
-#define L_ASSEMBLESUB(Lx,q,C,p)                 \
-    Lx [2*(q)  ] -= C [2*(p)  ] ;               \
-    Lx [2*(q)+1] -= C [2*(p)+1] ;
-
-#ifdef COMPLEX
-
-/* -------------------------------------------------------------------------- */
-/* A, F, L, and C are all complex */
-/* -------------------------------------------------------------------------- */
-
-#define L_ASSIGN(Lx,q, Ax,Az,p)                 \
-    Lx [2*(q)  ] = Ax [2*(p)  ] ;               \
-    Lx [2*(q)+1] = Ax [2*(p)+1]
-
-#define L_MULTADD(Lx,q, Ax,Az,p, f)                                     \
-    Lx [2*(q)  ] += Ax [2*(p)  ] * f [0] - Ax [2*(p)+1] * f [1] ;       \
-    Lx [2*(q)+1] += Ax [2*(p)+1] * f [0] + Ax [2*(p)  ] * f [1]
-
-#else
-
-/* -------------------------------------------------------------------------- */
-/* A and F are zomplex, L and C is complex */
-/* -------------------------------------------------------------------------- */
-
-#define L_ASSIGN(Lx,q, Ax,Az,p)                 \
-    Lx [2*(q)  ] = Ax [p] ;                     \
-    Lx [2*(q)+1] = Az [p] ;
-
-#define L_MULTADD(Lx,q, Ax,Az,p, f)                     \
-    Lx [2*(q)  ] += Ax [p] * f [0] - Az [p] * f [1] ;   \
-    Lx [2*(q)+1] += Az [p] * f [0] + Ax [p] * f [1]
-
-#endif
-#endif
-
-
-/* ========================================================================== */
-/* === t_cholmod_super_numeric ============================================== */
-/* ========================================================================== */
-
-/* This function returns FALSE only if integer overflow occurs in the BLAS.
- * It returns TRUE otherwise whether or not the matrix is positive definite. */
-
-static int TEMPLATE (cholmod_super_numeric)
-(
-    /* ---- input ---- */
-    cholmod_sparse *A,  /* matrix to factorize */
-    cholmod_sparse *F,  /* F = A' or A(:,f)' */
-    double beta [2],    /* beta*I is added to diagonal of matrix to factorize */
-    /* ---- in/out --- */
-    cholmod_factor *L,  /* factorization */
-    /* -- workspace -- */
-    cholmod_dense *Cwork,       /* size (L->maxcsize)-by-1 */
-    /* --------------- */
-    cholmod_common *Common
-    )
-{
-    double one [2], zero [2], tstart ;
-    double *Lx, *Ax, *Fx, *Az, *Fz, *C ;
-    Int *Super, *Head, *Ls, *Lpi, *Lpx, *Map, *SuperMap, *RelativeMap, *Next,
-        *Lpos, *Fp, *Fi, *Fnz, *Ap, *Ai, *Anz, *Iwork, *Next_save, *Lpos_save,
-        *Previous;
-    Int nsuper, n, j, i, k, s, p, pend, k1, k2, nscol, psi, psx, psend, nsrow,
-        pj, d, kd1, kd2, info, ndcol, ndrow, pdi, pdx, pdend, pdi1, pdi2, pdx1,
-        ndrow1, ndrow2, px, dancestor, sparent, dnext, nsrow2, ndrow3, pk, pf,
-        pfend, stype, Apacked, Fpacked, q, imap, repeat_supernode, nscol2, ss,
-        tail, nscol_new = 0;
-
-    /* ---------------------------------------------------------------------- */
-    /* declarations for the GPU */
-    /* ---------------------------------------------------------------------- */
-
-    /* these variables are not used if the GPU module is not installed */
-
-#ifdef GPU_BLAS
-    Int ndescendants, mapCreatedOnGpu, supernodeUsedGPU,
-        idescendant, dlarge, dsmall, skips ;
-    int iHostBuff, iDevBuff, useGPU, GPUavailable ;
-    cholmod_gpu_pointers *gpu_p, gpu_pointer_struct ;
-    gpu_p = &gpu_pointer_struct ;
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* guard against integer overflow in the BLAS */
-    /* ---------------------------------------------------------------------- */
-
-    /* If integer overflow occurs in the BLAS, Common->status is set to
-     * CHOLMOD_TOO_LARGE, and the contents of Lx are undefined. */
-    Common->blas_ok = TRUE ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nsuper = L->nsuper ;
-    n = L->n ;
-
-    C = Cwork->x ;      /* workspace of size L->maxcsize */
-
-    one [0] =  1.0 ;    /* ALPHA for *syrk, *herk, *gemm, and *trsm */
-    one [1] =  0. ;
-    zero [0] = 0. ;     /* BETA for *syrk, *herk, and *gemm */
-    zero [1] = 0. ;
-
-    /* Iwork must be of size 2n + 5*nsuper, allocated in the caller,
-     * cholmod_super_numeric.  The memory cannot be allocated here because the
-     * cholmod_super_numeric initializes SuperMap, and cholmod_allocate_work
-     * does not preserve existing workspace if the space needs to be increase
-     * in size. */
-
-    /* allocate integer workspace */
-    Iwork = Common->Iwork ;
-    SuperMap    = Iwork ;                                   /* size n (i/i/l) */
-    RelativeMap = Iwork + n ;                               /* size n (i/i/l) */
-    Next        = Iwork + 2*((size_t) n) ;                  /* size nsuper*/
-    Lpos        = Iwork + 2*((size_t) n) + nsuper ;         /* size nsuper*/
-    Next_save   = Iwork + 2*((size_t) n) + 2*((size_t) nsuper) ;/* size nsuper*/
-    Lpos_save   = Iwork + 2*((size_t) n) + 3*((size_t) nsuper) ;/* size nsuper*/
-    Previous    = Iwork + 2*((size_t) n) + 4*((size_t) nsuper) ;/* size nsuper*/
-
-    Map  = Common->Flag ;   /* size n, use Flag as workspace for Map array */
-    Head = Common->Head ;   /* size n+1, only Head [0..nsuper-1] used */
-
-    Ls = L->s ;
-    Lpi = L->pi ;
-    Lpx = L->px ;
-
-    Super = L->super ;
-
-    Lx = L->x ;
-
-#ifdef GPU_BLAS
-    /* local copy of useGPU */
-    if ( (Common->useGPU == 1) && L->useGPU)
-    {
-        /* Initialize the GPU.  If not found, don't use it. */
-        useGPU = TEMPLATE2 (CHOLMOD (gpu_init))
-            (C, L, Common, nsuper, n, Lpi[nsuper]-Lpi[0], gpu_p) ;
-    }
-    else
-    {
-        useGPU = 0;
-    }
-    /* fprintf (stderr, "local useGPU %d\n", useGPU) ; */
-#endif
-
-#ifndef NTIMER
-    /* clear GPU / CPU statistics */
-    Common->CHOLMOD_CPU_GEMM_CALLS  = 0 ;
-    Common->CHOLMOD_CPU_SYRK_CALLS  = 0 ;
-    Common->CHOLMOD_CPU_TRSM_CALLS  = 0 ;
-    Common->CHOLMOD_CPU_POTRF_CALLS = 0 ;
-    Common->CHOLMOD_GPU_GEMM_CALLS  = 0 ;
-    Common->CHOLMOD_GPU_SYRK_CALLS  = 0 ;
-    Common->CHOLMOD_GPU_TRSM_CALLS  = 0 ;
-    Common->CHOLMOD_GPU_POTRF_CALLS = 0 ;
-    Common->CHOLMOD_CPU_GEMM_TIME   = 0 ;
-    Common->CHOLMOD_CPU_SYRK_TIME   = 0 ;
-    Common->CHOLMOD_CPU_TRSM_TIME   = 0 ;
-    Common->CHOLMOD_CPU_POTRF_TIME  = 0 ;
-    Common->CHOLMOD_GPU_GEMM_TIME   = 0 ;
-    Common->CHOLMOD_GPU_SYRK_TIME   = 0 ;
-    Common->CHOLMOD_GPU_TRSM_TIME   = 0 ;
-    Common->CHOLMOD_GPU_POTRF_TIME  = 0 ;
-    Common->CHOLMOD_ASSEMBLE_TIME   = 0 ;
-    Common->CHOLMOD_ASSEMBLE_TIME2  = 0 ;
-#endif
-
-    stype = A->stype ;
-
-    if (stype != 0)
-    {
-        /* F not accessed */
-        Fp = NULL ;
-        Fi = NULL ;
-        Fx = NULL ;
-        Fz = NULL ;
-        Fnz = NULL ;
-        Fpacked = TRUE ;
-    }
-    else
-    {
-        Fp = F->p ;
-        Fi = F->i ;
-        Fx = F->x ;
-        Fz = F->z ;
-        Fnz = F->nz ;
-        Fpacked = F->packed ;
-    }
-
-    Ap = A->p ;
-    Ai = A->i ;
-    Ax = A->x ;
-    Az = A->z ;
-    Anz = A->nz ;
-    Apacked = A->packed ;
-
-    /* clear the Map so that changes in the pattern of A can be detected */
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS) \
-    if ( n > 128 ) schedule (static)
-
-    for (i = 0 ; i < n ; i++)
-    {
-        Map [i] = EMPTY ;
-    }
-
-    /* If the matrix is not positive definite, the supernode s containing the
-     * first zero or negative diagonal entry of L is repeated (but factorized
-     * only up to just before the problematic diagonal entry). The purpose is
-     * to provide MATLAB with [R,p]=chol(A); columns 1 to p-1 of L=R' are
-     * required, where L(p,p) is the problematic diagonal entry.  The
-     * repeat_supernode flag tells us whether this is the repeated supernode.
-     * Once supernode s is repeated, the factorization is terminated. */
-    repeat_supernode = FALSE ;
-
-#ifdef GPU_BLAS
-    if ( useGPU )
-    {
-        /* Case of GPU, zero all supernodes at one time for better performance*/
-        TEMPLATE2 (CHOLMOD (gpu_clear_memory))(Lx, L->xsize,
-            CHOLMOD_OMP_NUM_THREADS);
-    }
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* supernodal numerical factorization */
-    /* ---------------------------------------------------------------------- */
-
-    for (s = 0 ; s < nsuper ; s++)
-    {
-
-        /* ------------------------------------------------------------------ */
-        /* get the size of supernode s */
-        /* ------------------------------------------------------------------ */
-
-        k1 = Super [s] ;            /* s contains columns k1 to k2-1 of L */
-        k2 = Super [s+1] ;
-        nscol = k2 - k1 ;           /* # of columns in all of s */
-        psi = Lpi [s] ;             /* pointer to first row of s in Ls */
-        psx = Lpx [s] ;             /* pointer to first row of s in Lx */
-        psend = Lpi [s+1] ;         /* pointer just past last row of s in Ls */
-        nsrow = psend - psi ;       /* # of rows in all of s */
-
-        PRINT1 (("====================================================\n"
-                 "S "ID" k1 "ID" k2 "ID" nsrow "ID" nscol "ID" psi "ID" psend "
-                 ""ID" psx "ID"\n", s, k1, k2, nsrow, nscol, psi, psend, psx)) ;
-        /* ------------------------------------------------------------------ */
-        /* zero the supernode s */
-        /* ------------------------------------------------------------------ */
-
-        ASSERT ((size_t) (psx + nsrow*nscol) <= L->xsize) ;
-
-        pend = psx + nsrow * nscol ;        /* s is nsrow-by-nscol */
-
-#ifdef GPU_BLAS
-        if ( !useGPU )
-#endif
-        {
-            /* Case of no GPU, zero individual supernodes */
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    schedule (static) if ( pend - psx > 1024 )
-
-            for (p = psx ; p < pend ; p++) {
-                L_CLEAR (Lx,p);
-            }
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* construct the scattered Map for supernode s */
-        /* ------------------------------------------------------------------ */
-
-        /* If row i is the kth row in s, then Map [i] = k.  Similarly, if
-         * column j is the kth column in s, then  Map [j] = k. */
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    if ( nsrow > 128 )
-
-        for (k = 0 ; k < nsrow ; k++)
-        {
-            PRINT1 (("  "ID" map "ID"\n", Ls [psi+k], k)) ;
-            Map [Ls [psi + k]] = k ;
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* when using GPU, reorder supernodes by levels.*/
-        /* (all supernodes in a level are independent) */
-        /* ------------------------------------------------------------------ */
-
-#ifdef GPU_BLAS
-        if ( useGPU )
-        {
-            TEMPLATE2 (CHOLMOD (gpu_reorder_descendants))
-                ( Common, Super, &s, Lpi, Lpos, Head, Next, Previous,
-                  &ndescendants, &tail, &mapCreatedOnGpu, gpu_p ) ;
-        }
-#endif
-
-        /* ------------------------------------------------------------------ */
-        /* copy matrix into supernode s (lower triangular part only) */
-        /* ------------------------------------------------------------------ */
-
-        pk = psx ;
-
-#pragma omp parallel for private ( p, pend, pfend, pf, i, j, imap, q )  \
-    num_threads(CHOLMOD_OMP_NUM_THREADS) if ( k2-k1 > 64 )
-
-        for (k = k1 ; k < k2 ; k++)
-        {
-            if (stype != 0)
-            {
-                /* copy the kth column of A into the supernode */
-                p = Ap [k] ;
-                pend = (Apacked) ? (Ap [k+1]) : (p + Anz [k]) ;
-                for ( ; p < pend ; p++)
-                {
-                    /* row i of L is located in row Map [i] of s */
-                    i = Ai [p] ;
-                    if (i >= k)
-                    {
-                        /* This test is here simply to avoid a segfault.  If
-                         * the test is false, the numeric factorization of A
-                         * is undefined.  It does not detect all invalid
-                         * entries, only some of them (when debugging is
-                         * enabled, and Map is cleared after each step, then
-                         * all entries not in the pattern of L are detected). */
-                        imap = Map [i] ;
-                        if (imap >= 0 && imap < nsrow)
-                        {
-                            /* Lx [Map [i] + pk] = Ax [p] ; */
-                            L_ASSIGN (Lx,(imap+(psx+(k-k1)*nsrow)), Ax,Az,p) ;
-                        }
-                    }
-                }
-            }
-            else
-            {
-                double fjk[2];
-                /* copy the kth column of A*F into the supernode */
-                pf = Fp [k] ;
-                pfend = (Fpacked) ? (Fp [k+1]) : (p + Fnz [k]) ;
-                for ( ; pf < pfend ; pf++)
-                {
-                    j = Fi [pf] ;
-
-                    /* fjk = Fx [pf] ; */
-                    L_ASSIGN (fjk,0, Fx,Fz,pf) ;
-
-                    p = Ap [j] ;
-                    pend = (Apacked) ? (Ap [j+1]) : (p + Anz [j]) ;
-                    for ( ; p < pend ; p++)
-                    {
-                        i = Ai [p] ;
-                        if (i >= k)
-                        {
-                            /* See the discussion of imap above. */
-                            imap = Map [i] ;
-                            if (imap >= 0 && imap < nsrow)
-                            {
-                                /* Lx [Map [i] + pk] += Ax [p] * fjk ; */
-                                L_MULTADD (Lx,(imap+(psx+(k-k1)*nsrow)),
-                                           Ax,Az,p, fjk) ;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        /* add beta to the diagonal of the supernode, if nonzero */
-        if (beta [0] != 0.0)
-        {
-            /* note that only the real part of beta is used */
-            pk = psx ;
-            for (k = k1 ; k < k2 ; k++)
-            {
-                /* Lx [pk] += beta [0] ; */
-                L_ASSEMBLE (Lx,pk, beta) ;
-                pk += nsrow + 1 ;       /* advance to the next diagonal entry */
-            }
-        }
-
-        PRINT1 (("Supernode with just A: repeat: "ID"\n", repeat_supernode)) ;
-        DEBUG (CHOLMOD(dump_super) (s, Super, Lpi, Ls, Lpx, Lx, L_ENTRY,
-                                    Common)) ;
-        PRINT1 (("\n\n")) ;
-
-        /* ------------------------------------------------------------------ */
-        /* save/restore the list of supernodes */
-        /* ------------------------------------------------------------------ */
-
-        if (!repeat_supernode)
-        {
-            /* Save the list of pending descendants in case s is not positive
-             * definite.  Also save Lpos for each descendant d, so that we can
-             * find which part of d is used to update s. */
-            for (d = Head [s] ; d != EMPTY ; d = Next [d])
-            {
-                Lpos_save [d] = Lpos [d] ;
-                Next_save [d] = Next [d] ;
-            }
-        }
-        else
-        {
-            for (d = Head [s] ; d != EMPTY ; d = Next [d])
-            {
-                Lpos [d] = Lpos_save [d] ;
-                Next [d] = Next_save [d] ;
-            }
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* update supernode s with each pending descendant d */
-        /* ------------------------------------------------------------------ */
-
-#ifndef NDEBUG
-        for (d = Head [s] ; d != EMPTY ; d = Next [d])
-        {
-            PRINT1 (("\nWill update "ID" with Child: "ID"\n", s, d)) ;
-            DEBUG (CHOLMOD(dump_super) (d, Super, Lpi, Ls, Lpx, Lx, L_ENTRY,
-                                        Common)) ;
-        }
-        PRINT1 (("\nNow factorizing supernode "ID":\n", s)) ;
-#endif
-
-#ifdef GPU_BLAS
-        /* initialize the buffer counter */
-        if ( useGPU ) {
-            Common->ibuffer = 0;
-            supernodeUsedGPU = 0;
-            idescendant = 0;
-            d = Head[s];
-            dnext = d;
-            dlarge = Next[d];
-            dsmall = tail;
-            GPUavailable = 1;
-            skips = 0;
-        }
-        else
-        {
-            dnext = Head[s];
-        }
-#else
-        /* GPU module not installed */
-        dnext = Head[s];
-#endif
-
-        while
-
-#ifdef GPU_BLAS
-            ( (!useGPU && (dnext != EMPTY))
-               || (useGPU && (idescendant < ndescendants)))
-#else
-
-            ( dnext != EMPTY )
-#endif
-        {
-
-#ifdef GPU_BLAS
-
-            if ( useGPU ) {
-
-                /* Conditionally select the next descendant supernode to
-                 *  assemble.
-                 *   + first, select the largest descendant
-                 *   + subsequently, if gpu host buffers are available, select
-                 *     the largest remaining descendant for assembly on the GPU
-                 *   + otherwise select the smallest remaining descendant for
-                 *     assembly on the CPU
-                 *
-                 * The objective is to keep the GPU busy assembling the largest
-                 * descendants, and simultaneously keep the CPU busy assembling
-                 * the smallest descendants.
-                 *
-                 * As this is called for every descendent supernode, moving
-                 * this code to t_cholmod_gpu incurs substantial overhead -
-                 * ~20 GF/s on audikw_1 - so it is being left here.
-                 */
-
-                iHostBuff =
-                    (Common->ibuffer) % CHOLMOD_HOST_SUPERNODE_BUFFERS;
-                cudaError_t cuErr;
-
-                if ( idescendant > 0 )  {
-                    if ( GPUavailable == -1 || skips > 0) {
-                        d = dsmall;
-                        dsmall = Previous[dsmall];
-                        skips--;
-                    }
-                    else {
-                        cuErr = cudaEventQuery
-                            ( Common->updateCBuffersFree[iHostBuff] );
-                        if ( cuErr == cudaSuccess ) {
-                            /* buffers are available, so assemble a large
-                             * descendant (anticipating that this will be
-                             * assembled on the GPU) */
-                            d = dlarge;
-                            dlarge = Next[dlarge];
-                            GPUavailable = 1;
-                            skips = 0;
-                        }
-                        else {
-                            /* buffers are not available, so the GPU is busy,
-                             * so assemble a small descendant (anticipating
-                             * that it will be assembled on the host) */
-                            d = dsmall;
-                            dsmall = Previous[dsmall];
-                            GPUavailable = 0;
-
-                            /* if the GPUs are busy, then do this many
-                             * supernodes on the CPU before querying GPUs
-                             * again. */
-                            skips = CHOLMOD_GPU_SKIP;
-                        }
-                    }
-                }
-
-                idescendant++;
-
-            }
-            else
-            {
-                d = dnext;
-            }
-#else
-            /* GPU module not installed at compile time */
-            d = dnext ;
-#endif
-            /* -------------------------------------------------------------- */
-            /* get the size of supernode d */
-            /* -------------------------------------------------------------- */
-
-            kd1 = Super [d] ;       /* d contains cols kd1 to kd2-1 of L */
-            kd2 = Super [d+1] ;
-            ndcol = kd2 - kd1 ;     /* # of columns in all of d */
-            pdi = Lpi [d] ;         /* pointer to first row of d in Ls */
-            pdx = Lpx [d] ;         /* pointer to first row of d in Lx */
-            pdend = Lpi [d+1] ;     /* pointer just past last row of d in Ls */
-            ndrow = pdend - pdi ;   /* # rows in all of d */
-
-            PRINT1 (("Child: ")) ;
-            DEBUG (CHOLMOD(dump_super) (d, Super, Lpi, Ls, Lpx, Lx, L_ENTRY,
-                                        Common)) ;
-
-            /* -------------------------------------------------------------- */
-            /* find the range of rows of d that affect rows k1 to k2-1 of s */
-            /* -------------------------------------------------------------- */
-
-            p = Lpos [d] ;          /* offset of 1st row of d affecting s */
-            pdi1 = pdi + p ;        /* ptr to 1st row of d affecting s in Ls */
-            pdx1 = pdx + p ;        /* ptr to 1st row of d affecting s in Lx */
-
-            /* there must be at least one row remaining in d to update s */
-            ASSERT (pdi1 < pdend) ;
-            PRINT1 (("Lpos[d] "ID" pdi1 "ID" Ls[pdi1] "ID"\n",
-                     Lpos[d], pdi1, Ls [pdi1])) ;
-            ASSERT (Ls [pdi1] >= k1 && Ls [pdi1] < k2) ;
-
-            for (pdi2 = pdi1 ; pdi2 < pdend && Ls [pdi2] < k2 ; pdi2++) ;
-            ndrow1 = pdi2 - pdi1 ;      /* # rows in first part of d */
-            ndrow2 = pdend - pdi1 ;     /* # rows in remaining d */
-
-            /* rows Ls [pdi1 ... pdi2-1] are in the range k1 to k2-1.  Since d
-             * affects s, this set cannot be empty. */
-            ASSERT (pdi1 < pdi2 && pdi2 <= pdend) ;
-            PRINT1 (("ndrow1 "ID" ndrow2 "ID"\n", ndrow1, ndrow2)) ;
-            DEBUG (for (p = pdi1 ; p < pdi2 ; p++)
-                       PRINT1 (("Ls["ID"] "ID"\n", p, Ls[p]))) ;
-
-            /* -------------------------------------------------------------- */
-            /* construct the update matrix C for this supernode d */
-            /* -------------------------------------------------------------- */
-
-            /* C = L (k1:n-1, kd1:kd2-1) * L (k1:k2-1, kd1:kd2-1)', except
-             * that k1:n-1 refers to all of the rows in L, but many of the
-             * rows are all zero.  Supernode d holds columns kd1 to kd2-1 of L.
-             * Nonzero rows in the range k1:k2-1 are in the list
-             * Ls [pdi1 ... pdi2-1], of size ndrow1.  Nonzero rows in the range
-             * k2:n-1 are in the list Ls [pdi2 ... pdend], of size ndrow2.  Let
-             * L1 = L (Ls [pdi1 ... pdi2-1], kd1:kd2-1), and let
-             * L2 = L (Ls [pdi2 ... pdend],  kd1:kd2-1).  C is ndrow2-by-ndrow1.
-             * Let C1 be the first ndrow1 rows of C and let C2 be the last
-             * ndrow2-ndrow1 rows of C.  Only the lower triangular part of C1
-             * needs to be computed since C1 is symmetric.
-             */
-
-            /* maxcsize is the largest size of C for all pairs (d,s) */
-            ASSERT (ndrow2 * ndrow1 <= ((Int) L->maxcsize)) ;
-
-            /* compute leading ndrow1-by-ndrow1 lower triangular block of C,
-             * C1 = L1*L1' */
-
-            ndrow3 = ndrow2 - ndrow1 ;  /* number of rows of C2 */
-            ASSERT (ndrow3 >= 0) ;
-
-
-#ifdef GPU_BLAS
-            if ( useGPU ) {
-                /* set up GPU to assemble new supernode */
-                if ( GPUavailable == 1) {
-                    if ( ndrow2 * L_ENTRY >= CHOLMOD_ND_ROW_LIMIT &&
-                         ndcol * L_ENTRY >= CHOLMOD_ND_COL_LIMIT ) {
-                        if ( ! mapCreatedOnGpu ) {
-                            TEMPLATE2 ( CHOLMOD (gpu_initialize_supernode))
-                                ( Common, nscol, nsrow, psi, gpu_p );
-                            mapCreatedOnGpu = 1;
-                        }
-                    }
-                    else {
-                        /* we've reached the limit of GPU-eligible descendants
-                         * flag to stop stop performing cudaEventQueries */
-                        GPUavailable = -1;
-                    }
-                }
-            }
-#endif
-
-#ifdef GPU_BLAS
-            if ( !useGPU
-                || GPUavailable!=1
-                || !TEMPLATE2 (CHOLMOD (gpu_updateC)) (ndrow1, ndrow2, ndrow,
-                        ndcol, nsrow, pdx1, pdi1, Lx, C, Common, gpu_p))
-#endif
-            {
-                /* GPU not installed, or not used */
-#ifndef NTIMER
-
-                Common->CHOLMOD_CPU_SYRK_CALLS++ ;
-                tstart = SuiteSparse_time () ;
-#endif
-#ifdef REAL
-                BLAS_dsyrk ("L", "N",
-                    ndrow1, ndcol,              /* N, K: L1 is ndrow1-by-ndcol*/
-                    one,                        /* ALPHA:  1 */
-                    Lx + L_ENTRY*pdx1, ndrow,   /* A, LDA: L1, ndrow */
-                    zero,                       /* BETA:   0 */
-                    C, ndrow2) ;                /* C, LDC: C1 */
-#else
-                BLAS_zherk ("L", "N",
-                    ndrow1, ndcol,              /* N, K: L1 is ndrow1-by-ndcol*/
-                    one,                        /* ALPHA:  1 */
-                    Lx + L_ENTRY*pdx1, ndrow,   /* A, LDA: L1, ndrow */
-                    zero,                       /* BETA:   0 */
-                    C, ndrow2) ;                /* C, LDC: C1 */
-#endif
-#ifndef NTIMER
-                Common->CHOLMOD_CPU_SYRK_TIME += SuiteSparse_time () - tstart ;
-#endif
-                /* compute remaining (ndrow2-ndrow1)-by-ndrow1 block of C,
-                 * C2 = L2*L1' */
-                if (ndrow3 > 0)
-                {
-#ifndef NTIMER
-                    Common->CHOLMOD_CPU_GEMM_CALLS++ ;
-                    tstart = SuiteSparse_time () ;
-#endif
-#ifdef REAL
-                    BLAS_dgemm ("N", "C",
-                        ndrow3, ndrow1, ndcol,          /* M, N, K */
-                        one,                            /* ALPHA:  1 */
-                        Lx + L_ENTRY*(pdx1 + ndrow1),   /* A, LDA: L2 */
-                        ndrow,                          /* ndrow */
-                        Lx + L_ENTRY*pdx1,              /* B, LDB: L1 */
-                        ndrow,                          /* ndrow */
-                        zero,                           /* BETA:   0 */
-                        C + L_ENTRY*ndrow1,             /* C, LDC: C2 */
-                        ndrow2) ;
-#else
-                    BLAS_zgemm ("N", "C",
-                        ndrow3, ndrow1, ndcol,          /* M, N, K */
-                        one,                            /* ALPHA:  1 */
-                        Lx + L_ENTRY*(pdx1 + ndrow1),   /* A, LDA: L2 */
-                        ndrow,                          /* ndrow */
-                        Lx + L_ENTRY*pdx1,              /* B, LDB: L1, ndrow */
-                        ndrow,
-                        zero,                           /* BETA:   0 */
-                        C + L_ENTRY*ndrow1,             /* C, LDC: C2 */
-                        ndrow2) ;
-#endif
-#ifndef NTIMER
-                    Common->CHOLMOD_CPU_GEMM_TIME +=
-                        SuiteSparse_time () - tstart ;
-#endif
-                }
-
-                /* ---------------------------------------------------------- */
-                /* construct relative map to assemble d into s */
-                /* ---------------------------------------------------------- */
-
-                DEBUG (CHOLMOD(dump_real) ("C", C, ndrow2, ndrow1, TRUE,
-                                           L_ENTRY, Common)) ;
-
-#pragma omp parallel for num_threads(CHOLMOD_OMP_NUM_THREADS)   \
-    if ( ndrow2 > 64 )
-
-                for (i = 0 ; i < ndrow2 ; i++)
-                {
-                    RelativeMap [i] = Map [Ls [pdi1 + i]] ;
-                    ASSERT (RelativeMap [i] >= 0 && RelativeMap [i] < nsrow) ;
-                }
-
-                /* ---------------------------------------------------------- */
-                /* assemble C into supernode s using the relative map */
-                /* ---------------------------------------------------------- */
-
-#pragma omp parallel for private ( j, i, px, q )                \
-    num_threads(CHOLMOD_OMP_NUM_THREADS) if (ndrow1 > 64 )
-
-                for (j = 0 ; j < ndrow1 ; j++)              /* cols k1:k2-1 */
-                {
-                    ASSERT (RelativeMap [j] == Map [Ls [pdi1 + j]]) ;
-                    ASSERT (RelativeMap [j] >= 0 && RelativeMap [j] < nscol) ;
-                    px = psx + RelativeMap [j] * nsrow ;
-                    for (i = j ; i < ndrow2 ; i++)          /* rows k1:n-1 */
-                    {
-                        ASSERT (RelativeMap [i] == Map [Ls [pdi1 + i]]) ;
-                        ASSERT (RelativeMap [i] >= j && RelativeMap[i] < nsrow);
-                        /* Lx [px + RelativeMap [i]] -= C [i + pj] ; */
-                        q = px + RelativeMap [i] ;
-                        L_ASSEMBLESUB (Lx,q, C, i+ndrow2*j) ;
-                    }
-                }
-
-            }
-#ifdef GPU_BLAS
-            else
-            {
-                supernodeUsedGPU = 1;   /* GPU was used for this supernode*/
-                Common->ibuffer++;      /* gpu_updateC is asynchronous, so use
-                                         * the next host buffer for the next
-                                         * supernode */
-                Common->ibuffer = Common->ibuffer%
-                    (CHOLMOD_HOST_SUPERNODE_BUFFERS*CHOLMOD_DEVICE_STREAMS);
-            }
-#endif
-
-            /* -------------------------------------------------------------- */
-            /* prepare this supernode d for its next ancestor */
-            /* -------------------------------------------------------------- */
-
-            dnext = Next [d] ;
-
-            if (!repeat_supernode)
-            {
-                /* If node s is being repeated, Head [dancestor] has already
-                 * been cleared (set to EMPTY).  It must remain EMPTY.  The
-                 * dancestor will not be factorized since the factorization
-                 * terminates at node s. */
-                Lpos [d] = pdi2 - pdi ;
-                if (Lpos [d] < ndrow)
-                {
-                    dancestor = SuperMap [Ls [pdi2]] ;
-                    ASSERT (dancestor > s && dancestor < nsuper) ;
-                    /* place d in the link list of its next ancestor */
-                    Next [d] = Head [dancestor] ;
-                    Head [dancestor] = d ;
-                }
-            }
-
-        }  /* end of descendant supernode loop */
-
-#ifdef GPU_BLAS
-        if ( useGPU ) {
-            iHostBuff = (Common->ibuffer)%CHOLMOD_HOST_SUPERNODE_BUFFERS;
-            iDevBuff = (Common->ibuffer)%CHOLMOD_DEVICE_STREAMS;
-
-            /* combine updates assembled on the GPU with updates
-             * assembled on the CPU */
-            TEMPLATE2 ( CHOLMOD (gpu_final_assembly ))
-                ( Common, Lx, psx, nscol, nsrow, supernodeUsedGPU,
-                  &iHostBuff, &iDevBuff, gpu_p );
-        }
-#endif
-
-        PRINT1 (("\nSupernode with contributions A: repeat: "ID"\n",
-                 repeat_supernode)) ;
-        DEBUG (CHOLMOD(dump_super) (s, Super, Lpi, Ls, Lpx, Lx, L_ENTRY,
-                                    Common)) ;
-        PRINT1 (("\n\n")) ;
-
-        /* ------------------------------------------------------------------ */
-        /* factorize diagonal block of supernode s in LL' */
-        /* ------------------------------------------------------------------ */
-
-        /* The current supernode s is ready to factorize.  It has been updated
-         * by all descendant supernodes.  Let S = the current supernode, which
-         * holds rows k1:n-1 and columns k1:k2-1 of the updated matrix.   It
-         * splits into two parts:  the square diagonal block S1, and the
-         * rectangular part S2.  Here, S1 is factorized into L1*L1' and
-         * overwritten by L1.
-         *
-         * If supernode s is being repeated, only factorize it up to but not
-         * including the column containing the problematic entry.
-         */
-
-        nscol2 = (repeat_supernode) ? (nscol_new) : (nscol) ;
-
-#ifdef GPU_BLAS
-        if ( !useGPU
-            || !supernodeUsedGPU
-            || !TEMPLATE2 (CHOLMOD (gpu_lower_potrf))(nscol2, nsrow, psx, Lx,
-                                                   &info, Common, gpu_p))
-#endif
-        {
-            /* Note that the GPU will not be used for the triangular solve */
-#ifdef GPU_BLAS
-            supernodeUsedGPU = 0;
-#endif
-#ifndef NTIMER
-            Common->CHOLMOD_CPU_POTRF_CALLS++ ;
-            tstart = SuiteSparse_time () ;
-#endif
-#ifdef REAL
-            LAPACK_dpotrf ("L",
-                nscol2,                     /* N: nscol2 */
-                Lx + L_ENTRY*psx, nsrow,    /* A, LDA: S1, nsrow */
-                info) ;                     /* INFO */
-#else
-            LAPACK_zpotrf ("L",
-                nscol2,                     /* N: nscol2 */
-                Lx + L_ENTRY*psx, nsrow,    /* A, LDA: S1, nsrow */
-                info) ;                     /* INFO */
-#endif
-#ifndef NTIMER
-            Common->CHOLMOD_CPU_POTRF_TIME += SuiteSparse_time ()- tstart ;
-#endif
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* check if the matrix is not positive definite */
-        /* ------------------------------------------------------------------ */
-
-        if (repeat_supernode)
-        {
-            /* the leading part has been refactorized; it must have succeeded */
-            info = 0 ;
-
-            /* zero out the rest of this supernode */
-            p = psx + nsrow * nscol_new ;
-            pend = psx + nsrow * nscol ;            /* s is nsrow-by-nscol */
-            for ( ; p < pend ; p++)
-            {
-                /* Lx [p] = 0 ; */
-                L_CLEAR (Lx,p) ;
-            }
-        }
-
-        /* info is set to one in LAPACK_*potrf if blas_ok is FALSE.  It is
-         * set to zero in dpotrf/zpotrf if the factorization was successful. */
-        if (CHECK_BLAS_INT && !Common->blas_ok)
-        {
-            ERROR (CHOLMOD_TOO_LARGE, "problem too large for the BLAS") ;
-        }
-
-        if (info != 0)
-        {
-            /* Matrix is not positive definite.  dpotrf/zpotrf do NOT report an
-             * error if the diagonal of L has NaN's, only if it has a zero. */
-            if (Common->status == CHOLMOD_OK)
-            {
-                ERROR (CHOLMOD_NOT_POSDEF, "matrix not positive definite") ;
-            }
-
-            /* L->minor is the column of L that contains a zero or negative
-             * diagonal term. */
-            L->minor = k1 + info - 1 ;
-
-            /* clear the link lists of all subsequent supernodes */
-            for (ss = s+1 ; ss < nsuper ; ss++)
-            {
-                Head [ss] = EMPTY ;
-            }
-
-            /* zero this supernode, and all remaining supernodes */
-            pend = L->xsize ;
-            for (p = psx ; p < pend ; p++)
-            {
-                /* Lx [p] = 0. ; */
-                L_CLEAR (Lx,p) ;
-            }
-
-            /* If L is indefinite, it still contains useful information.
-             * Supernodes 0 to s-1 are valid, similar to MATLAB [R,p]=chol(A),
-             * where the 1-based p is identical to the 0-based L->minor.  Since
-             * L->minor is in the current supernode s, it and any columns to the
-             * left of it in supernode s are also all zero.  This differs from
-             * [R,p]=chol(A), which contains nonzero rows 1 to p-1.  Fix this
-             * by setting repeat_supernode to TRUE, and repeating supernode s.
-             *
-             * If Common->quick_return_if_not_posdef is true, then the entire
-             * supernode s is not factorized; it is left as all zero.
-             */
-
-            if (info == 1 || Common->quick_return_if_not_posdef)
-            {
-                /* If the first column of supernode s contains a zero or
-                 * negative diagonal entry, then it is already properly set to
-                 * zero.  Also, info will be 1 if integer overflow occured in
-                 * the BLAS. */
-                Head [s] = EMPTY ;
-#ifdef GPU_BLAS
-                if ( useGPU ) {
-                    CHOLMOD (gpu_end) (Common) ;
-                }
-#endif
-                return (Common->status >= CHOLMOD_OK) ;
-            }
-            else
-            {
-                /* Repeat supernode s, but only factorize it up to but not
-                 * including the column containing the problematic diagonal
-                 * entry. */
-                repeat_supernode = TRUE ;
-                s-- ;
-                nscol_new = info - 1 ;
-                continue ;
-            }
-        }
-
-        /* ------------------------------------------------------------------ */
-        /* compute the subdiagonal block and prepare supernode for its parent */
-        /* ------------------------------------------------------------------ */
-
-        nsrow2 = nsrow - nscol2 ;
-        if (nsrow2 > 0)
-        {
-            /* The current supernode is columns k1 to k2-1 of L.  Let L1 be the
-             * diagonal block (factorized by dpotrf/zpotrf above; rows/cols
-             * k1:k2-1), and L2 be rows k2:n-1 and columns k1:k2-1 of L.  The
-             * triangular system to solve is L2*L1' = S2, where S2 is
-             * overwritten with L2.  More precisely, L2 = S2 / L1' in MATLAB
-             * notation.
-             */
-
-#ifdef GPU_BLAS
-            if ( !useGPU
-                || !supernodeUsedGPU
-                || !TEMPLATE2 (CHOLMOD(gpu_triangular_solve))
-                        (nsrow2, nscol2, nsrow, psx, Lx, Common, gpu_p))
-#endif
-            {
-#ifndef NTIMER
-                Common->CHOLMOD_CPU_TRSM_CALLS++ ;
-                tstart = SuiteSparse_time () ;
-#endif
-#ifdef REAL
-                BLAS_dtrsm ("R", "L", "C", "N",
-                    nsrow2, nscol2,                 /* M, N */
-                    one,                            /* ALPHA: 1 */
-                    Lx + L_ENTRY*psx, nsrow,        /* A, LDA: L1, nsrow */
-                    Lx + L_ENTRY*(psx + nscol2),    /* B, LDB, L2, nsrow */
-                    nsrow) ;
-#else
-                BLAS_ztrsm ("R", "L", "C", "N",
-                    nsrow2, nscol2,                 /* M, N */
-                    one,                            /* ALPHA: 1 */
-                    Lx + L_ENTRY*psx, nsrow,        /* A, LDA: L1, nsrow */
-                    Lx + L_ENTRY*(psx + nscol2),    /* B, LDB, L2, nsrow */
-                    nsrow) ;
-#endif
-#ifndef NTIMER
-                Common->CHOLMOD_CPU_TRSM_TIME += SuiteSparse_time () - tstart ;
-#endif
-            }
-
-            if (CHECK_BLAS_INT && !Common->blas_ok)
-            {
-                ERROR (CHOLMOD_TOO_LARGE, "problem too large for the BLAS") ;
-            }
-
-            if (!repeat_supernode)
-            {
-                /* Lpos [s] is offset of first row of s affecting its parent */
-                Lpos [s] = nscol ;
-                sparent = SuperMap [Ls [psi + nscol]] ;
-                ASSERT (sparent != EMPTY) ;
-                ASSERT (Ls [psi + nscol] >= Super [sparent]) ;
-                ASSERT (Ls [psi + nscol] <  Super [sparent+1]) ;
-                ASSERT (SuperMap [Ls [psi + nscol]] == sparent) ;
-                ASSERT (sparent > s && sparent < nsuper) ;
-                /* place s in link list of its parent */
-                Next [s] = Head [sparent] ;
-                Head [sparent] = s ;
-            }
-        }
-        else
-        {
-#ifdef GPU_BLAS
-            TEMPLATE2 ( CHOLMOD (gpu_copy_supernode) )
-                ( Common, Lx, psx, nscol, nscol2, nsrow,
-                  supernodeUsedGPU, iHostBuff, gpu_p);
-#endif
-        }
-
-        Head [s] = EMPTY ;  /* link list for supernode s no longer needed */
-
-        /* clear the Map (debugging only, to detect changes in pattern of A) */
-        DEBUG (for (k = 0 ; k < nsrow ; k++) Map [Ls [psi + k]] = EMPTY) ;
-        DEBUG (CHOLMOD(dump_super) (s, Super, Lpi, Ls, Lpx, Lx, L_ENTRY,
-                                    Common)) ;
-
-        if (repeat_supernode)
-        {
-            /* matrix is not positive definite; finished clean-up for supernode
-             * containing negative diagonal */
-
-#ifdef GPU_BLAS
-            if ( useGPU )
-            {
-                CHOLMOD (gpu_end) (Common) ;
-            }
-#endif
-            return (Common->status >= CHOLMOD_OK) ;
-        }
-    }
-
-    /* success; matrix is positive definite */
-    L->minor = n ;
-
-#ifdef GPU_BLAS
-    if ( useGPU )
-    {
-        CHOLMOD (gpu_end) (Common) ;
-    }
-#endif
-
-    return (Common->status >= CHOLMOD_OK) ;
-
-}
-
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/CHOLMOD/Supernodal/t_cholmod_super_solve.c b/src/C/SuiteSparse/CHOLMOD/Supernodal/t_cholmod_super_solve.c
deleted file mode 100644
index 3706d89..0000000
--- a/src/C/SuiteSparse/CHOLMOD/Supernodal/t_cholmod_super_solve.c
+++ /dev/null
@@ -1,419 +0,0 @@
-/* ========================================================================== */
-/* === Supernodal/t_cholmod_super_solve ===================================== */
-/* ========================================================================== */
-
-/* -----------------------------------------------------------------------------
- * CHOLMOD/Supernodal Module.  Copyright (C) 2005-2006, Timothy A. Davis
- * The CHOLMOD/Supernodal 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
- * -------------------------------------------------------------------------- */
-
-/* Template routine for cholmod_super_solve.  Supports real or complex L. */
-
-#include "cholmod_template.h"
-
-static void TEMPLATE (cholmod_super_lsolve)
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to use for the forward solve */
-    /* ---- output ---- */
-    cholmod_dense *X,	/* b on input, solution to Lx=b on output */
-    /* ---- workspace ---- */
-    cholmod_dense *E,	/* workspace of size nrhs*(L->maxesize) */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Lx, *Xx, *Ex ;
-    double minus_one [2], one [2] ;
-    Int *Lpi, *Lpx, *Ls, *Super ;
-    Int nsuper, k1, k2, psi, psend, psx, nsrow, nscol, ii, s,
-	nsrow2, n, ps2, j, i, d, nrhs ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nrhs = X->ncol ;
-    Ex = E->x ;
-    Xx = X->x ;
-    n = L->n ;
-    d = X->d ;
-
-    nsuper = L->nsuper ;
-    Lpi = L->pi ;
-    Lpx = L->px ;
-    Ls = L->s ;
-    Super = L->super ;
-    Lx = L->x ;
-    minus_one [0] = -1.0 ;
-    minus_one [1] = 0 ;
-    one [0] = 1.0 ;
-    one [1] = 0 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* solve Lx=b */
-    /* ---------------------------------------------------------------------- */
-
-    if (nrhs == 1)
-    {
-
-	for (s = 0 ; s < nsuper ; s++)
-	{
-	    k1 = Super [s] ;
-	    k2 = Super [s+1] ;
-	    psi = Lpi [s] ;
-	    psend = Lpi [s+1] ;
-	    psx = Lpx [s] ;
-	    nsrow = psend - psi ;
-	    nscol = k2 - k1 ;
-	    nsrow2 = nsrow - nscol ;
-	    ps2 = psi + nscol ;
-	    ASSERT ((size_t) nsrow2 <= L->maxesize) ;
-
-	    /* L1 is nscol-by-nscol, lower triangular with non-unit diagonal.
-	     * L2 is nsrow2-by-nscol.  L1 and L2 have leading dimension of
-	     * nsrow.  x1 is nscol-by-nsrow, with leading dimension n.
-	     * E is nsrow2-by-1, with leading dimension nsrow2.
-	     */
-
-	    /* gather X into E */
-	    for (ii = 0 ; ii < nsrow2 ; ii++)
-	    {
-		/* Ex [ii] = Xx [Ls [ps2 + ii]] ; */
-		ASSIGN (Ex,-,ii, Xx,-,Ls [ps2 + ii]) ;
-	    }
-
-#ifdef REAL
-
-	    /* solve L1*x1 (that is, x1 = L1\x1) */
-	    BLAS_dtrsv ("L", "N", "N",
-		nscol,			    /* N:       L1 is nscol-by-nscol */
-		Lx + ENTRY_SIZE*psx, nsrow, /* A, LDA:  L1 */
-		Xx + ENTRY_SIZE*k1, 1) ;    /* X, INCX: x1 */
-
-	    /* E = E - L2*x1 */
-	    BLAS_dgemv ("N",
-		nsrow2, nscol,		    /* M, N:    L2 is nsrow2-by-nscol */
-		minus_one,		    /* ALPHA:   -1 */
-		Lx + ENTRY_SIZE*(psx + nscol),   /* A, LDA:  L2 */
-		nsrow,
-		Xx + ENTRY_SIZE*k1, 1,	    /* X, INCX: x1 */
-		one,			    /* BETA:    1 */
-		Ex, 1) ;		    /* Y, INCY: E */
-
-#else
-
-	    /* solve L1*x1 (that is, x1 = L1\x1) */
-	    BLAS_ztrsv ("L", "N", "N",
-		nscol,			    /* N:       L1 is nscol-by-nscol */
-		Lx + ENTRY_SIZE*psx, nsrow, /* A, LDA:  L1 */
-		Xx + ENTRY_SIZE*k1, 1) ;    /* X, INCX: x1 */
-
-	    /* E = E - L2*x1 */
-	    BLAS_zgemv ("N",
-		nsrow2, nscol,		    /* M, N:    L2 is nsrow2-by-nscol */
-		minus_one,		    /* ALPHA:   -1 */
-		Lx + ENTRY_SIZE*(psx + nscol),   /* A, LDA:  L2 */
-		nsrow,
-		Xx + ENTRY_SIZE*k1, 1,	    /* X, INCX: x1 */
-		one,			    /* BETA:    1 */
-		Ex, 1) ;		    /* Y, INCY: E */
-
-#endif
-
-	    /* scatter E back into X */
-	    for (ii = 0 ; ii < nsrow2 ; ii++)
-	    {
-		/* Xx [Ls [ps2 + ii]] = Ex [ii] ; */
-		ASSIGN (Xx,-,Ls [ps2 + ii], Ex,-,ii) ;
-	    }
-	}
-    }
-    else
-    {
-
-	for (s = 0 ; s < nsuper ; s++)
-	{
-	    k1 = Super [s] ;
-	    k2 = Super [s+1] ;
-	    psi = Lpi [s] ;
-	    psend = Lpi [s+1] ;
-	    psx = Lpx [s] ;
-	    nsrow = psend - psi ;
-	    nscol = k2 - k1 ;
-	    nsrow2 = nsrow - nscol ;
-	    ps2 = psi + nscol ;
-	    ASSERT ((size_t) nsrow2 <= L->maxesize) ;
-
-	    /* E is nsrow2-by-nrhs, with leading dimension nsrow2. */
-
-	    /* gather X into E */
-	    for (ii = 0 ; ii < nsrow2 ; ii++)
-	    {
-		i = Ls [ps2 + ii] ;
-		for (j = 0 ; j < nrhs ; j++)
-		{
-		    /* Ex [ii + j*nsrow2] = Xx [i + j*d] ; */
-		    ASSIGN (Ex,-,ii+j*nsrow2, Xx,-,i+j*d) ;
-		}
-	    }
-
-#ifdef REAL
-
-	    /* solve L1*x1 */
-	    BLAS_dtrsm ("L", "L", "N", "N",
-		nscol, nrhs,			/* M, N: x1 is nscol-by-nrhs */
-		one,				/* ALPHA:  1 */
-		Lx + ENTRY_SIZE*psx, nsrow,	/* A, LDA: L1 */
-		Xx + ENTRY_SIZE*k1, d) ;	/* B, LDB: x1 */
-
-	    /* E = E - L2*x1 */
-	    if (nsrow2 > 0)
-	    {
-		BLAS_dgemm ("N", "N",
-		    nsrow2, nrhs, nscol,	    /* M, N, K */
-		    minus_one,			    /* ALPHA:  -1 */
-		    Lx + ENTRY_SIZE*(psx + nscol),  /* A, LDA: L2 */
-		    nsrow,
-		    Xx + ENTRY_SIZE*k1, d,	    /* B, LDB: X1 */
-		    one,			    /* BETA:   1 */
-		    Ex, nsrow2) ;		    /* C, LDC: E */
-	    }
-
-#else
-
-	    /* solve L1*x1 */
-	    BLAS_ztrsm ("L", "L", "N", "N",
-		nscol, nrhs,			/* M, N: x1 is nscol-by-nrhs */
-		one,				/* ALPHA:  1 */
-		Lx + ENTRY_SIZE*psx, nsrow,	/* A, LDA: L1 */
-		Xx + ENTRY_SIZE*k1, d) ;	/* B, LDB: x1 */
-
-	    /* E = E - L2*x1 */
-	    if (nsrow2 > 0)
-	    {
-		BLAS_zgemm ("N", "N",
-		    nsrow2, nrhs, nscol,	    /* M, N, K */
-		    minus_one,			    /* ALPHA:  -1 */
-		    Lx + ENTRY_SIZE*(psx + nscol),  /* A, LDA: L2 */
-		    nsrow,
-		    Xx + ENTRY_SIZE*k1, d,	    /* B, LDB: X1 */
-		    one,			    /* BETA:   1 */
-		    Ex, nsrow2) ;		    /* C, LDC: E */
-	    }
-
-#endif
-
-	    /* scatter E back into X */
-	    for (ii = 0 ; ii < nsrow2 ; ii++)
-	    {
-		i = Ls [ps2 + ii] ;
-		for (j = 0 ; j < nrhs ; j++)
-		{
-		    /* Xx [i + j*d] = Ex [ii + j*nsrow2] ; */
-		    ASSIGN (Xx,-,i+j*d, Ex,-,ii+j*nsrow2) ;
-		}
-	    }
-	}
-    }
-}
-
-
-static void TEMPLATE (cholmod_super_ltsolve)
-(
-    /* ---- input ---- */
-    cholmod_factor *L,	/* factor to use for the forward solve */
-    /* ---- output ---- */
-    cholmod_dense *X,	/* b on input, solution to Lx=b on output */
-    /* ---- workspace ---- */
-    cholmod_dense *E,	/* workspace of size nrhs*(L->maxesize) */
-    /* --------------- */
-    cholmod_common *Common
-)
-{
-    double *Lx, *Xx, *Ex ;
-    double minus_one [2], one [2] ;
-    Int *Lpi, *Lpx, *Ls, *Super ;
-    Int nsuper, k1, k2, psi, psend, psx, nsrow, nscol, ii, s,
-	nsrow2, n, ps2, j, i, d, nrhs ;
-
-    /* ---------------------------------------------------------------------- */
-    /* get inputs */
-    /* ---------------------------------------------------------------------- */
-
-    nrhs = X->ncol ;
-    Ex = E->x ;
-    Xx = X->x ;
-    n = L->n ;
-    d = X->d ;
-
-    nsuper = L->nsuper ;
-    Lpi = L->pi ;
-    Lpx = L->px ;
-    Ls = L->s ;
-    Super = L->super ;
-    Lx = L->x ;
-    minus_one [0] = -1.0 ;
-    minus_one [1] = 0 ;
-    one [0] = 1.0 ;
-    one [1] = 0 ;
-
-    /* ---------------------------------------------------------------------- */
-    /* solve L'x=b */
-    /* ---------------------------------------------------------------------- */
-
-    if (nrhs == 1)
-    {
-
-	for (s = nsuper-1 ; s >= 0 ; s--)
-	{
-	    k1 = Super [s] ;
-	    k2 = Super [s+1] ;
-	    psi = Lpi [s] ;
-	    psend = Lpi [s+1] ;
-	    psx = Lpx [s] ;
-	    nsrow = psend - psi ;
-	    nscol = k2 - k1 ;
-	    nsrow2 = nsrow - nscol ;
-	    ps2 = psi + nscol ;
-	    ASSERT ((size_t) nsrow2 <= L->maxesize) ;
-
-	    /* L1 is nscol-by-nscol, lower triangular with non-unit diagonal.
-	     * L2 is nsrow2-by-nscol.  L1 and L2 have leading dimension of
-	     * nsrow.  x1 is nscol-by-nsrow, with leading dimension n.
-	     * E is nsrow2-by-1, with leading dimension nsrow2.
-	     */
-
-	    /* gather X into E */
-	    for (ii = 0 ; ii < nsrow2 ; ii++)
-	    {
-		/* Ex [ii] = Xx [Ls [ps2 + ii]] ; */
-		ASSIGN (Ex,-,ii, Xx,-,Ls [ps2 + ii]) ;
-	    }
-
-#ifdef REAL
-
-	    /* x1 = x1 - L2'*E */
-	    BLAS_dgemv ("C",
-		nsrow2, nscol,		    /* M, N: L2 is nsrow2-by-nscol */
-		minus_one,		    /* ALPHA:   -1 */
-		Lx + ENTRY_SIZE*(psx + nscol),   /* A, LDA:  L2 */
-		nsrow,
-		Ex, 1,			    /* X, INCX: Ex */
-		one,			    /* BETA:    1 */
-		Xx + ENTRY_SIZE*k1, 1) ;    /* Y, INCY: x1 */
-
-	    /* solve L1'*x1 */
-	    BLAS_dtrsv ("L", "C", "N",
-		nscol,			    /* N:	L1 is nscol-by-nscol */
-		Lx + ENTRY_SIZE*psx, nsrow,	    /* A, LDA:  L1 */
-		Xx + ENTRY_SIZE*k1, 1) ;	    /* X, INCX: x1 */
-
-#else
-
-	    /* x1 = x1 - L2'*E */
-	    BLAS_zgemv ("C",
-		nsrow2, nscol,		    /* M, N: L2 is nsrow2-by-nscol */
-		minus_one,		    /* ALPHA:   -1 */
-		Lx + ENTRY_SIZE*(psx + nscol),   /* A, LDA:  L2 */
-		nsrow,
-		Ex, 1,			    /* X, INCX: Ex */
-		one,			    /* BETA:    1 */
-		Xx + ENTRY_SIZE*k1, 1) ;    /* Y, INCY: x1 */
-
-	    /* solve L1'*x1 */
-	    BLAS_ztrsv ("L", "C", "N",
-		nscol,			    /* N:	L1 is nscol-by-nscol */
-		Lx + ENTRY_SIZE*psx, nsrow,	    /* A, LDA:  L1 */
-		Xx + ENTRY_SIZE*k1, 1) ;	    /* X, INCX: x1 */
-
-#endif
-
-	}
-    }
-    else
-    {
-
-	for (s = nsuper-1 ; s >= 0 ; s--)
-	{
-	    k1 = Super [s] ;
-	    k2 = Super [s+1] ;
-	    psi = Lpi [s] ;
-	    psend = Lpi [s+1] ;
-	    psx = Lpx [s] ;
-	    nsrow = psend - psi ;
-	    nscol = k2 - k1 ;
-	    nsrow2 = nsrow - nscol ;
-	    ps2 = psi + nscol ;
-	    ASSERT ((size_t) nsrow2 <= L->maxesize) ;
-
-	    /* E is nsrow2-by-nrhs, with leading dimension nsrow2. */
-
-	    /* gather X into E */
-	    for (ii = 0 ; ii < nsrow2 ; ii++)
-	    {
-		i = Ls [ps2 + ii] ;
-		for (j = 0 ; j < nrhs ; j++)
-		{
-		    /* Ex [ii + j*nsrow2] = Xx [i + j*d] ; */
-		    ASSIGN (Ex,-,ii+j*nsrow2, Xx,-,i+j*d) ;
-		}
-	    }
-
-#ifdef REAL
-
-	    /* x1 = x1 - L2'*E */
-	    if (nsrow2 > 0)
-	    {
-		BLAS_dgemm ("C", "N",
-		    nscol, nrhs, nsrow2,	/* M, N, K */
-		    minus_one,			/* ALPHA:  -1 */
-		    Lx + ENTRY_SIZE*(psx + nscol),  /* A, LDA: L2 */
-		    nsrow,
-		    Ex, nsrow2,			/* B, LDB: E */
-		    one,			/* BETA:   1 */
-		    Xx + ENTRY_SIZE*k1, d) ;	/* C, LDC: x1 */
-	    }
-
-	    /* solve L1'*x1 */
-	    BLAS_dtrsm ("L", "L", "C", "N",
-		nscol,	nrhs,			/* M, N: x1 is nscol-by-nrhs */
-		one,				/* ALPHA:  1 */
-		Lx + ENTRY_SIZE*psx, nsrow,	/* A, LDA: L1 */
-		Xx + ENTRY_SIZE*k1, d) ;	/* B, LDB: x1 */
-
-#else
-
-	    /* x1 = x1 - L2'*E */
-	    if (nsrow2 > 0)
-	    {
-		BLAS_zgemm ("C", "N",
-		    nscol, nrhs, nsrow2,	/* M, N, K */
-		    minus_one,			/* ALPHA:  -1 */
-		    Lx + ENTRY_SIZE*(psx + nscol),  /* A, LDA: L2 */
-		    nsrow,
-		    Ex, nsrow2,			/* B, LDB: E */
-		    one,			/* BETA:   1 */
-		    Xx + ENTRY_SIZE*k1, d) ;	/* C, LDC: x1 */
-	    }
-
-	    /* solve L1'*x1 */
-	    BLAS_ztrsm ("L", "L", "C", "N",
-		nscol,	nrhs,			/* M, N: x1 is nscol-by-nrhs */
-		one,				/* ALPHA:  1 */
-		Lx + ENTRY_SIZE*psx, nsrow,	/* A, LDA: L1 */
-		Xx + ENTRY_SIZE*k1, d) ;	/* B, LDB: x1 */
-
-#endif
-
-	}
-    }
-}
-
-#undef PATTERN
-#undef REAL
-#undef COMPLEX
-#undef ZOMPLEX
diff --git a/src/C/SuiteSparse/COLAMD/Demo/Makefile b/src/C/SuiteSparse/COLAMD/Demo/Makefile
deleted file mode 100644
index a4ddbc0..0000000
--- a/src/C/SuiteSparse/COLAMD/Demo/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#-----------------------------------------------------------------------------
-# compile the COLAMD demo
-#-----------------------------------------------------------------------------
-
-default: colamd_example colamd_l_example
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-I = -I../Include -I../../SuiteSparse_config
-
-C = $(CC) $(CF) $(I)
-
-LIB2 = ../../SuiteSparse_config/libsuitesparseconfig.a $(LIB)
-
-library:
-	( cd ../../SuiteSparse_config ; $(MAKE) )
-	( cd ../Lib ; $(MAKE) )
-
-#------------------------------------------------------------------------------
-# Create the demo program, run it, and compare the output
-#------------------------------------------------------------------------------
-
-dist:
-
-colamd_example: colamd_example.c library
-	$(C) -o colamd_example colamd_example.c ../Lib/libcolamd.a $(LIB2)
-	- ./colamd_example > my_colamd_example.out
-	- diff colamd_example.out my_colamd_example.out
-
-colamd_l_example: colamd_l_example.c library
-	$(C) -o colamd_l_example colamd_l_example.c ../Lib/libcolamd.a $(LIB2)
-	- ./colamd_l_example > my_colamd_l_example.out
-	- diff colamd_l_example.out my_colamd_l_example.out
-
-#------------------------------------------------------------------------------
-# Remove all but the files in the original distribution
-#------------------------------------------------------------------------------
-
-clean:
-	- $(RM) $(CLEAN)
-
-purge: distclean
-
-distclean: clean
-	- $(RM) colamd_example colamd_l_example
-	- $(RM) my_colamd_example.out my_colamd_l_example.out
-	- $(RM) -r *.dSYM
diff --git a/src/C/SuiteSparse/COLAMD/Demo/colamd_example.c b/src/C/SuiteSparse/COLAMD/Demo/colamd_example.c
deleted file mode 100644
index 3295186..0000000
--- a/src/C/SuiteSparse/COLAMD/Demo/colamd_example.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* ========================================================================== */
-/* === colamd and symamd example ============================================ */
-/* ========================================================================== */
-
-/* COLAMD / 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).
-
-    See the colamd.c for the routines this program calls, and for the License.
-*/
-
-/* ========================================================================== */
-
-#include <stdio.h>
-#include "colamd.h"
-
-#define A_NNZ 11
-#define A_NROW 5
-#define A_NCOL 4
-#define ALEN 150
-
-#define B_NNZ 4
-#define B_N 5
-
-int main (void)
-{
-
-    /* ====================================================================== */
-    /* 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 --git a/src/C/SuiteSparse/COLAMD/Demo/colamd_example.out b/src/C/SuiteSparse/COLAMD/Demo/colamd_example.out
deleted file mode 100644
index 305164c..0000000
--- a/src/C/SuiteSparse/COLAMD/Demo/colamd_example.out
+++ /dev/null
@@ -1,50 +0,0 @@
-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 version 2.9, Oct 10, 2014: OK.  
-colamd: number of dense or empty rows ignored:           0
-colamd: number of dense or empty columns ignored:        0
-colamd: number of garbage collections performed:         0
-colamd column ordering:
-1st column: 1
-2nd column: 0
-3rd column: 2
-4th column: 3
-
-
-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 version 2.9, Oct 10, 2014: 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 --git a/src/C/SuiteSparse/COLAMD/Demo/colamd_l_example.c b/src/C/SuiteSparse/COLAMD/Demo/colamd_l_example.c
deleted file mode 100644
index e1345e9..0000000
--- a/src/C/SuiteSparse/COLAMD/Demo/colamd_l_example.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/* ========================================================================== */
-/* === colamd and symamd example ============================================ */
-/* ========================================================================== */
-
-/* COLAMD / 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).
-
-
-    See the colamd.c for the routines this program calls, and for the License.
-*/
-
-/* ========================================================================== */
-
-#include <stdio.h>
-#include "colamd.h"
-#define Long SuiteSparse_long
-
-#define A_NNZ 11
-#define A_NROW 5
-#define A_NCOL 4
-#define ALEN 150
-
-#define B_NNZ 4
-#define B_N 5
-
-int main (void)
-{
-
-    /* ====================================================================== */
-    /* input matrix A definition */
-    /* ====================================================================== */
-
-    Long 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 */
-
-    Long 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 */
-    /* ====================================================================== */
-
-    Long 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) */
-
-    Long 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 */
-    /* ====================================================================== */
-
-    Long perm [B_N+1] ;	        /* note the size is N+1 */
-    Long stats [COLAMD_STATS] ; /* for colamd and symamd output statistics */
-
-    Long 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 %ld, with %ld entries:\n", col, length) ;
-	for (pp = p [col] ; pp < p [col+1] ; pp++)
-	{
-	    row = A [pp] ;
-	    printf ("    row %ld\n", row) ;
-	}
-    }
-
-    /* ====================================================================== */
-    /* order the matrix.  Note that this destroys A and overwrites p */
-    /* ====================================================================== */
-
-    ok = colamd_l (A_NROW, A_NCOL, ALEN, A, p, (double *) NULL, stats) ;
-    colamd_l_report (stats) ;
-
-    if (!ok)
-    {
-	printf ("colamd error!\n") ;
-	exit (1) ;
-    }
-
-    /* ====================================================================== */
-    /* print the column ordering */
-    /* ====================================================================== */
-
-    printf ("colamd_l column ordering:\n") ;
-    printf ("1st column: %ld\n", p [0]) ;
-    printf ("2nd column: %ld\n", p [1]) ;
-    printf ("3rd column: %ld\n", p [2]) ;
-    printf ("4th column: %ld\n", p [3]) ;
-
-    /* ====================================================================== */
-    /* dump the strictly lower triangular part of symmetric input matrix B */
-    /* ====================================================================== */
-
-    printf ("\n\nsymamd_l %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 %ld, with %ld entries:\n", col, length) ;
-	for (pp = q [col] ; pp < q [col+1] ; pp++)
-	{
-	    row = B [pp] ;
-	    printf ("    row %ld\n", row) ;
-	}
-    }
-
-    /* ====================================================================== */
-    /* order the matrix B.  Note that this does not modify B or q. */
-    /* ====================================================================== */
-
-    ok = symamd_l (B_N, B, q, perm, (double *) NULL, stats, &calloc, &free) ;
-    symamd_l_report (stats) ;
-
-    if (!ok)
-    {
-	printf ("symamd error!\n") ;
-	exit (1) ;
-    }
-
-    /* ====================================================================== */
-    /* print the symmetric ordering */
-    /* ====================================================================== */
-
-    printf ("symamd_l column ordering:\n") ;
-    printf ("1st row/column: %ld\n", perm [0]) ;
-    printf ("2nd row/column: %ld\n", perm [1]) ;
-    printf ("3rd row/column: %ld\n", perm [2]) ;
-    printf ("4th row/column: %ld\n", perm [3]) ;
-    printf ("5th row/column: %ld\n", perm [4]) ;
-
-    exit (0) ;
-}
-
diff --git a/src/C/SuiteSparse/COLAMD/Demo/colamd_l_example.out b/src/C/SuiteSparse/COLAMD/Demo/colamd_l_example.out
deleted file mode 100644
index 2520a5f..0000000
--- a/src/C/SuiteSparse/COLAMD/Demo/colamd_l_example.out
+++ /dev/null
@@ -1,50 +0,0 @@
-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 version 2.9, Oct 10, 2014: OK.  
-colamd: number of dense or empty rows ignored:           0
-colamd: number of dense or empty columns ignored:        0
-colamd: number of garbage collections performed:         0
-colamd_l column ordering:
-1st column: 1
-2nd column: 0
-3rd column: 2
-4th column: 3
-
-
-symamd_l 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 version 2.9, Oct 10, 2014: 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_l column ordering:
-1st row/column: 0
-2nd row/column: 2
-3rd row/column: 1
-4th row/column: 3
-5th row/column: 4
diff --git a/src/C/SuiteSparse/COLAMD/Doc/ChangeLog b/src/C/SuiteSparse/COLAMD/Doc/ChangeLog
deleted file mode 100644
index e95f157..0000000
--- a/src/C/SuiteSparse/COLAMD/Doc/ChangeLog
+++ /dev/null
@@ -1,153 +0,0 @@
-Oct 10, 2014: version 2.9.1
-
-    modified MATLAB/colamd_make.m.  No change to C code except version number.
-
-July 31, 2013: version 2.9.0
-
-    * changed malloc and printf pointers to use SuiteSparse_config
-
-Jun 1, 2012: version 2.8.0
-
-    * UFconfig replaced with SuiteSparse_config
-
-Dec 7, 2011: version 2.7.4
-
-    * fixed the Makefile to better align with CFLAGS and other standards
-
-Jan 25, 2011: version 2.7.3
-
-    * minor fix to "make install"
-
-Nov 30, 2009: version 2.7.2
-
-    * added "make install" and "make uninstall"
-
-May 31, 2007: version 2.7.0
-
-    * ported to 64-bit MATLAB
-
-    * subdirectories added (Source/, Include/, Lib/, Doc/, MATLAB/, Demo/)
-
-Dec 12, 2006, version 2.5.2
-
-    * minor MATLAB cleanup.  MATLAB functions renamed colamd2 and symamd2,
-	so that they do not conflict with the built-in versions.  Note that
-	the MATLAB built-in functions colamd and symamd are identical to
-	the colamd and symamd functions here.
-
-Aug 31, 2006: Version 2.5.1
-
-    * minor change to colamd.m and symamd.m, to use etree instead
-	of sparsfun.
-
-Apr. 30, 2006: Version 2.5
-
-    * colamd_recommended modified, to do more careful integer overflow
-	checking.  It now returns size_t, not int.  colamd_l_recommended
-	also returns size_t.  A zero is returned if an error occurs.  A
-	postive return value denotes success.  In v2.4 and earlier,
-	-1 was returned on error (an int or long).
-
-    * long replaced with UF_long integer, which is long except on WIN64.
-
-Nov 15, 2005:
-
-    * minor editting of comments; version number (2.4) unchanged.
-
-Changes from Version 2.3 to 2.4 (Aug 30, 2005)
-
-    * Makefile now relies on ../UFconfig/UFconfig.mk
-
-    * changed the dense row/col detection.  The meaning of the knobs
-	has thus changed.
-
-    * added an option to turn off aggressive absorption.  It was
-	always on in versions 2.3 and earlier.
-
-    * added a #define'd version number
-
-    * added a function pointer (colamd_printf) for COLAMD's printing.
-
-    * added a -DNPRINT option, to turn off printing at compile-time.
-
-    * added a check for integer overflow in colamd_recommended
-
-    * minor changes to allow for more simpler 100% test coverage
-
-    * bug fix.  If symamd v2.3 fails to allocate its copy of the input
-	matrix, then it erroneously frees a calloc'd workspace twice.
-	This bug has no effect on the MATLAB symamd mexFunction, since
-	mxCalloc terminates the mexFunction if it fails to allocate
-	memory.  Similarly, UMFPACK is not affected because it does not
-	use symamd.  The bug has no effect on the colamd ordering
-	routine in v2.3.
-
-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 <stdio.h> 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 --git a/src/C/SuiteSparse/COLAMD/Doc/lesser.txt b/src/C/SuiteSparse/COLAMD/Doc/lesser.txt
deleted file mode 100644
index 8add30a..0000000
--- a/src/C/SuiteSparse/COLAMD/Doc/lesser.txt
+++ /dev/null
@@ -1,504 +0,0 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-

-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-

-		  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-  
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-

-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-

-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-

-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-

-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-

-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-

-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-			    NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/src/C/SuiteSparse/COLAMD/Include/colamd.h b/src/C/SuiteSparse/COLAMD/Include/colamd.h
deleted file mode 100644
index ee4f644..0000000
--- a/src/C/SuiteSparse/COLAMD/Include/colamd.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/* ========================================================================== */
-/* === colamd/symamd prototypes and definitions ============================= */
-/* ========================================================================== */
-
-/* COLAMD / SYMAMD include file
-
-    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 (DrTimothyAldenDavis at gmail.com).  The algorithm was
-	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
-	Ng, Oak Ridge National Laboratory.
-
-    Acknowledgements:
-
-	This work was supported by the National Science Foundation, under
-	grants DMS-9504974 and DMS-9803599.
-
-    Notice:
-
-	Copyright (c) 1998-2007, Timothy A. Davis, 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.suitesparse.com
-	This file 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
-
-/* make it easy for C++ programs to include COLAMD */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ========================================================================== */
-/* === Include files ======================================================== */
-/* ========================================================================== */
-
-#include <stdlib.h>
-
-/* ========================================================================== */
-/* === COLAMD version ======================================================= */
-/* ========================================================================== */
-
-/* COLAMD Version 2.4 and later will include the following definitions.
- * As an example, to test if the version you are using is 2.4 or later:
- *
- * #ifdef COLAMD_VERSION
- *	if (COLAMD_VERSION >= COLAMD_VERSION_CODE (2,4)) ...
- * #endif
- *
- * This also works during compile-time:
- *
- *  #if defined(COLAMD_VERSION) && (COLAMD_VERSION >= COLAMD_VERSION_CODE (2,4))
- *    printf ("This is version 2.4 or later\n") ;
- *  #else
- *    printf ("This is an early version\n") ;
- *  #endif
- *
- * Versions 2.3 and earlier of COLAMD do not include a #define'd version number.
- */
-
-#define COLAMD_DATE "Oct 10, 2014"
-#define COLAMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub))
-#define COLAMD_MAIN_VERSION 2
-#define COLAMD_SUB_VERSION 9
-#define COLAMD_SUBSUB_VERSION 1
-#define COLAMD_VERSION \
-	COLAMD_VERSION_CODE(COLAMD_MAIN_VERSION,COLAMD_SUB_VERSION)
-
-/* ========================================================================== */
-/* === 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
-
-/* knobs [2]: aggressive absorption */
-#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
-
-/* 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)
-
-
-/* ========================================================================== */
-/* === Prototypes of user-callable routines ================================= */
-/* ========================================================================== */
-
-#include "SuiteSparse_config.h"
-
-size_t colamd_recommended	/* returns recommended value of Alen, */
-				/* or 0 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 */
-) ;
-
-size_t colamd_l_recommended	/* returns recommended value of Alen, */
-				/* or 0 if input arguments are erroneous */
-(
-    SuiteSparse_long nnz,       /* nonzeros in A */
-    SuiteSparse_long n_row,     /* number of rows in A */
-    SuiteSparse_long 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 */
-) ;
-
-void colamd_l_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 */
-) ;
-
-SuiteSparse_long colamd_l       /* returns (1) if successful, (0) otherwise*/
-(				/* A and p arguments are modified on output */
-    SuiteSparse_long n_row,     /* number of rows in A */
-    SuiteSparse_long n_col,     /* number of columns in A */
-    SuiteSparse_long Alen,      /* size of the array A */
-    SuiteSparse_long A [],      /* row indices of A, of size Alen */
-    SuiteSparse_long p [],      /* column pointers of A, of size n_col+1 */
-    double knobs [COLAMD_KNOBS],/* parameter settings for colamd */
-    SuiteSparse_long 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) */
-) ;
-
-SuiteSparse_long symamd_l               /* return (1) if OK, (0) otherwise */
-(
-    SuiteSparse_long n,                 /* number of rows and columns of A */
-    SuiteSparse_long A [],              /* row indices of A */
-    SuiteSparse_long p [],              /* column pointers of A */
-    SuiteSparse_long perm [],           /* output permutation, size n_col+1 */
-    double knobs [COLAMD_KNOBS],	/* parameters (uses defaults if NULL) */
-    SuiteSparse_long stats [COLAMD_STATS],  /* output stats 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 colamd_l_report
-(
-    SuiteSparse_long stats [COLAMD_STATS]
-) ;
-
-void symamd_report
-(
-    int stats [COLAMD_STATS]
-) ;
-
-void symamd_l_report
-(
-    SuiteSparse_long stats [COLAMD_STATS]
-) ;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* COLAMD_H */
diff --git a/src/C/SuiteSparse/COLAMD/Lib/Makefile b/src/C/SuiteSparse/COLAMD/Lib/Makefile
deleted file mode 100644
index ea49720..0000000
--- a/src/C/SuiteSparse/COLAMD/Lib/Makefile
+++ /dev/null
@@ -1,32 +0,0 @@
-#-------------------------------------------------------------------------------
-# COLAMD Makefile
-#-------------------------------------------------------------------------------
-
-default: libcolamd.a
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-I = -I../Include -I../../SuiteSparse_config
-
-INC = ../Include/colamd.h ../../SuiteSparse_config/SuiteSparse_config.h
-
-SRC = ../Source/colamd.c
-
-# creates libcolamd.a, a C-callable COLAMD library
-libcolamd.a:  $(SRC) $(INC)
-	$(CC) $(CF) $(I) -c ../Source/colamd.c
-	$(CC) $(CF) $(I) -c ../Source/colamd.c -DDLONG -o colamd_l.o
-	$(ARCHIVE)  libcolamd.a colamd.o colamd_l.o
-	- $(RANLIB) libcolamd.a
-
-ccode: libcolamd.a
-
-library: libcolamd.a
-
-clean:
-	- $(RM) $(CLEAN)
-
-purge: distclean
-
-distclean: clean
-	- $(RM) libcolamd.a
diff --git a/src/C/SuiteSparse/COLAMD/Makefile b/src/C/SuiteSparse/COLAMD/Makefile
deleted file mode 100644
index d253e56..0000000
--- a/src/C/SuiteSparse/COLAMD/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#------------------------------------------------------------------------------
-# COLAMD Makefile
-#------------------------------------------------------------------------------
-
-VERSION = 2.9.1
-
-default: all
-
-include ../SuiteSparse_config/SuiteSparse_config.mk
-
-demos: all
-
-# Compile all C code
-all:
-	( cd Lib    ; $(MAKE) )
-	( cd Demo   ; $(MAKE) )
-
-# compile just the C-callable libraries (not Demos)
-library:
-	( cd Lib    ; $(MAKE) )
-
-# remove object files, but keep the compiled programs and library archives
-clean:
-	( cd Lib    ; $(MAKE) clean )
-	( cd Demo   ; $(MAKE) clean )
-	( cd MATLAB ; $(RM) $(CLEAN) )
-
-# clean, and then remove compiled programs and library archives
-purge:
-	( cd Lib    ; $(MAKE) purge )
-	( cd Demo   ; $(MAKE) purge )
-	( cd MATLAB ; $(RM) $(CLEAN) ; $(RM) *.mex* )
-
-distclean: purge
-
-# get ready for distribution
-dist: purge
-	( cd Demo   ; $(MAKE) dist )
-
-ccode: library
-
-lib: library
-
-# install COLAMD
-install:
-	$(CP) Lib/libcolamd.a $(INSTALL_LIB)/libcolamd.$(VERSION).a
-	( cd $(INSTALL_LIB) ; ln -sf libcolamd.$(VERSION).a libcolamd.a )
-	$(CP) Include/colamd.h $(INSTALL_INCLUDE)
-	chmod 644 $(INSTALL_LIB)/libcolamd*.a
-	chmod 644 $(INSTALL_INCLUDE)/colamd.h
-
-# uninstall COLAMD
-uninstall:
-	$(RM) $(INSTALL_LIB)/libcolamd*.a
-	$(RM) $(INSTALL_INCLUDE)/colamd.h
-
diff --git a/src/C/SuiteSparse/COLAMD/README.txt b/src/C/SuiteSparse/COLAMD/README.txt
deleted file mode 100644
index e22ebd5..0000000
--- a/src/C/SuiteSparse/COLAMD/README.txt
+++ /dev/null
@@ -1,118 +0,0 @@
-COLAMD, Copyright 1998-2013, Timothy A. Davis.  http://www.suitesparse.com
--------------------------------------------------------------------------------
-
-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
-COLAMD/ directory from the COLAMD.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.
-
-To compile and install the colamd m-files and mexFunctions, just cd to
-COLAMD/MATLAB and type colamd_install in the MATLAB command window.
-A short demo will run.  Optionally, type colamd_test to run an extensive tests.
-Type "make" in Unix in the COLAMD directory to compile the C-callable
-library and to run a short demo.
-
-Colamd is a built-in routine in MATLAB, available from The 
-Mathworks, Inc.  Under most cases, the compiled COLAMD from Versions 2.0 to the
-current version do not differ.  Colamd Versions 2.2 and 2.3 differ only in their
-mexFunction interaces to MATLAB.  v2.4 fixes a bug in the symamd routine in
-v2.3.  The bug (in v2.3 and earlier) has no effect on the MATLAB symamd
-mexFunction.  v2.5 adds additional checks for integer overflow, so that
-the "int" version can be safely used with 64-bit pointers.  Refer to the
-ChangeLog for more details.
-
-To use colamd and symamd within an application written in C, all you need are
-colamd.c, colamd_global.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.
-
-Requires SuiteSparse_config, in the ../SuiteSparse_config directory relative to
-this directory.
-
-See the colamd.c file or http://www.suitesparse.com for the license to COLAMD.
-
-Related papers:
-
-	T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, An approximate column
-	minimum degree ordering algorithm, ACM Transactions on Mathematical
-	Software, vol. 30, no. 3., pp. 353-376, 2004.
-
-	T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD,
-	an approximate column minimum degree ordering algorithm, ACM
-	Transactions on Mathematical Software, vol. 30, no. 3., pp. 377-380,
-	2004.
-
-	"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.
-
-	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.
-
-
-Authors:  Stefan I. Larimore and Timothy A. Davis,
-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:
-
-    Demo	    simple demo
-    Doc		    additional documentation (see colamd.c for more)
-    Include	    include file
-    Lib		    compiled C-callable library
-    Makefile	    primary Unix Makefile
-    MATLAB	    MATLAB functions
-    README.txt	    this file
-    Source	    C source code
-
-    ./Demo:
-    colamd_example.c	    simple example
-    colamd_example.out	    output of colamd_example.c
-    colamd_l_example.c	    simple example, long integers
-    colamd_l_example.out    output of colamd_l_example.c
-    Makefile		    Makefile for C demos
-
-    ./Doc:
-    ChangeLog	    change log
-    lesser.txt	    license
-
-    ./Include:
-    colamd.h	    include file
-
-    ./Lib:
-    Makefile	    Makefile for C-callable library
-
-    ./MATLAB:
-    colamd2.m		MATLAB interface for colamd2
-    colamd_demo.m	simple demo
-    colamd_install.m	compile and install colamd2 and symamd2
-    colamd_make.m	compile colamd2 and symamd2
-    colamdmex.ca	MATLAB mexFunction for colamd2
-    colamd_test.m	extensive test
-    colamdtestmex.c	test function for colamd
-    Contents.m		contents of the MATLAB directory
-    luflops.m		test code
-    Makefile		Makefile for MATLAB functions
-    symamd2.m		MATLAB interface for symamd2
-    symamdmex.c		MATLAB mexFunction for symamd2
-    symamdtestmex.c	test function for symamd
-
-    ./Source:
-    colamd.c		primary source code
-    colamd_global.c	globally defined function pointers (malloc, free, ...)
diff --git a/src/C/SuiteSparse/COLAMD/Source/colamd.c b/src/C/SuiteSparse/COLAMD/Source/colamd.c
deleted file mode 100644
index eb306a0..0000000
--- a/src/C/SuiteSparse/COLAMD/Source/colamd.c
+++ /dev/null
@@ -1,3613 +0,0 @@
-/* ========================================================================== */
-/* === colamd/symamd - a sparse matrix column ordering algorithm ============ */
-/* ========================================================================== */
-
-/* COLAMD / SYMAMD
-
-    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 (DrTimothyAldenDavis at gmail.com).  The algorithm was
-	developed in collaboration with John Gilbert, Xerox PARC, and Esmond
-	Ng, Oak Ridge National Laboratory.
-
-    Acknowledgements:
-
-	This work was supported by the National Science Foundation, under
-	grants DMS-9504974 and DMS-9803599.
-
-    Copyright and License:
-
-	Copyright (c) 1998-2007, Timothy A. Davis, All Rights Reserved.
-	COLAMD is also available under alternate licenses, contact T. Davis
-	for details.
-
-	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:
-
-	The colamd/symamd library is available at http://www.suitesparse.com
-	Appears as ACM Algorithm 836.
-
-    See the ChangeLog file for changes since Version 1.0.
-
-    References:
-
-	T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, An approximate column
-	minimum degree ordering algorithm, ACM Transactions on Mathematical
-	Software, vol. 30, no. 3., pp. 353-376, 2004.
-
-	T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD,
-	an approximate column minimum degree ordering algorithm, ACM
-	Transactions on Mathematical Software, vol. 30, no. 3., pp. 377-380,
-	2004.
-
-*/
-
-/* ========================================================================== */
-/* === Description of user-callable routines ================================ */
-/* ========================================================================== */
-
-/* COLAMD includes both int and SuiteSparse_long versions of all its routines.
-    The description below is for the int version.  For SuiteSparse_long, all
-    int arguments become SuiteSparse_long.  SuiteSparse_long is normally
-    defined as long, except for WIN64.
-
-    ----------------------------------------------------------------------------
-    colamd_recommended:
-    ----------------------------------------------------------------------------
-
-	C syntax:
-
-	    #include "colamd.h"
-	    size_t colamd_recommended (int nnz, int n_row, int n_col) ;
-	    size_t colamd_l_recommended (SuiteSparse_long nnz,
-                SuiteSparse_long n_row, SuiteSparse_long n_col) ;
-
-	Purpose:
-
-	    Returns recommended value of Alen for use by colamd.  Returns 0
-	    if any input argument is negative.  The use of this routine
-	    is optional.  Not needed for symamd, which dynamically allocates
-	    its own memory.
-
-	    Note that in v2.4 and earlier, these routines returned int or long.
-	    They now return a value of type size_t.
-
-	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]) ;
-	    colamd_l_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.
-
-		NOTE: the meaning of the dense row/col knobs has changed in v2.4
-
-		knobs [0] and knobs [1] control dense row and col detection:
-
-		Colamd: rows with more than
-		max (16, knobs [COLAMD_DENSE_ROW] * sqrt (n_col))
-		entries are removed prior to ordering.  Columns with more than
-		max (16, knobs [COLAMD_DENSE_COL] * sqrt (MIN (n_row,n_col)))
-		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
-		max (16, knobs [COLAMD_DENSE_ROW] * sqrt (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 10.  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 [2]: aggressive absorption
-
-	        knobs [COLAMD_AGGRESSIVE] controls whether or not to do
-	        aggressive absorption during the ordering.  Default is TRUE.
-
-
-    ----------------------------------------------------------------------------
-    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]) ;
-	    SuiteSparse_long colamd_l (SuiteSparse_long n_row,
-                SuiteSparse_long n_col, SuiteSparse_long Alen,
-                SuiteSparse_long *A, SuiteSparse_long *p, double knobs
-                [COLAMD_KNOBS], SuiteSparse_long 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)
-
-		will be sufficient.  Note: the macro version does not check
-		for integer overflow, and thus is not recommended.  Use
-		the colamd_recommended routine instead.
-
-	    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 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 100
-		int A [ALEN] = {0, 1, 4, 2, 4, 0, 1, 2, 3, 1, 3} ;
-		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 *)) ;
-	    SuiteSparse_long symamd_l (SuiteSparse_long n, SuiteSparse_long *A,
-                SuiteSparse_long *p, SuiteSparse_long *perm, double knobs
-                [COLAMD_KNOBS], SuiteSparse_long 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).
-
-		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]) ;
-	    colamd_l_report (SuiteSparse_long 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]) ;
-	    symamd_l_report (SuiteSparse_long 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
-
-/* turn on debugging by uncommenting the following line
- #undef 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...
-
-    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 <limits.h>
-#include <math.h>
-
-#ifdef MATLAB_MEX_FILE
-#include "mex.h"
-#include "matrix.h"
-#endif /* MATLAB_MEX_FILE */
-
-#if !defined (NPRINT) || !defined (NDEBUG)
-#include <stdio.h>
-#endif
-
-#ifndef NULL
-#define NULL ((void *) 0)
-#endif
-
-/* ========================================================================== */
-/* === int or SuiteSparse_long ============================================== */
-/* ========================================================================== */
-
-#ifdef DLONG
-
-#define Int SuiteSparse_long
-#define ID  SuiteSparse_long_id
-#define Int_MAX SuiteSparse_long_max
-
-#define COLAMD_recommended colamd_l_recommended
-#define COLAMD_set_defaults colamd_l_set_defaults
-#define COLAMD_MAIN colamd_l
-#define SYMAMD_MAIN symamd_l
-#define COLAMD_report colamd_l_report
-#define SYMAMD_report symamd_l_report
-
-#else
-
-#define Int int
-#define ID "%d"
-#define Int_MAX INT_MAX
-
-#define COLAMD_recommended colamd_recommended
-#define COLAMD_set_defaults colamd_set_defaults
-#define COLAMD_MAIN colamd
-#define SYMAMD_MAIN symamd
-#define COLAMD_report colamd_report
-#define SYMAMD_report symamd_report
-
-#endif
-
-/* ========================================================================== */
-/* === 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 colamd_recommended. */
-
-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 ;
-
-/* ========================================================================== */
-/* === Definitions ========================================================== */
-/* ========================================================================== */
-
-/* Routines are either PUBLIC (user-callable) or PRIVATE (not user-callable) */
-#define PUBLIC
-#define PRIVATE static
-
-#define DENSE_DEGREE(alpha,n) \
-    ((Int) MAX (16.0, (alpha) * sqrt ((double) (n))))
-
-#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 =========================================== */
-/* ========================================================================== */
-
-#if defined (MATLAB_MEX_FILE) || defined (MATHWORKS)
-/* In MATLAB, matrices are 1-based to the user, but 0-based internally */
-#define INDEX(i) ((i)+1)
-#else
-/* In C, matrices are 0-based and indices are reported as such in *_report */
-#define INDEX(i) (i)
-#endif
-
-/* ========================================================================== */
-/* === 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,
-    Int aggressive
-) ;
-
-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 tag_mark,
-    Int max_mark,
-    Int n_row,
-    Colamd_Row Row []
-) ;
-
-PRIVATE void print_report
-(
-    char *method,
-    Int stats [COLAMD_STATS]
-) ;
-
-/* ========================================================================== */
-/* === Debugging prototypes and definitions ================================= */
-/* ========================================================================== */
-
-#ifndef NDEBUG
-
-#include <assert.h>
-
-/* colamd_debug is the *ONLY* global variable, and is only */
-/* present when debugging */
-
-PRIVATE Int colamd_debug = 0 ;	/* debug print level */
-
-#define DEBUG0(params) { SUITESPARSE_PRINTF (params) ; }
-#define DEBUG1(params) { if (colamd_debug >= 1) SUITESPARSE_PRINTF (params) ; }
-#define DEBUG2(params) { if (colamd_debug >= 2) SUITESPARSE_PRINTF (params) ; }
-#define DEBUG3(params) { if (colamd_debug >= 3) SUITESPARSE_PRINTF (params) ; }
-#define DEBUG4(params) { if (colamd_debug >= 4) SUITESPARSE_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)
-
-#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, or if integer overflow occurs, a 0 is returned as an
-    error condition.  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 (roughly 6*n_col + 4*n_row).  An additional n_col space is the
-    minimal amount of "elbow room", and nnz/5 more space is recommended for
-    run time efficiency.
-
-    Alen is approximately 2.2*nnz + 7*n_col + 4*n_row + 10.
-
-    This function is not needed when using symamd.
-*/
-
-/* add two values of type size_t, and check for integer overflow */
-static size_t t_add (size_t a, size_t b, int *ok)
-{
-    (*ok) = (*ok) && ((a + b) >= MAX (a,b)) ;
-    return ((*ok) ? (a + b) : 0) ;
-}
-
-/* compute a*k where k is a small integer, and check for integer overflow */
-static size_t t_mult (size_t a, size_t k, int *ok)
-{
-    size_t i, s = 0 ;
-    for (i = 0 ; i < k ; i++)
-    {
-	s = t_add (s, a, ok) ;
-    }
-    return (s) ;
-}
-
-/* size of the Col and Row structures */
-#define COLAMD_C(n_col,ok) \
-    ((t_mult (t_add (n_col, 1, ok), sizeof (Colamd_Col), ok) / sizeof (Int)))
-
-#define COLAMD_R(n_row,ok) \
-    ((t_mult (t_add (n_row, 1, ok), sizeof (Colamd_Row), ok) / sizeof (Int)))
-
-
-PUBLIC size_t 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 */
-)
-{
-    size_t s, c, r ;
-    int ok = TRUE ;
-    if (nnz < 0 || n_row < 0 || n_col < 0)
-    {
-	return (0) ;
-    }
-    s = t_mult (nnz, 2, &ok) ;	    /* 2*nnz */
-    c = COLAMD_C (n_col, &ok) ;	    /* size of column structures */
-    r = COLAMD_R (n_row, &ok) ;	    /* size of row structures */
-    s = t_add (s, c, &ok) ;
-    s = t_add (s, r, &ok) ;
-    s = t_add (s, n_col, &ok) ;	    /* elbow room */
-    s = t_add (s, nnz/5, &ok) ;	    /* elbow room */
-    ok = ok && (s < Int_MAX) ;
-    return (ok ? s : 0) ;
-}
-
-
-/* ========================================================================== */
-/* === colamd_set_defaults ================================================== */
-/* ========================================================================== */
-
-/*
-    The colamd_set_defaults routine sets the default values of the user-
-    controllable parameters for colamd and symamd:
-
-	Colamd: rows with more than max (16, knobs [0] * sqrt (n_col))
-	entries are removed prior to ordering.  Columns with more than
-	max (16, knobs [1] * sqrt (MIN (n_row,n_col))) entries are removed
-	prior to ordering, and placed last in the output column ordering. 
-
-	Symamd: Rows and columns with more than max (16, knobs [0] * sqrt (n))
-	entries are removed prior to ordering, and placed last in the
-	output ordering.
-
-	knobs [0]	dense row control
-
-	knobs [1]	dense column control
-
-	knobs [2]	if nonzero, do aggresive absorption
-
-	knobs [3..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] = 10 ;
-    knobs [COLAMD_DENSE_COL] = 10 ;
-    knobs [COLAMD_AGGRESSIVE] = TRUE ;	/* default: do aggressive absorption*/
-}
-
-
-/* ========================================================================== */
-/* === symamd =============================================================== */
-/* ========================================================================== */
-
-PUBLIC Int SYMAMD_MAIN			/* 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 */
-    size_t 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 */
-
-#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 ;
-	}
-    }
-
-    /* v2.4: removed free(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 = %g\n",
-    	n_row, n, mnz, (double) Mlen)) ;
-
-    if (!M)
-    {
-	stats [COLAMD_STATUS] = COLAMD_ERROR_out_of_memory ;
-	(*release) ((void *) count) ;
-	(*release) ((void *) mark) ;
-	DEBUG0 (("symamd: allocate M (size %g) failed\n", (double) 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 ;
-		}
-	    }
-	}
-	/* v2.4: free(mark) moved below */
-    }
-
-    /* count and mark no longer needed */
-    (*release) ((void *) count) ;
-    (*release) ((void *) mark) ;	/* v2.4: free (mark) moved here */
-    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 ;
-    cknobs [COLAMD_DENSE_COL] = knobs [COLAMD_DENSE_ROW] ;
-
-    /* === Order the columns of M =========================================== */
-
-    /* v2.4: colamd cannot fail here, so the error check is removed */
-    (void) COLAMD_MAIN (n_row, n, (Int) Mlen, M, perm, cknobs, stats) ;
-
-    /* Note that the output permutation is now in perm */
-
-    /* === get the statistics for symamd from colamd ======================== */
-
-    /* a dense column in colamd means a dense row and col in symamd */
-    stats [COLAMD_DENSE_ROW] = stats [COLAMD_DENSE_COL] ;
-
-    /* === 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_MAIN		/* 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 */
-    size_t Row_size ;		/* size of Row [], in integers */
-    size_t Col_size ;		/* size of Col [], in integers */
-    size_t 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 */
-    Int aggressive ;		/* do aggressive absorption */
-    int ok ;
-
-#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 ;
-    }
-
-    aggressive = (knobs [COLAMD_AGGRESSIVE] != FALSE) ;
-
-    /* === Allocate the Row and Col arrays from array A ===================== */
-
-    ok = TRUE ;
-    Col_size = COLAMD_C (n_col, &ok) ;	    /* size of Col array of structs */
-    Row_size = COLAMD_R (n_row, &ok) ;	    /* size of Row array of structs */
-
-    /* need = 2*nnz + n_col + Col_size + Row_size ; */
-    need = t_mult (nnz, 2, &ok) ;
-    need = t_add (need, n_col, &ok) ;
-    need = t_add (need, Col_size, &ok) ;
-    need = t_add (need, Row_size, &ok) ;
-
-    if (!ok || need > (size_t) Alen || need > Int_MAX)
-    {
-	/* 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, aggressive) ;
-
-    /* === 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 ==================================================== */
-
-    /* Note: if knobs contains a NaN, this is undefined: */
-    if (knobs [COLAMD_DENSE_ROW] < 0)
-    {
-	/* only remove completely dense rows */
-	dense_row_count = n_col-1 ;
-    }
-    else
-    {
-	dense_row_count = DENSE_DEGREE (knobs [COLAMD_DENSE_ROW], n_col) ;
-    }
-    if (knobs [COLAMD_DENSE_COL] < 0)
-    {
-	/* only remove completely dense columns */
-	dense_col_count = n_row-1 ;
-    }
-    else
-    {
-	dense_col_count =
-	    DENSE_DEGREE (knobs [COLAMD_DENSE_COL], MIN (n_row, n_col)) ;
-    }
-
-    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) */
-    Int aggressive
-)
-{
-    /* === 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 <limits.h> */
-    tag_mark = clear_mark (0, max_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)) ;
-
-	/* 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) ;
-	DEBUG3 (("Pivot col: %d thick %d\n", pivot_col, pivot_col_thickness)) ;
-
-	/* === 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 (0, max_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_ALIVE (row))
-	    {
-		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 && aggressive)
-		{
-		    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))
-		{
-		    DEBUG4 ((" Row %d, dead\n", row)) ;
-		    continue ;
-		}
-		DEBUG4 ((" Row %d, set diff %d\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: %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 (((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) ;
-
-	/* === Clear mark =================================================== */
-
-	tag_mark = clear_mark (tag_mark+max_deg+1, max_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]) ;
-	    ASSERT (Row [pivot_row].length > 0) ;
-	    Row [pivot_row].shared1.degree = pivot_row_degree ;
-	    Row [pivot_row].shared2.mark = 0 ;
-	    /* pivot row is no longer dead */
-
-	    DEBUG1 (("Resurrect Pivot_row %d deg: %d\n",
-			pivot_row, pivot_row_degree)) ;
-	}
-    }
-
-    /* === 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_DEAD (r) || (Row [r].length == 0))
-	{
-	    /* This row is already dead, or is of zero length.  Cannot compact
-	     * a row of zero length, so kill it.  NOTE: in the current version,
-	     * there are no zero-length live rows.  Kill the row (for the first
-	     * time, or again) just to be safe. */
-	    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)) ;
-	    ASSERT (Row [r].length > 0) ;
-	    /* 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]) ;
-	    ASSERT (Row [r].length > 0) ;
-#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 tag_mark,	/* new value of tag_mark */
-    Int max_mark,	/* max allowed value of tag_mark */
-
-    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 ;
-
-    if (tag_mark <= 0 || tag_mark >= max_mark)
-    {
-	for (r = 0 ; r < n_row ; r++)
-	{
-	    if (ROW_IS_ALIVE (r))
-	    {
-		Row [r].shared2.mark = 0 ;
-	    }
-	}
-	tag_mark = 1 ;
-    }
-
-    return (tag_mark) ;
-}
-
-
-/* ========================================================================== */
-/* === print_report ========================================================= */
-/* ========================================================================== */
-
-PRIVATE void print_report
-(
-    char *method,
-    Int stats [COLAMD_STATS]
-)
-{
-
-    Int i1, i2, i3 ;
-
-    SUITESPARSE_PRINTF (("\n%s version %d.%d, %s: ", method,
-            COLAMD_MAIN_VERSION, COLAMD_SUB_VERSION, COLAMD_DATE)) ;
-
-    if (!stats)
-    {
-        SUITESPARSE_PRINTF (("No statistics available.\n")) ;
-	return ;
-    }
-
-    i1 = stats [COLAMD_INFO1] ;
-    i2 = stats [COLAMD_INFO2] ;
-    i3 = stats [COLAMD_INFO3] ;
-
-    if (stats [COLAMD_STATUS] >= 0)
-    {
-        SUITESPARSE_PRINTF (("OK.  ")) ;
-    }
-    else
-    {
-        SUITESPARSE_PRINTF (("ERROR.  ")) ;
-    }
-
-    switch (stats [COLAMD_STATUS])
-    {
-
-	case COLAMD_OK_BUT_JUMBLED:
-
-            SUITESPARSE_PRINTF((
-                    "Matrix has unsorted or duplicate row indices.\n")) ;
-
-            SUITESPARSE_PRINTF((
-                    "%s: number of duplicate or out-of-order row indices: %d\n",
-                    method, i3)) ;
-
-            SUITESPARSE_PRINTF((
-                    "%s: last seen duplicate or out-of-order row index:   %d\n",
-                    method, INDEX (i2))) ;
-
-            SUITESPARSE_PRINTF((
-                    "%s: last seen in column:                             %d",
-                    method, INDEX (i1))) ;
-
-	    /* no break - fall through to next case instead */
-
-	case COLAMD_OK:
-
-            SUITESPARSE_PRINTF(("\n")) ;
-
-            SUITESPARSE_PRINTF((
-                    "%s: number of dense or empty rows ignored:           %d\n",
-                    method, stats [COLAMD_DENSE_ROW])) ;
-
-            SUITESPARSE_PRINTF((
-                    "%s: number of dense or empty columns ignored:        %d\n",
-                    method, stats [COLAMD_DENSE_COL])) ;
-
-            SUITESPARSE_PRINTF((
-                    "%s: number of garbage collections performed:         %d\n",
-                    method, stats [COLAMD_DEFRAG_COUNT])) ;
-	    break ;
-
-	case COLAMD_ERROR_A_not_present:
-
-	    SUITESPARSE_PRINTF((
-                    "Array A (row indices of matrix) not present.\n")) ;
-	    break ;
-
-	case COLAMD_ERROR_p_not_present:
-
-            SUITESPARSE_PRINTF((
-                    "Array p (column pointers for matrix) not present.\n")) ;
-	    break ;
-
-	case COLAMD_ERROR_nrow_negative:
-
-            SUITESPARSE_PRINTF(("Invalid number of rows (%d).\n", i1)) ;
-	    break ;
-
-	case COLAMD_ERROR_ncol_negative:
-
-            SUITESPARSE_PRINTF(("Invalid number of columns (%d).\n", i1)) ;
-	    break ;
-
-	case COLAMD_ERROR_nnz_negative:
-
-            SUITESPARSE_PRINTF((
-                    "Invalid number of nonzero entries (%d).\n", i1)) ;
-	    break ;
-
-	case COLAMD_ERROR_p0_nonzero:
-
-            SUITESPARSE_PRINTF((
-                    "Invalid column pointer, p [0] = %d, must be zero.\n", i1));
-	    break ;
-
-	case COLAMD_ERROR_A_too_small:
-
-            SUITESPARSE_PRINTF(("Array A too small.\n")) ;
-            SUITESPARSE_PRINTF((
-                    "        Need Alen >= %d, but given only Alen = %d.\n",
-                    i1, i2)) ;
-	    break ;
-
-	case COLAMD_ERROR_col_length_negative:
-
-            SUITESPARSE_PRINTF
-            (("Column %d has a negative number of nonzero entries (%d).\n",
-            INDEX (i1), i2)) ;
-	    break ;
-
-	case COLAMD_ERROR_row_index_out_of_bounds:
-
-            SUITESPARSE_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:
-
-            SUITESPARSE_PRINTF(("Out of memory.\n")) ;
-	    break ;
-
-	/* v2.4: internal-error case deleted */
-    }
-}
-
-
-
-
-/* ========================================================================== */
-/* === 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
-)
-{
-    FILE *f ;
-    colamd_debug = 0 ;		/* no debug printing */
-    f = fopen ("debug", "r") ;
-    if (f == (FILE *) NULL)
-    {
-	colamd_debug = 0 ;
-    }
-    else
-    {
-	fscanf (f, "%d", &colamd_debug) ;
-	fclose (f) ;
-    }
-    DEBUG0 (("%s: debug version, D = %d (THIS WILL BE SLOW!)\n",
-    	method, colamd_debug)) ;
-}
-
-#endif /* NDEBUG */
diff --git a/src/C/SuiteSparse/COLAMD/Source/colamd_global.c b/src/C/SuiteSparse/COLAMD/Source/colamd_global.c
deleted file mode 100644
index 9bf3ce2..0000000
--- a/src/C/SuiteSparse/COLAMD/Source/colamd_global.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* ========================================================================== */
-/* === colamd_global.c ====================================================== */
-/* ========================================================================== */
-
-/* ----------------------------------------------------------------------------
- * COLAMD, Copyright (C) 2007, Timothy A. Davis.
- * See License.txt for the Version 2.1 of the GNU Lesser General Public License
- * http://www.suitesparse.com
- * -------------------------------------------------------------------------- */
-
-/* Global variables for COLAMD : colamd_printf replaced with
-    a function in SuiteSparse_config. */
diff --git a/src/C/SuiteSparse/ChangeLog b/src/C/SuiteSparse/ChangeLog
deleted file mode 100644
index 463620f..0000000
--- a/src/C/SuiteSparse/ChangeLog
+++ /dev/null
@@ -1,505 +0,0 @@
-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
-        string was left at '4' (it should have been '5', for CHOLMOD 3.0.5).
-        This version of SuiteSparse corrects this glitch.
-    * Minor changes to comments in SuiteSparse_config.
-    * SPQR version 2.0.1 released (minor update to documentation)
-
-Jan 19, 2015: SuiteSparse version 4.4.3
-
-    * CHOLMOD 3.0.5: minor bug fix to MatrixOps/cholmod_symmetry
-
-Jan 7, 2015: SuiteSparse version 4.4.2
-
-    * CHOLMOD 3.0.4: serious bug fix in supernodal factorization,
-	introduced in CHOLMOD 3.0.0 (SuiteSparse 4.3.0).  Can cause segfault,
-	and has no user workaround.
-
-Oct 23, 2014: SuiteSparse version 4.4.1
-    Minor update:  two bug fixes (affecting Windows only)
-
-    * CHOLMOD 3.0.3:
-        minor update to CHOLMOD (non-ANSI C usage in one *.c file, affects
-        Windows only)
-    * KLU 1.3.2:
-        minor fix to MATLAB install; no change to C except version nubmer
-
-
-Oct 10, 2014: SuiteSparse version 4.4.0
-    MAJOR UPDATE:  new GPU-acceleration for SPQR
-
-    * AMD 2.4.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * BTF 1.2.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * CAMD 2.4.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * CCOLAMD 2.9.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * CHOLMOD 3.0.2:
-        update to accomodate GPU-accelerated SPQR
-        added CHOLMOD/Include/cholmod_function.h
-    * COLAMD 2.9.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * CSparse 3.1.4:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * CXSparse 3.1.4:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * GPUQREngine 1.0.0:
-        FIRST RELEASE.  Used by SPQR 2.0.0
-    * KLU 1.3.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-        update to KLU/Tcov/Makefile
-    * LDL 2.2.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * RBio 2.2.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * SPQR 2.0.0:
-        MAJOR UPDATE.  added GPU support.  Up to 11x faster than on CPU
-    * SuiteSparse_GPURuntime 1.0.0:
-        FIRST RELEASE.  Used by SPQR 2.0.0
-    * UMFPACK 5.7.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * MATLAB_Tools:
-        modified SSMULT/ssmult_install.m.  No change to C code
-
-
-July 18, 2014: SuiteSparse version 4.3.1
-    Minor update:  added cholmod_rowfac_mask2 function to CHOLMOD
-
-    * CHOLMOD 3.0.1:
-        added cholmod_rowfac_mask2 function.  Minor fix to build process
-    * SPQR 1.3.3:
-        minor fix to build process
-
-
-March 26, 2014: SuiteSparse version 4.3.0
-    MAJOR UPDATE: first release of CHOLMOD GPU acceleration
-    minor update: modified all packages to use SuiteSparse_config for
-        malloc/calloc/realloc/free, printf, hypot, and divcomplex
-        function pointers.
-
-    * AMD 2.4.0:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * CAMD 2.4.0:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * CCOLAMD 2.9.0:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * CHOLMOD 3.0.0:
-        MAJOR UPDATE to GPU acceleration.  Released at GTC 2014.
-    * COLAMD 2.9.0:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * CSparse 3.1.3:
-        minor update to UFget
-    * CXSparse 3.1.3:
-        minor update to UFget
-    * KLU 1.3.0:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * LDL 2.2.0:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * RBio 2.2.0:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * SPQR 1.3.2:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * UMFPACK 5.7.0:
-        changed malloc/printf pointers to use SuiteSparse_config
-    * MATLAB_Tools:
-        added stats to UFcollection, revised commends in SFMULT,
-        minor update to spok
-
-
-April 25, 2013: SuiteSparse version 4.2.1
-    minor update
-
-    * CHOLMOD 2.1.2:
-        minor update to Cholesky/*solve*c (for Windows compiler)
-    * UMFPACK 5.6.2:
-        bug fix in Demo/Makefile for Fortran interface
-    * MATLAB_Tools:
-        minor update to sparseinv
-
-
-April 16, 2013: SuiteSparse version 4.2.0
-    minor update and bug fix
-
-    * CHOLMOD 2.1.1:
-        minor changes to GPU accelerated version, fixed GPU memory leak
-    * CSparse 3.1.2:
-        minor update to cs_sqr.c; no affect on functionality
-    * CXSparse 3.1.2:
-        minor update to cs_sqr.c; no affect on functionality
-
-March 27, 2013: SuiteSparse version 4.1.0
-    new features added to CHOLMOD
-
-    * CHOLMOD 2.1.0:
-        added new features and functions to forward/backsolve:
-        cholmod_lsolve_pattern, cholmod_solve2, cholmod_ensure_dense.
-    * MATLAB_Tools:
-        added SFMULT.  minor update to Factorize, problems added to dimacs10
-
-July 17, 2012: SuiteSparse version 4.0.2
-    major update to MATLAB_Tools/Factorize.  No change to any C code.
-
-    * MATLAB_Tools:
-        major update to Factorize, minor update to sparseinv
-
-
-June 20, 2012: SuiteSparse version 4.0.1
-
-    * AMD 2.3.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * CAMD 2.3.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * CHOLMOD 2.0.1:
-        bug fix for GPU code, when the matrix is singular
-        minor fix to MATLAB install
-    * CSparse 3.1.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * CXSparse 3.1.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * KLU 1.2.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * RBio 2.1.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * SPQR 1.3.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * UMFPACK 5.6.1:
-        minor fix to MATLAB install; no change to C except version nubmer
-    * MATLAB_Tools:
-        update to UFcollection (filesep) 
-
-
-June 1, 2012: SuiteSparse version 4.0.0
-    MAJOR UPDATE: First GPU version for CHOLMOD.
-    UFconfig renamed to SuiteSparse_config.
-
-    * AMD 2.3.0:
-        replaced UFconfig with SuiteSparse_config
-    * BTF 1.2.0:
-        replaced UFconfig with SuiteSparse_config
-    * CAMD 2.3.0:
-        replaced UFconfig with SuiteSparse_config
-    * CCOLAMD 2.8.0:
-        replaced UFconfig with SuiteSparse_config
-    * CHOLMOD 2.0.0:
-        replaced UFconfig with SuiteSparse_config
-        first GPU-accelerated version.
-    * COLAMD 2.8.0:
-        replaced UFconfig with SuiteSparse_config
-    * CSparse 3.1.0:
-        minor changes to enable creation of CXSparse 3.1.0
-    * CXSparse 3.1.0:
-        replaced UFconfig with SuiteSparse_config
-    * KLU 1.2.0:
-        replaced UFconfig with SuiteSparse_config
-    * LDL 2.1.0:
-        replaced UFconfig with SuiteSparse_config
-    * RBio 2.1.0:
-        replaced UFconfig with SuiteSparse_config
-    * SPQR 1.3.0:
-        replaced UFconfig with SuiteSparse_config
-        removed spqr_time; using SuiteSparse timing routines instead
-    * UMFPACK 5.6.0:
-        replaced UFconfig with SuiteSparse_config
-    * MATLAB_Tools:
-        update to documentation for Factorize, update to UFcollection
-
-May 15, 2012: SuiteSparse version 3.7.1
-    minor update
-
-    * AMD 2.2.4:
-        minor compiler workaround
-    * CAMD 2.2.4:
-        minor compiler workaround
-    * KLU 1.1.4:
-        bug fix in the case of Int overflow
-    * MATLAB_Tools:
-        minor update to spqr_rank and UFcollection
-
-Dec 15, 2011: SuiteSparse version 3.7.0
-    MAJOR UPDATE: added spqr_rank and sparseinv to MATLAB_Tools
-    major update to Factorize package in MATLAB_Tools
-    minor update to Makefiles for C code.
-
-    * AMD 2.2.3:
-        Makefile updated
-    * BTF 1.1.3:
-        Makefile updated
-    * CAMD 2.2.3:
-        Makefile updated
-    * CCOLAMD 2.7.4:
-        Makefile updated
-    * CHOLMOD 1.7.4:
-        Makefile updated
-    * COLAMD 2.7.4:
-        Makefile updated
-    * CSparse 3.0.2:
-        Makefile updated.  Fix to MATLAB install.  Now as CSparse (not CSparse3)
-    * KLU 1.1.3:
-        Makefile updated.  minor fix to MATLAB mexFunction
-    * LDL 2.0.4:
-        Makefile updated.  Update to demo program
-    * RBio 2.0.2:
-        Makefile updated.  Update to MATLAB mexFunction
-    * SPQR 1.2.3
-        Makefile updated.  Update to MATLAB install
-    * UMFPACK 5.5.2:
-        Makefile updated.  Update to MATLAB install
-    * MATLAB_Tools:
-        added spqr_rank and sparseinv.  Major update to Factorize, dimacs10
-
-
-
-May 10, 2011: SuiteSparse version 3.6.1
-    minor update
-
-    * SPQR 1.2.2:
-        minor fix, compiler workaround
-    * CSparse 3.0.1:
-        Added as the CSparse3 directory (original date Jan 19, 2010;
-        added to SuiteSparse on May 10, 2011.  Note that CSparse v2.x.x.
-        was also distributed)
-    * MATLAB_Tools:
-        added dimacs10.  Minor update to spok.
-
-
-Jan 25, 2011: SuiteSparse version 3.6.0
-    minor update
-
-    * AMD 2.2.2:
-        Makefile updated.
-    * BTF 1.1.2:
-        Makefile updated.
-    * CAMD 2.2.2:
-        Makefile updated.
-    * CCOLAMD 2.7.3:
-        Makefile updated.  Minor fix to stats printout
-    * CHOLMOD 1.7.3:
-        Makefile updated.  Minor fix, compiler workaround
-    * COLAMD 2.7.3:
-        Makefile updated
-    * CSparse 2.2.5:
-        Makefile updated.  minor fixes to UFget, cs_util.c.
-    * KLU 1.1.2:
-        Makefile updated.  ported Tcov to Mac.
-    * LDL 2.0.3:
-        Makefile updated.
-    * RBio 2.0.1:
-        Makefile updated.
-    * SPQR 1.2.1:
-        Makefile updated.  Added examples.  Fixed error handling.
-    * UMFPACK 5.5.1:
-        Makefile updated.
-    * MATLAB_Tools:
-        minor update to spok
-
-Nov 30, 2009: SuiteSparse version 3.5.0
-    major update to SPQR and RBio; minor updates to Makefiles.
-
-    * AMD 2.2.1:
-        Makefile updated.
-    * BTF 1.1.1
-        Makefile updated.
-    * CAMD 2.2.1:
-        Makefile updated.
-    * CCOLAMD 2.7.2:
-        Makefile updated.
-    * CHOLMOD 1.7.2:
-        Makefile updated.  Fixed 64-bit BLAS for MATLAB 7.8.
-    * COLAMD 2.7.2:
-        Makefile updated.
-    * CSparse 2.2.4
-        Makefile updated.  MATLAB install updated.
-    * KLU 1.1.1:
-        Makefile updated.
-    * LDL 2.0.2:
-        Makefile updated.
-    * RBio 2.0.0:
-        major update: rewritten in C.  No longer in Fortran.
-        Makefile updated.
-    * SPQR 1.2.0:
-        major update: added features required by MATLAB package spqr_rank,
-        changed default ordering to COLAMD.
-        Makefile updated.
-    * UMFPACK 5.5.0:
-        major update.  Added user-ordering function, interface to CHOLMOD
-        orderings, option to disable singleton search to allow L to be
-        well-conditioned.
-        Makefile updated.
-    * MATLAB_Tools:
-        major update to Factorize.  Minor updates to GEE, getversion, spok.
-
-
-May 20, 2009: SuiteSparse version 3.4.0
-    MAJOR UPDATE: added Factorize package to MATLAB_TOols
-    major update to UMFPACK (removed 2-by-2 strategy)
-
-    * RBio 1.1.2:
-        update to MATLAB install
-    * SPQR 1.1.2:
-        added more examples.  Mac compiler workaround.
-    * UMFPACK 5.4.0:
-        removed 2-by-2 strategy.  update to MATLAB install.
-    * MATLAB_Tools:
-        added Factorize
-
-
-March 24, 2009: SuiteSparse version 3.3.0
-    minor update
-
-    * BTF 1.1.0:
-        minor update.
-    * CHOLMOD 1.7.1:
-        bug fix for cholmod_symmetry
-    * CSparse 2.2.3:
-        cs_gaxpy example fixed.  Minor change to MATLAB cs_sparse interface
-    * CXSparse 2.2.3:
-        cs_gaxpy example fixed.  Minor change to MATLAB cs_sparse interface
-    * KLU 1.1.0:
-        minor update.
-    * SPQR 1.1.1:
-        minor update (compiler workaround)
-    * UMFPACK 5.3.0:
-        compiler workaround.  added timer options.
-        bug fix for 2-by-2 strategy (subsequently removed in v5.4.0)
-
-Sept 20, 2008: SuiteSparse version 3.2.0
-    MAJOR UPDATE: first release of SPQR
-
-    * CHOLMOD 1.7.0:
-        major update for SPQR.
-    * CXSparse 2.2.2:
-        update to MATLAB install
-    * CSparse 2.2.2:
-        update to MATLAB install
-    * SPQR 1.1.0:
-        FIRST RELEASE in SuiteSparse.
-    * MATLAB_TOOLS:
-        added: GEE, find_components, spok
-
-Nov 1, 2007: SuiteSparse version 3.1.0
-    minor update
-
-    * BTF 1.0.1:
-        minor update.
-    * CCOLAMD 2.7.1:
-        minor changes to MATLAB test code.
-    * CHOLMOD 1.6.0:
-        bug fix to cholmod_symmetry.  Performance fix for cholmod_nesdis.
-        port to MATLAB 7.5 and many minor changes in MATLAB interface.
-    * COLAMD 2.7.1:
-        minor changes to MATLAB test code.
-    * CSparse 2.2.1:
-        minor update.
-    * CXSparse 2.2.1:
-    * KLU 1.0.1:
-        minor lint cleanup.
-    * RBio 1.1.1:
-        minor lint cleanup.
-        minor update.
-    * UMFPACK 5.2.0:
-        change of license from LGPL to GPL.  minor lint cleanup.
-        port to MATLAB 7.5.
-    * MATLAB_Tools:
-        added: LINFACTOR, MESHND, SSMULT, getversion, gipper, hprintf,
-            pagerankdemo, shellgui, and waitmex
-
-May 31, 2007: SuiteSparse version 3.0.0
-    MAJOR UPDATE: first stable release of KLU and BTF
-    other packages ported to 64-bit MATLAB.
-
-    * AMD 2.2.0:
-        port to 64-bit MATLAB.  minor changes in printing.
-    * BTF 1.0.0:
-        FIRST STABLE RELEASE
-    * CAMD 2.2.0:
-        port to 64-bit MATLAB.  minor changes in printing.
-    * CCOLAMD 2.7.0:
-        port to 64-bit MATLAB.  restructured directories
-    * CHOLMOD 1.5.0:
-        port to 64-bit MATLAB.  update to Makefile.
-        bug fix for BLAS int, update to cholmod_updown.
-    * COLAMD 2.7.0:
-        port to 64-bit MATLAB.  restructured directories
-    * CSparse 2.2.0:
-        update to MATLAB interface.  restructured directories
-    * LDL 2.0.0:
-        major update:  added 64bit version, restructured directories
-    * RBio 1.1.0:
-        port to 64-bit MATLAB.
-    * UMFPACK 5.1.0:
-        port to 64-bit MATLAB.  minor changes in printing.
-
-Dec 13, 2006: SuiteSparse version 2.4.0
-    minor update
-
-    * AMD 2.0.4:
-        minor MATLAB cleanup
-    * CAMD 2.1.2:
-        minor MATLAB cleanup
-    * CCOLAMD 2.5.2
-        minor MATLAB cleanup
-    * CHOLMOD 1.4.0:
-        added support for large files.  Renamed MATLAB interface to cholmod2.
-        minor MATLAB cleanup.
-    * COLAMD 2.5.2:
-        minor MATLAB cleanup
-    * CSparse 2.0.7:
-        minor MATLAB cleanup
-    * CXSparse 2.0.7:
-        minor MATLAB cleanup
-    * LDL 1.3.4:
-        minor MATLAB cleanup
-    * UMFPACK 5.0.3:
-        minor MATLAB cleanup
-
-Dec 7, 2006: SuiteSparse version 2.3.1
-    minor update
-
-    * CSparse 2.0.6:
-        update to UFget
-    * CXSparse 2.0.6:
-        update to UFget
-
-Dec 2, 2006: SuiteSparse version 2.3.0
-    MAJOR UPDATE
-
-    * CHOLMOD 1.3.0:
-        major update to file IO functions, added cholmod_symmetry,
-        minor fix to cholmod_analyze_odering and cholmod_dense.c.
-    * MATLAB_Tools:
-        added UFcollection
-
-Sept 11, 2006: SuiteSparse version 2.1.1
-
-    * AMD 2.0.1:
-        minor update
-    * CAMD 2.1.1:
-        minor update
-    * CHOLMOD 1.2.0:
-        performance improvements.  Added ordering options to MATLAB interface
-    * COLAMD 2.5.1:
-        minor update
-    * CCOLAMD 2.5.1:
-        minor update
-    * CSparse 2.0.2:
-        minor update to MATLAB interface
-    * CXSparse 2.0.2:
-        minor update to MATLAB interface
-    * LDL 1.3.1:
-        minor update to MATLAB interface
-    * UMFPACK 5.0.1:
-        minor update
-
diff --git a/src/C/SuiteSparse/Contents.m b/src/C/SuiteSparse/Contents.m
deleted file mode 100644
index 8d2902b..0000000
--- a/src/C/SuiteSparse/Contents.m
+++ /dev/null
@@ -1,149 +0,0 @@
-% Welcome to SuiteSparse : a Suite of Sparse matrix packages, containing a
-% collection of sparse matrix packages authored or co-authored by Tim Davis.
-% Only the primary MATLAB functions are listed below.
-%
-% Example:
-%   SuiteSparse_install
-% compiles and installs all of SuiteSparse, and runs several demos and tests.
-%
-%-------------------------------------------------------------------------------
-% Ordering methods:
-%-------------------------------------------------------------------------------
-%
-%   amd2         - approximate minimum degree ordering.
-%   colamd2      - column approximate minimum degree ordering.
-%   symamd2      - symmetrix approximate min degree ordering based on colamd.
-%   camd         - constrained amd.
-%   ccolamd      - constrained colamd.
-%   csymamd      - constrained symamd.
-%
-%-------------------------------------------------------------------------------
-% CHOLMOD: a sparse supernodal Cholesky update/downdate package:
-%-------------------------------------------------------------------------------
-%
-%   cholmod2     - computes x=A\b when A is symmetric and positive definite.
-%   chol2        - same as MATLAB chol(sparse(A)), just faster.
-%   lchol        - computes an LL' factorization.
-%   ldlchol      - computes an LDL' factorization.
-%   ldlupdate    - updates an LDL' factorization.
-%   resymbol     - recomputes symbolic LL or LDL' factorization.
-%   ldlsolve     - solves Ax=b using an LDL' factorization.
-%   ldlsplit     - splits LD into L and D.
-%   metis        - interface to METIS node-nested-dissection.
-%   nesdis       - interface to CHOLMOD's nested-dissection (based on METIS).
-%   septree      - prune a separator tree.
-%   bisect       - interface to METIS' node bisector.
-%   analyze      - order and analyze using CHOLMOD.
-%   etree2       - same as MATLAB "etree", just faster and more reliable.
-%   sparse2      - same as MATLAB "sparse", just faster.
-%   symbfact2    - same as MATLAB "symbfact", just faster and more reliable.
-%   sdmult       - same as MATLAB S*F or S'*F (S sparse, F full), just faster.
-%   ldl_normest  - compute error in LDL' factorization.
-%   lu_normest   - compute error in LU factorization.
-%   mread        - read a sparse matrix in Matrix Market format
-%   mwrite       - write a sparse matrix in Matrix Market format
-%   spsym        - determine the symmetry of a sparse matrix
-%
-%-------------------------------------------------------------------------------
-% CSPARSE / CXSPARSE: a Concise Sparse matrix package:
-%-------------------------------------------------------------------------------
-%
-%   Matrices used in CSparse must in general be either sparse and real, or
-%   dense vectors.  Ordering methods can accept any sparse matrix.  CXSparse
-%   supports complex matrices and 64-bit MATLAB; it is installed by default.
-%
-%   cs_add       - sparse matrix addition.
-%   cs_amd       - approximate minimum degree ordering.
-%   cs_chol      - sparse Cholesky factorization.
-%   cs_cholsol   - solve A*x=b using a sparse Cholesky factorization.
-%   cs_counts    - column counts for sparse Cholesky factor L.
-%   cs_dmperm    - maximum matching or Dulmage-Mendelsohn permutation.
-%   cs_dmsol     - x=A\b using the coarse Dulmage-Mendelsohn decomposition.
-%   cs_dmspy     - plot the Dulmage-Mendelsohn decomposition of a matrix.
-%   cs_droptol   - remove small entries from a sparse matrix.
-%   cs_esep      - find an edge separator of a symmetric matrix A
-%   cs_etree     - elimination tree of A or A'*A.
-%   cs_gaxpy     - sparse matrix times vector.
-%   cs_lsolve    - solve a sparse lower triangular system L*x=b.
-%   cs_ltsolve   - solve a sparse upper triangular system L'*x=b.
-%   cs_lu        - sparse LU factorization, with fill-reducing ordering.
-%   cs_lusol     - solve Ax=b using LU factorization.
-%   cs_make      - compiles CSparse for use in MATLAB.
-%   cs_multiply  - sparse matrix multiply.
-%   cs_nd        - generalized nested dissection ordering.
-%   cs_nsep      - find a node separator of a symmetric matrix A.
-%   cs_permute   - permute a sparse matrix.
-%   cs_print     - print the contents of a sparse matrix.
-%   cs_qr        - sparse QR factorization.
-%   cs_qleft     - apply Householder vectors on the left.
-%   cs_qright    - apply Householder vectors on the right.
-%   cs_qrsol     - solve a sparse least-squares problem.
-%   cs_randperm  - random permutation.
-%   cs_sep       - convert an edge separator into a node separator.
-%   cs_scc       - strongly-connected components of a square sparse matrix.
-%   cs_scc2      - cs_scc, or connected components of a bipartite graph.
-%   cs_sparse    - convert a triplet form into a sparse matrix.
-%   cs_sqr       - symbolic sparse QR factorization.
-%   cs_symperm   - symmetric permutation of a symmetric matrix.
-%   cs_transpose - transpose a sparse matrix.
-%   cs_updown    - rank-1 update/downdate of a sparse Cholesky factorization.
-%   cs_usolve    - solve a sparse upper triangular system U*x=b.
-%   cs_utsolve   - solve a sparse lower triangular system U'*x=b.
-%   cspy         - plot a sparse matrix in color.
-%   ccspy        - plot the connected components of a matrix.
-%
-%-------------------------------------------------------------------------------
-% LDL: Sparse LDL factorization:
-%-------------------------------------------------------------------------------
-% 
-%   ldlsparse   - LDL' factorization of a real, sparse, symmetric matrix.
-%   ldlrow      - an m-file description of the algorithm used by LDL.
-%
-%-------------------------------------------------------------------------------
-% UMFPACK: the Unsymmetric MultiFrontal Package:
-%-------------------------------------------------------------------------------
-%
-%   umfpack2          - computes x=A\b, x=A/b, or lu (A) for a sparse matrix A
-%   umfpack_details   - details on all the options for using umfpack in MATLAB
-%   umfpack_report    - prints optional control settings and statistics
-%   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
-%                       (duplicate of CHOLMOD/lu_normest, for completeness)
-%   luflop            - given L and U, computes # of flops required
-%
-%-------------------------------------------------------------------------------
-% SuiteSparseQR: multifrontal rank-revealing sparse QR
-%-------------------------------------------------------------------------------
-%
-%   spqr            - sparse QR
-%   spqr_solve      - x=A\b using SuiteSparseQR
-%   spqr_qmult      - y=Q*x, Q'*x, x*Q, or x*Q' using Q in Householder form
-%
-%-------------------------------------------------------------------------------
-% Other packages:
-%-------------------------------------------------------------------------------
-%
-%   MATLAB_Tools    various MATLAB tools, most in M, some as C mexFunctions:
-%
-%       ssmult          sparse matrix times sparse matrix
-%       meshnd          nested dissection of regular 2D and 3D meshes
-%       linfactor       solve Ax=b using LU or CHOL
-%       dimacs10        MATLAB interface for the DIMACS10 collection
-%       factorize       object-oriented system solver
-%       sparseinv       sparse inverse subset
-%       spqr_rank       toolbox for sparse rank-deficient matrices
-%
-%   UFcollection    for managing the UF Sparse Matrix Collection
-%   RBio            for reading/writing Rutherford/Boeing sparse matrices
-%   UFget           MATLAB interface to the UF Sparse Matrix Collection,
-%                   located in C*Sparse*/MATLAB
-%
-%-------------------------------------------------------------------------------
-%
-% For help on compiling SuiteSparse or the demos, testing functions, etc.,
-% please see the help for each individual package.
-%
-% Copyright 2014, Timothy A. Davis, http://www.suitesparse.com.
-
-help SuiteSparse
diff --git a/src/C/SuiteSparse/Makefile b/src/C/SuiteSparse/Makefile
deleted file mode 100644
index e47f792..0000000
--- a/src/C/SuiteSparse/Makefile
+++ /dev/null
@@ -1,184 +0,0 @@
-#-------------------------------------------------------------------------------
-# Makefile for all SuiteSparse packages
-#-------------------------------------------------------------------------------
-
-include SuiteSparse_config/SuiteSparse_config.mk
-
-# Compile the default rules for each package
-default:
-	( cd SuiteSparse_config/xerbla && $(MAKE) )
-	( cd SuiteSparse_config && $(MAKE) )
-	- ( cd metis-4.0 && $(MAKE) )
-	( cd AMD && $(MAKE) )
-	( cd CAMD && $(MAKE) )
-	( cd COLAMD && $(MAKE) )
-	( cd BTF && $(MAKE) )
-	( cd KLU && $(MAKE) )
-	( cd LDL && $(MAKE) )
-	( cd CCOLAMD && $(MAKE) )
-	( cd UMFPACK && $(MAKE) )
-	( cd CHOLMOD && $(MAKE) )
-	( cd CSparse && $(MAKE) )
-	( cd CXSparse && $(MAKE) )
-	( cd RBio && $(MAKE) )
-ifneq ($(GPU_CONFIG),)
-	( cd SuiteSparse_GPURuntime && $(MAKE) )
-	( cd GPUQREngine && $(MAKE) )
-endif
-	( cd SPQR && $(MAKE) )
-#	( cd PIRO_BAND && $(MAKE) )
-#	( cd SKYLINE_SVD && $(MAKE) )
-
-# install all packages in /usr/local/lib and /usr/local/include
-# (note that CSparse is not installed; CXSparse is installed instead)
-install:
-	( cd SuiteSparse_config && $(MAKE) install )
-	( cd AMD && $(MAKE) install )
-	( cd CAMD && $(MAKE) install )
-	( cd COLAMD && $(MAKE) install )
-	( cd BTF && $(MAKE) install )
-	( cd KLU && $(MAKE) install )
-	( cd LDL && $(MAKE) install )
-	( cd CCOLAMD && $(MAKE) install )
-	( cd UMFPACK && $(MAKE) install )
-	( cd CHOLMOD && $(MAKE) install )
-	( cd CXSparse && $(MAKE) install )
-	( cd RBio && $(MAKE) install )
-ifneq ($(GPU_CONFIG),)
-	( cd SuiteSparse_GPURuntime && $(MAKE) install )
-	( cd GPUQREngine && $(MAKE) install )
-endif
-	( cd SPQR && $(MAKE) install )
-#	( cd PIRO_BAND && $(MAKE) install )
-#	( cd SKYLINE_SVD && $(MAKE) install )
-
-# uninstall all packages
-uninstall:
-	( cd SuiteSparse_config && $(MAKE) uninstall )
-	( cd AMD && $(MAKE) uninstall )
-	( cd CAMD && $(MAKE) uninstall )
-	( cd COLAMD && $(MAKE) uninstall )
-	( cd BTF && $(MAKE) uninstall )
-	( cd KLU && $(MAKE) uninstall )
-	( cd LDL && $(MAKE) uninstall )
-	( cd CCOLAMD && $(MAKE) uninstall )
-	( cd UMFPACK && $(MAKE) uninstall )
-	( cd CHOLMOD && $(MAKE) uninstall )
-	( cd CXSparse && $(MAKE) uninstall )
-	( cd RBio && $(MAKE) uninstall )
-	( cd SuiteSparse_GPURuntime && $(MAKE) uninstall )
-	( cd GPUQREngine && $(MAKE) uninstall )
-	( cd SPQR && $(MAKE) uninstall )
-#	( cd PIRO_BAND && $(MAKE) uninstall )
-#	( cd SKYLINE_SVD && $(MAKE) uninstall )
-
-library:
-	( cd SuiteSparse_config/xerbla && $(MAKE) )
-	( cd SuiteSparse_config && $(MAKE) )
-	- ( cd metis-4.0 && $(MAKE) )
-	( cd AMD && $(MAKE) library )
-	( cd BTF && $(MAKE) library )
-	( cd CAMD && $(MAKE) library )
-	( cd CCOLAMD && $(MAKE) library )
-	( cd COLAMD && $(MAKE) library )
-	( cd CHOLMOD && $(MAKE) library )
-	( cd KLU && $(MAKE) library )
-	( cd LDL && $(MAKE) library )
-	( cd UMFPACK && $(MAKE) library )
-	( cd CSparse && $(MAKE) library )
-	( cd CXSparse && $(MAKE) library )
-	( cd RBio && $(MAKE) library )
-ifneq ($(GPU_CONFIG),)
-	( cd SuiteSparse_GPURuntime && $(MAKE) library )
-	( cd GPUQREngine && $(MAKE) library )
-endif
-	( cd SPQR && $(MAKE) library )
-#	( cd PIRO_BAND && $(MAKE) library )
-#	( cd SKYLINE_SVD && $(MAKE) library )
-
-# Remove all files not in the original distribution
-purge:
-	- ( cd SuiteSparse_config/xerbla && $(MAKE) purge )
-	- ( cd SuiteSparse_config && $(MAKE) purge )
-	- ( cd metis-4.0 && $(MAKE) realclean )
-	- ( cd AMD && $(MAKE) purge )
-	- ( cd CAMD && $(MAKE) purge )
-	- ( cd COLAMD && $(MAKE) purge )
-	- ( cd BTF && $(MAKE) purge )
-	- ( cd KLU && $(MAKE) purge )
-	- ( cd LDL && $(MAKE) purge )
-	- ( cd CCOLAMD && $(MAKE) purge )
-	- ( cd UMFPACK && $(MAKE) purge )
-	- ( cd CHOLMOD && $(MAKE) purge )
-	- ( cd CSparse && $(MAKE) purge )
-	- ( cd CXSparse && $(MAKE) purge )
-	- ( cd RBio && $(MAKE) purge )
-	- ( cd MATLAB_Tools/UFcollection && $(RM) *.mex* )
-	- ( cd MATLAB_Tools/SSMULT && $(RM) *.mex* )
-	- ( cd SuiteSparse_GPURuntime && $(MAKE) purge )
-	- ( cd GPUQREngine && $(MAKE) purge )
-	- ( cd SPQR && $(MAKE) purge )
-#	- ( cd PIRO_BAND && $(MAKE) purge )
-#	- ( cd SKYLINE_SVD && $(MAKE) purge )
-	- $(RM) MATLAB_Tools/*/*.mex* MATLAB_Tools/spok/private/*.mex*
-
-# Remove all files not in the original distribution, but keep the libraries
-clean:
-	- ( cd SuiteSparse_config/xerbla && $(MAKE) clean )
-	- ( cd SuiteSparse_config && $(MAKE) clean )
-	- ( cd metis-4.0 && $(MAKE) clean )
-	- ( cd AMD && $(MAKE) clean )
-	- ( cd CAMD && $(MAKE) clean )
-	- ( cd COLAMD && $(MAKE) clean )
-	- ( cd BTF && $(MAKE) clean )
-	- ( cd KLU && $(MAKE) clean )
-	- ( cd LDL && $(MAKE) clean )
-	- ( cd CCOLAMD && $(MAKE) clean )
-	- ( cd UMFPACK && $(MAKE) clean )
-	- ( cd CHOLMOD && $(MAKE) clean )
-	- ( cd CSparse && $(MAKE) clean )
-	- ( cd CXSparse && $(MAKE) clean )
-	- ( cd RBio && $(MAKE) clean )
-	- ( cd SuiteSparse_GPURuntime && $(MAKE) clean )
-	- ( cd GPUQREngine && $(MAKE) clean )
-	- ( cd SPQR && $(MAKE) clean )
-#	- ( cd PIRO_BAND && $(MAKE) clean )
-#	- ( cd SKYLINE_SVD && $(MAKE) clean )
-
-# Create the PDF documentation
-docs:
-	( cd AMD && $(MAKE) docs )
-	( cd CAMD && $(MAKE) docs )
-	( cd KLU && $(MAKE) docs )
-	( cd LDL && $(MAKE) docs )
-	( cd UMFPACK && $(MAKE) docs )
-	( cd CHOLMOD && $(MAKE) docs )
-	( cd SPQR && $(MAKE) docs )
-#	( cd PIRO_BAND && $(MAKE) docs )
-#	( cd SKYLINE_SVD && $(MAKE) docs )
-
-distclean: purge
-
-# Create CXSparse from CSparse
-# Note that the CXSparse directory should initially not exist.
-cx:
-	( cd CSparse ; $(MAKE) purge )
-	( cd CXSparse_newfiles ; tar cfv - * | gzip -9 > ../CXSparse_newfiles.tar.gz )
-	./CSparse_to_CXSparse CSparse CXSparse CXSparse_newfiles.tar.gz
-	( cd CXSparse/Demo ; $(MAKE) )
-	( cd CXSparse/Demo ; $(MAKE) > cs_demo.out )
-	( cd CXSparse ; $(MAKE) purge )
-	$(RM) -f CXSparse_newfiles.tar.gz
-
-# statement coverage (Linux only); this requires a lot of time.
-# The umfpack tcov requires a lot of disk space
-cov:
-	( cd CXSparse && $(MAKE) cov )
-	( cd CSparse && $(MAKE) cov )
-	( cd KLU && $(MAKE) cov )
-	( cd CHOLMOD && $(MAKE) cov )
-	( cd SPQR && $(MAKE) cov )
-	( cd UMFPACK && $(MAKE) cov )
-#	( cd PIRO_BAND && $(MAKE) cov )
-#	( cd SKYLINE_SVD && $(MAKE) cov )
-
diff --git a/src/C/SuiteSparse/README.txt b/src/C/SuiteSparse/README.txt
deleted file mode 100644
index d3256c3..0000000
--- a/src/C/SuiteSparse/README.txt
+++ /dev/null
@@ -1,159 +0,0 @@
-SuiteSparse:  A Suite of Sparse matrix packages at http://www.suitesparse.com
-
-July 13, 2015.  SuiteSparse VERSION 4.4.5
-
-------------------
-SuiteSparse/README
-------------------
-
-================================================================================
-QUICK START FOR MATLAB USERS (Linux, Mac, or Windows):  uncompress the
-SuiteSparse.zip or SuiteSparse.tar.gz archive file (they contain the same
-thing), then in the MATLAB Command Window, cd to the SuiteSparse directory and
-type SuiteSparse_install.  All packages will be compiled, and several demos
-will be run.
-
-QUICK START FOR LINUX:  Just type 'make' in this directory.  Then do
-'sudo make install' if you want to install the libraries and include files
-in /usr/local.
-
-QUICK START FOR MAC:  Delete the SuiteSparse_config/SuiteSparse_config.mk
-file, and then remove "_Mac" from the *Mac.mk file in that directory.  Then
-continue as the 'QUICK START FOR LINUX' above.
-
-QUICK START FOR GPU:  Delete the SuiteSparse_config/SuiteSparse_config.mk
-file, and then remove "_GPU" from the *GPU.mk file in that directory.
-Locate and modify CUDA library and include paths in the *.mk file.
-Then continue as the 'QUICK START FOR LINUX' above.
-================================================================================
-
-
-    spqr_rank   MATLAB toolbox for rank deficient sparse matrices: null spaces,
-                reliable factorizations, etc.  With Leslie Foster, San Jose
-                State Univ.
-
-    AMD         approximate minimum degree ordering
-
-    CAMD        constrained approximate minimum degree ordering
-
-    COLAMD      column approximate minimum degree ordering
-
-    CCOLAMD     constrained column approximate minimum degree ordering
-
-    BTF         permutation to block triangular form
-
-    KLU         sparse LU factorization, primarily for circuit simulation.
-                Requires AMD, COLAMD, and BTF.  Optionally uses CHOLMOD,
-                CAMD, CCOLAMD, and METIS.
-
-    UMFPACK     sparse LU factorization.  Requires AMD and the BLAS.
-
-    CHOLMOD     sparse Cholesky factorization.  Requires AMD, COLAMD, CCOLAMD,
-                the BLAS, and LAPACK.  Optionally uses METIS.
-
-    SuiteSparse_config    configuration file for all the above packages.  The
-                SuiteSparse_config/SuiteSparse_config.mk is included in the
-                Makefile's of all packages.  CSparse and MATLAB_Tools do not
-                use SuiteSparse_config.  Prior to SuiteSparse Version 4.0.0,
-                this configuration directory was called 'UFconfig'.
-                Version 4.0.0 and later use SuiteSparse_config instead,
-                which is upward compatible with UFconfig.
-
-    CSparse     a concise sparse matrix package, developed for my
-                book, "Direct Methods for Sparse Linear Systems",
-                published by SIAM.  Intended primarily for teaching.
-
-    CXSparse    CSparse Extended.  Includes support for complex matrices
-                and both int or long integers.  Use this instead of CSparse
-                for production use.
-
-    RBio        read/write sparse matrices in Rutherford/Boeing format
-
-    UFcollection    toolbox for managing the UF Sparse Matrix Collection
-
-    LPDASA      LP dual active set algorithm (to appear)
-
-    MESHND      2D and 3D mesh generation and nested dissection ordering
-
-    SSMULT      sparse matrix multiply for MATLAB
-
-    LINFACTOR   simple m-file demonstrating how to use LU and CHOL in
-                MATLAB to solve Ax=b
-
-    MATLAB_Tools    various simple m-files for use in MATLAB
-
-    SPQR        sparse QR factorization
-    GPUQREngine                 GPU support package for SPQR
-    SuiteSparse_GPURuntime      GPU support package for SPQR
-
-Some codes optionally use METIS 4.0.1
-(http://www-users.cs.umn.edu/~karypis/metis).  To use METIS, place a copy of
-the metis-4.0 directory in the same directory containing this README file.
-Be sure that you do not have a nested metis-4.0/metis-4.0 directory; SuiteSparse
-won't find METIS if you do this, which can happen with a zip file of metis-4.0
-on Windows.  The use of METIS will improve the ordering quality.
-
-Refer to each package for license, copyright, and author information.  All
-codes are authored or co-authored by Timothy A. Davis.
-email: DrTimothyAldenDavis at gmail.com
-
-================================================================================
-If you use SuiteSparse_install in MATLAB, stop reading here.
-================================================================================
-
-
-
-----------------------------
-To use "make" in Unix/Linux:
-----------------------------
-
-(1) Use the right BLAS and LAPACK libraries
-
-    Edit your SuiteSparse_config/SuiteSparse_config.mk file to point to the
-    right compilers, and to the correct BLAS and LAPACK libraries.  There are
-    many examples of different computer architectures there.  Scroll through to
-    find yours, and uncomment those lines.
-
-(2) Install Intel's Threading Building Blocks (TBB)
-
-    This is optionally used by SuiteSparseQR.  Refer to the User Guide in 
-    SuiteSparse/SPQR/Doc/spqr_user_guide.pdf for details.
-
-(3) Configure METIS (or don't use METIS)
-
-    If you don't download METIS, skip this step.  Otherwise,
-    cd to metis-4.0 and edit the Makefile.in file.  I recommend making these
-    changes to metis-4.0/Makefile.in, but this is optional.
-
-        CC = gcc
-        OPTFLAGS = -O3
-
-(4) Make other changes to SuiteSparse_config/SuiteSparse_config.mk as needed
-
-    Edit the SuiteSparse_config/SuiteSparse_config.mk file as needed.
-    Directions are in that file.  If you have compiled SuiteSparse already
-    (partially or completely), then whenever you edit the
-    SuiteSparse_config/SuiteSparse_config.mk file, you should then type "make
-    purge" (or "make realclean") in this directory.
-
-(5) Type "make" in this directory.  All packages will be be compiled.  METIS
-    will be compiled if you have it.  Several demos will be run.
-
-    To compile just the libraries, without running any demos, use
-    "make library".
-
-    The libraries will appear in */Lib/*.a.  Include files, as needed by user
-    programs that use CHOLMOD, AMD, CAMD, COLAMD, CCOLAMD, BTF, KLU, UMFPACK,
-    LDL, etc. are in */Include/*.h.
-
-    The METIS library is in metis-4.0/libmetis.a.  METIS Include files (not
-    needed by the end user of SuiteSparse) are in located in metis-4.0/Lib/*.h.
-
-(6) To install, type "sudo make install".  This will place copies of all
-    libraries in /usr/local/lib, and all include files in /usr/local/include.
-    You can change the install location by editting SuiteSparse_config.mk.
-    These directories must already exist.
-
-(7) To uninstall, type "sudo make uninstall", which reverses "make install"
-    by removing the SuiteSparse libraries from /usr/local/lib, and the
-    include files from /usr/local/include.
diff --git a/src/C/SuiteSparse/README_cvxopt b/src/C/SuiteSparse/README_cvxopt
deleted file mode 100644
index 05b3c49..0000000
--- a/src/C/SuiteSparse/README_cvxopt
+++ /dev/null
@@ -1,34 +0,0 @@
-This is version 4.4.5 of the SuiteSparse package 
-from www.suitesparse.com with the following files 
-and directories removed.
-
-AMD/Demo
-AMD/MATLAB
-BTF 
-CAMD
-CCOLAMD 
-CHOLMOD/Demo
-CHOLMOD/MATLAB
-CHOLMOD/Modify
-CHOLMOD/Partition
-CHOLMOD/Tcov
-CHOLMOD/Valgrind
-COLAMD/MATLAB
-CSparse
-Csparse_to_CXsparse
-CXSparse
-CXSparse_newfiles
-GPUQREngine
-KLU
-LDL
-MATLAB_Tools
-RBio
-SPQR
-SuiteSparse_demo.m
-SuiteSparse_GPURuntime
-SuiteSparse_install.m
-SuiteSparse_test.m
-UFget
-UMFPACK/Demo
-UMFPACK/MATLAB
-UMFPACK/Tcov
diff --git a/src/C/SuiteSparse/SuiteSparse_config/Makefile b/src/C/SuiteSparse/SuiteSparse_config/Makefile
deleted file mode 100644
index 895bce9..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-#-------------------------------------------------------------------------------
-# SuiteSparse_config Makefile
-#-------------------------------------------------------------------------------
-
-VERSION = 4.4.5
-
-default: ccode
-
-include SuiteSparse_config.mk
-
-ccode: libsuitesparseconfig.a
-
-all: libsuitesparseconfig.a
-
-library: libsuitesparseconfig.a
-
-libsuitesparseconfig.a: SuiteSparse_config.c SuiteSparse_config.h
-	$(CC) $(CF) -c SuiteSparse_config.c
-	$(ARCHIVE) libsuitesparseconfig.a SuiteSparse_config.o
-	$(RANLIB) libsuitesparseconfig.a
-	- $(RM) SuiteSparse_config.o
-
-distclean: purge
-
-purge: clean
-	- $(RM) *.o *.a
-
-clean:
-	- $(RM) -r $(CLEAN)
-
-# install SuiteSparse_config
-install:
-	$(CP) libsuitesparseconfig.a $(INSTALL_LIB)/libsuitesparseconfig.$(VERSION).a
-	( cd $(INSTALL_LIB) ; ln -sf libsuitesparseconfig.$(VERSION).a libsuitesparseconfig.a )
-	$(CP) SuiteSparse_config.h $(INSTALL_INCLUDE)
-	chmod 644 $(INSTALL_LIB)/libsuitesparseconfig*.a
-	chmod 644 $(INSTALL_INCLUDE)/SuiteSparse_config.h
-
-# uninstall SuiteSparse_config
-uninstall:
-	$(RM) $(INSTALL_LIB)/libsuitesparseconfig*.a
-	$(RM) $(INSTALL_INCLUDE)/SuiteSparse_config.h
-
-dif:
-	- diff SuiteSparse_config.mk SuiteSparse_config_linux.mk
-	- diff SuiteSparse_config_linux.mk SuiteSparse_config_GPU_gcc.mk
-	- diff SuiteSparse_config_GPU_gcc.mk SuiteSparse_config_GPU_icc.mk
-	- diff SuiteSparse_config_GPU_icc.mk SuiteSparse_config_GPU_icc10.mk
diff --git a/src/C/SuiteSparse/SuiteSparse_config/README.txt b/src/C/SuiteSparse/SuiteSparse_config/README.txt
deleted file mode 100644
index 38202d4..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/README.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-SuiteSparse_config, 2015, Timothy A. Davis, http://www.suitesparse.com
-(formerly the UFconfig package)
-
-This directory contains a default SuiteSparse_config.mk file, which
-in the original distribution is the same as SuiteSparse_config_linux.mk.
-The various config file versions are:
-
-    SuiteSparse_config_GPU_icc.mk   for GPU with the Intel compiler
-    SuiteSparse_config_GPU_icc10.mk ditto, but for 10 cores
-    SuiteSparse_config_GPU_gcc.mk   for GPU with the gcc compiler
-    SuiteSparse_config_linux.mk     for linux, no GPU
-    SuiteSparse_config_Mac.mk       for Mac
-    SuiteSparse_config.mk           the actual one in use
-
-To use a GPU for CHOLMOD and SPQR, using gcc, do this:
-
-    cp SuiteSparse_config_GPU_gcc.mk SuiteSparse_config.mk
-
-To use a GPU for CHOLMOD and SPQR, using icc and the Intel MKL, do this:
-
-    cp SuiteSparse_config_GPU_icc.mk SuiteSparse_config.mk
-
-To compile SuiteSparse for the Mac, do this:
-
-    cp SuiteSparse_config_Mac.mk SuiteSparse_config.mk
-
-To use a GPU for CHOLMOD and SPQR, using icc and the Intel MKL,
-and for a system with 10 cores, do this
-
-    cp SuiteSparse_config_GPU_icc10.mk SuiteSparse_config.mk
-
-For other alternatives, see the comments in the SuiteSparse_config.mk file.
-
---------------------------------------------------------------------------------
-
-SuiteSparse_config contains configuration settings for all many of the software
-packages that I develop or co-author.  Note that older versions of some of
-these packages do not require SuiteSparse_config.
-
-  Package  Description
-  -------  -----------
-  AMD      approximate minimum degree ordering
-  CAMD     constrained AMD
-  COLAMD   column approximate minimum degree ordering
-  CCOLAMD  constrained approximate minimum degree ordering
-  UMFPACK  sparse LU factorization, with the BLAS
-  CXSparse int/long/real/complex version of CSparse
-  CHOLMOD  sparse Cholesky factorization, update/downdate
-  KLU      sparse LU factorization, BLAS-free
-  BTF      permutation to block triangular form
-  LDL      concise sparse LDL'
-  LPDASA   LP Dual Active Set Algorithm
-  RBio     read/write files in Rutherford/Boeing format
-  SPQR     sparse QR factorization (full name: SuiteSparseQR)
-
-SuiteSparse_config is not required by these packages:
-
-  CSparse       a Concise Sparse matrix package
-  MATLAB_Tools  toolboxes for use in MATLAB
-
-In addition, the xerbla/ directory contains Fortan and C versions of the
-BLAS/LAPACK xerbla routine, which is called when an invalid input is passed to
-the BLAS or LAPACK.  The xerbla provided here does not print any message, so
-the entire Fortran I/O library does not need to be linked into a C application.
-Most versions of the BLAS contain xerbla, but those from K. Goto do not.  Use
-this if you need too.
-
-If you edit this directory (SuiteSparse_config.mk in particular) then you
-must do "make purge ; make" in the parent directory to recompile all of
-SuiteSparse.  Otherwise, the changes will not necessarily be applied.
-
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.c b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.c
deleted file mode 100644
index 0d5dbaf..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.c
+++ /dev/null
@@ -1,531 +0,0 @@
-/* ========================================================================== */
-/* === SuiteSparse_config =================================================== */
-/* ========================================================================== */
-
-/* SuiteSparse configuration : memory manager and printf functions. */
-
-/* Copyright (c) 2013, Timothy A. Davis.  No licensing restrictions
- * apply to this file or to the SuiteSparse_config directory.
- * Author: Timothy A. Davis.
- */
-
-#include <math.h>
-#include <stdlib.h>
-
-#ifndef NPRINT
-#include <stdio.h>
-#endif
-
-#ifdef MATLAB_MEX_FILE
-#include "mex.h"
-#include "matrix.h"
-#endif
-
-#ifndef NULL
-#define NULL ((void *) 0)
-#endif
-
-#include "SuiteSparse_config.h"
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_config : a global extern struct */
-/* -------------------------------------------------------------------------- */
-
-/* The SuiteSparse_config struct is available to all SuiteSparse functions and
-    to all applications that use those functions.  It must be modified with
-    care, particularly in a multithreaded context.  Normally, the application
-    will initialize this object once, via SuiteSparse_start, possibily followed
-    by application-specific modifications if the applications wants to use
-    alternative memory manager functions.
-
-    The user can redefine these global pointers at run-time to change the
-    memory manager and printf function used by SuiteSparse.
-
-    If -DNMALLOC is defined at compile-time, then no memory-manager is
-    specified.  You must define them at run-time, after calling
-    SuiteSparse_start.
-
-    If -DPRINT is defined a compile time, then printf is disabled, and
-    SuiteSparse will not use printf.
- */
-
-struct SuiteSparse_config_struct SuiteSparse_config =
-{
-
-    /* memory management functions */
-    #ifndef NMALLOC
-        #ifdef MATLAB_MEX_FILE
-            /* MATLAB mexFunction: */
-            mxMalloc, mxCalloc, mxRealloc, mxFree,
-        #else
-            /* standard ANSI C: */
-            malloc, calloc, realloc, free,
-        #endif
-    #else
-        /* no memory manager defined; you must define one at run-time: */
-        NULL, NULL, NULL, NULL,
-    #endif
-
-    /* printf function */
-    #ifndef NPRINT
-        #ifdef MATLAB_MEX_FILE
-            /* MATLAB mexFunction: */
-            mexPrintf,
-        #else
-            /* standard ANSI C: */
-            printf,
-        #endif
-    #else
-        /* printf is disabled */
-        NULL,
-    #endif
-
-    SuiteSparse_hypot,
-    SuiteSparse_divcomplex
-
-} ;
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_start */
-/* -------------------------------------------------------------------------- */
-
-/* All applications that use SuiteSparse should call SuiteSparse_start prior
-   to using any SuiteSparse function.  Only a single thread should call this
-   function, in a multithreaded application.  Currently, this function is
-   optional, since all this function currently does is to set the four memory
-   function pointers to NULL (which tells SuiteSparse to use the default
-   functions).  In a multi- threaded application, only a single thread should
-   call this function.
-
-   Future releases of SuiteSparse might enforce a requirement that
-   SuiteSparse_start be called prior to calling any SuiteSparse function.
- */
-
-void SuiteSparse_start ( void )
-{
-
-    /* memory management functions */
-    #ifndef NMALLOC
-        #ifdef MATLAB_MEX_FILE
-            /* MATLAB mexFunction: */
-            SuiteSparse_config.malloc_func  = mxMalloc ;
-            SuiteSparse_config.calloc_func  = mxCalloc ;
-            SuiteSparse_config.realloc_func = mxRealloc ;
-            SuiteSparse_config.free_func    = mxFree ;
-        #else
-            /* standard ANSI C: */
-            SuiteSparse_config.malloc_func  = malloc ;
-            SuiteSparse_config.calloc_func  = calloc ;
-            SuiteSparse_config.realloc_func = realloc ;
-            SuiteSparse_config.free_func    = free ;
-        #endif
-    #else
-        /* no memory manager defined; you must define one after calling
-           SuiteSparse_start */
-        SuiteSparse_config.malloc_func  = NULL ;
-        SuiteSparse_config.calloc_func  = NULL ;
-        SuiteSparse_config.realloc_func = NULL ;
-        SuiteSparse_config.free_func    = NULL ;
-    #endif
-
-    /* printf function */
-    #ifndef NPRINT
-        #ifdef MATLAB_MEX_FILE
-            /* MATLAB mexFunction: */
-            SuiteSparse_config.printf_func = mexPrintf ;
-        #else
-            /* standard ANSI C: */
-            SuiteSparse_config.printf_func = printf ;
-        #endif
-    #else
-        /* printf is disabled */
-        SuiteSparse_config.printf_func = NULL ;
-    #endif
-
-    /* math functions */
-    SuiteSparse_config.hypot_func = SuiteSparse_hypot ;
-    SuiteSparse_config.divcomplex_func = SuiteSparse_divcomplex ;
-}
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_finish */
-/* -------------------------------------------------------------------------- */
-
-/* This currently does nothing, but in the future, applications should call
-   SuiteSparse_start before calling any SuiteSparse function, and then
-   SuiteSparse_finish after calling the last SuiteSparse function, just before
-   exiting.  In a multithreaded application, only a single thread should call
-   this function.
-
-   Future releases of SuiteSparse might use this function for any
-   SuiteSparse-wide cleanup operations or finalization of statistics.
- */
-
-void SuiteSparse_finish ( void )
-{
-    /* do nothing */ ;
-}
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_malloc: malloc wrapper */
-/* -------------------------------------------------------------------------- */
-
-void *SuiteSparse_malloc    /* pointer to allocated block of memory */
-(
-    size_t nitems,          /* number of items to malloc */
-    size_t size_of_item     /* sizeof each item */
-)
-{
-    void *p ;
-    size_t size ;
-    if (nitems < 1) nitems = 1 ;
-    if (size_of_item < 1) size_of_item = 1 ;
-    size = nitems * size_of_item  ;
-
-    if (size != ((double) nitems) * size_of_item)
-    {
-        /* size_t overflow */
-        p = NULL ;
-    }
-    else
-    {
-        p = (void *) (SuiteSparse_config.malloc_func) (size) ;
-    }
-    return (p) ;
-}
-
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_calloc: calloc wrapper */
-/* -------------------------------------------------------------------------- */
-
-void *SuiteSparse_calloc    /* pointer to allocated block of memory */
-(
-    size_t nitems,          /* number of items to calloc */
-    size_t size_of_item     /* sizeof each item */
-)
-{
-    void *p ;
-    size_t size ;
-    if (nitems < 1) nitems = 1 ;
-    if (size_of_item < 1) size_of_item = 1 ;
-    size = nitems * size_of_item  ;
-
-    if (size != ((double) nitems) * size_of_item)
-    {
-        /* size_t overflow */
-        p = NULL ;
-    }
-    else
-    {
-        p = (void *) (SuiteSparse_config.calloc_func) (nitems, size_of_item) ;
-    }
-    return (p) ;
-}
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_realloc: realloc wrapper */
-/* -------------------------------------------------------------------------- */
-
-/* If p is non-NULL on input, it points to a previously allocated object of
-   size nitems_old * size_of_item.  The object is reallocated to be of size
-   nitems_new * size_of_item.  If p is NULL on input, then a new object of that
-   size is allocated.  On success, a pointer to the new object is returned,
-   and ok is returned as 1.  If the allocation fails, ok is set to 0 and a
-   pointer to the old (unmodified) object is returned.
- */
-
-void *SuiteSparse_realloc   /* pointer to reallocated block of memory, or
-                               to original block if the realloc failed. */
-(
-    size_t nitems_new,      /* new number of items in the object */
-    size_t nitems_old,      /* old number of items in the object */
-    size_t size_of_item,    /* sizeof each item */
-    void *p,                /* old object to reallocate */
-    int *ok                 /* 1 if successful, 0 otherwise */
-)
-{
-    size_t size ;
-    if (nitems_old < 1) nitems_old = 1 ;
-    if (nitems_new < 1) nitems_new = 1 ;
-    if (size_of_item < 1) size_of_item = 1 ;
-    size = nitems_new * size_of_item  ;
-
-    if (size != ((double) nitems_new) * size_of_item)
-    {
-        /* size_t overflow */
-        (*ok) = 0 ;
-    }
-    else if (p == NULL)
-    {
-        /* a fresh object is being allocated */
-        p = SuiteSparse_malloc (nitems_new, size_of_item) ;
-        (*ok) = (p != NULL) ;
-    }
-    else if (nitems_old == nitems_new)
-    {
-        /* the object does not change; do nothing */
-        (*ok) = 1 ;
-    }
-    else
-    {
-        /* change the size of the object from nitems_old to nitems_new */
-        void *pnew ;
-        pnew = (void *) (SuiteSparse_config.realloc_func) (p, size) ;
-        if (pnew == NULL)
-        {
-            if (nitems_new < nitems_old)
-            {
-                /* the attempt to reduce the size of the block failed, but
-                   the old block is unchanged.  So pretend to succeed. */
-                (*ok) = 1 ;
-            }
-            else
-            {
-                /* out of memory */
-                (*ok) = 0 ;
-            }
-        }
-        else
-        {
-            /* success */
-            p = pnew ;
-            (*ok) = 1 ;
-        }
-    }
-    return (p) ;
-}
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_free: free wrapper */
-/* -------------------------------------------------------------------------- */
-
-void *SuiteSparse_free      /* always returns NULL */
-(
-    void *p                 /* block to free */
-)
-{
-    if (p)
-    {
-        (SuiteSparse_config.free_func) (p) ;
-    }
-    return (NULL) ;
-}
-
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_tic: return current wall clock time */
-/* -------------------------------------------------------------------------- */
-
-/* Returns the number of seconds (tic [0]) and nanoseconds (tic [1]) since some
- * unspecified but fixed time in the past.  If no timer is installed, zero is
- * returned.  A scalar double precision value for 'tic' could be used, but this
- * might cause loss of precision because clock_getttime returns the time from
- * some distant time in the past.  Thus, an array of size 2 is used.
- *
- * The timer is enabled by default.  To disable the timer, compile with
- * -DNTIMER.  If enabled on a POSIX C 1993 system, the timer requires linking
- * with the -lrt library.
- *
- * example:
- *
- *      double tic [2], r, s, t ;
- *      SuiteSparse_tic (tic) ;     // start the timer
- *      // do some work A
- *      t = SuiteSparse_toc (tic) ; // t is time for work A, in seconds
- *      // do some work B
- *      s = SuiteSparse_toc (tic) ; // s is time for work A and B, in seconds
- *      SuiteSparse_tic (tic) ;     // restart the timer
- *      // do some work C
- *      r = SuiteSparse_toc (tic) ; // s is time for work C, in seconds
- *
- * A double array of size 2 is used so that this routine can be more easily
- * ported to non-POSIX systems.  The caller does not rely on the POSIX
- * <time.h> include file.
- */
-
-#ifdef SUITESPARSE_TIMER_ENABLED
-
-#include <time.h>
-
-void SuiteSparse_tic
-(
-    double tic [2]      /* output, contents undefined on input */
-)
-{
-    /* POSIX C 1993 timer, requires -librt */
-    struct timespec t ;
-    clock_gettime (CLOCK_MONOTONIC, &t) ;
-    tic [0] = (double) (t.tv_sec) ;
-    tic [1] = (double) (t.tv_nsec) ;
-}
-
-#else
-
-void SuiteSparse_tic
-(
-    double tic [2]      /* output, contents undefined on input */
-)
-{
-    /* no timer installed */
-    tic [0] = 0 ;
-    tic [1] = 0 ;
-}
-
-#endif
-
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_toc: return time since last tic */
-/* -------------------------------------------------------------------------- */
-
-/* Assuming SuiteSparse_tic is accurate to the nanosecond, this function is
- * accurate down to the nanosecond for 2^53 nanoseconds since the last call to
- * SuiteSparse_tic, which is sufficient for SuiteSparse (about 104 days).  If
- * additional accuracy is required, the caller can use two calls to
- * SuiteSparse_tic and do the calculations differently.
- */
-
-double SuiteSparse_toc  /* returns time in seconds since last tic */
-(
-    double tic [2]  /* input, not modified from last call to SuiteSparse_tic */
-)
-{
-    double toc [2] ;
-    SuiteSparse_tic (toc) ;
-    return ((toc [0] - tic [0]) + 1e-9 * (toc [1] - tic [1])) ;
-}
-
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_time: return current wallclock time in seconds */
-/* -------------------------------------------------------------------------- */
-
-/* This function might not be accurate down to the nanosecond. */
-
-double SuiteSparse_time  /* returns current wall clock time in seconds */
-(
-    void
-)
-{
-    double toc [2] ;
-    SuiteSparse_tic (toc) ;
-    return (toc [0] + 1e-9 * toc [1]) ;
-}
-
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_version: return the current version of SuiteSparse */
-/* -------------------------------------------------------------------------- */
-
-int SuiteSparse_version
-(
-    int version [3]
-)
-{
-    if (version != NULL)
-    {
-        version [0] = SUITESPARSE_MAIN_VERSION ;
-        version [1] = SUITESPARSE_SUB_VERSION ;
-        version [2] = SUITESPARSE_SUBSUB_VERSION ;
-    }
-    return (SUITESPARSE_VERSION) ;
-}
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_hypot */
-/* -------------------------------------------------------------------------- */
-
-/* There is an equivalent routine called hypot in <math.h>, which conforms
- * to ANSI C99.  However, SuiteSparse does not assume that ANSI C99 is
- * available.  You can use the ANSI C99 hypot routine with:
- *
- *	#include <math.h>
- *	SuiteSparse_config.hypot_func = hypot ;
- *
- * Default value of the SuiteSparse_config.hypot_func pointer is
- * SuiteSparse_hypot, defined below.
- *
- * s = hypot (x,y) computes s = sqrt (x*x + y*y) but does so more accurately.
- * The NaN cases for the double relops x >= y and x+y == x are safely ignored.
- * 
- * Source: Algorithm 312, "Absolute value and square root of a complex number,"
- * P. Friedland, Comm. ACM, vol 10, no 10, October 1967, page 665.
- */
-
-double SuiteSparse_hypot (double x, double y)
-{
-    double s, r ;
-    x = fabs (x) ;
-    y = fabs (y) ;
-    if (x >= y)
-    {
-	if (x + y == x)
-	{
-	    s = x ;
-	}
-	else
-	{
-	    r = y / x ;
-	    s = x * sqrt (1.0 + r*r) ;
-	}
-    }
-    else
-    {
-	if (y + x == y)
-	{
-	    s = y ;
-	}
-	else
-	{
-	    r = x / y ;
-	    s = y * sqrt (1.0 + r*r) ;
-	}
-    } 
-    return (s) ;
-}
-
-/* -------------------------------------------------------------------------- */
-/* SuiteSparse_divcomplex */
-/* -------------------------------------------------------------------------- */
-
-/* c = a/b where c, a, and b are complex.  The real and imaginary parts are
- * passed as separate arguments to this routine.  The NaN case is ignored
- * for the double relop br >= bi.  Returns 1 if the denominator is zero,
- * 0 otherwise.
- *
- * This uses ACM Algo 116, by R. L. Smith, 1962, which tries to avoid
- * underflow and overflow.
- *
- * c can be the same variable as a or b.
- *
- * Default value of the SuiteSparse_config.divcomplex_func pointer is
- * SuiteSparse_divcomplex.
- */
-
-int SuiteSparse_divcomplex
-(
-    double ar, double ai,	/* real and imaginary parts of a */
-    double br, double bi,	/* real and imaginary parts of b */
-    double *cr, double *ci	/* real and imaginary parts of c */
-)
-{
-    double tr, ti, r, den ;
-    if (fabs (br) >= fabs (bi))
-    {
-	r = bi / br ;
-	den = br + r * bi ;
-	tr = (ar + ai * r) / den ;
-	ti = (ai - ar * r) / den ;
-    }
-    else
-    {
-	r = br / bi ;
-	den = r * br + bi ;
-	tr = (ar * r + ai) / den ;
-	ti = (ai * r - ar) / den ;
-    }
-    *cr = tr ;
-    *ci = ti ;
-    return (den == 0.) ;
-}
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.h b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.h
deleted file mode 100644
index 12aa75c..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.h
+++ /dev/null
@@ -1,247 +0,0 @@
-/* ========================================================================== */
-/* === SuiteSparse_config =================================================== */
-/* ========================================================================== */
-
-/* Configuration file for SuiteSparse: a Suite of Sparse matrix packages
- * (AMD, COLAMD, CCOLAMD, CAMD, CHOLMOD, UMFPACK, CXSparse, and others).
- *
- * SuiteSparse_config.h provides the definition of the long integer.  On most
- * systems, a C program can be compiled in LP64 mode, in which long's and
- * pointers are both 64-bits, and int's are 32-bits.  Windows 64, however, uses
- * the LLP64 model, in which int's and long's are 32-bits, and long long's and
- * pointers are 64-bits.
- *
- * SuiteSparse packages that include long integer versions are
- * intended for the LP64 mode.  However, as a workaround for Windows 64
- * (and perhaps other systems), the long integer can be redefined.
- *
- * If _WIN64 is defined, then the __int64 type is used instead of long.
- *
- * The long integer can also be defined at compile time.  For example, this
- * could be added to SuiteSparse_config.mk:
- *
- * CFLAGS = -O -D'SuiteSparse_long=long long' \
- *  -D'SuiteSparse_long_max=9223372036854775801' -D'SuiteSparse_long_idd="lld"'
- *
- * This file defines SuiteSparse_long as either long (on all but _WIN64) or
- * __int64 on Windows 64.  The intent is that a SuiteSparse_long is always a
- * 64-bit integer in a 64-bit code.  ptrdiff_t might be a better choice than
- * long; it is always the same size as a pointer.
- *
- * This file also defines the SUITESPARSE_VERSION and related definitions.
- *
- * Copyright (c) 2012, Timothy A. Davis.  No licensing restrictions apply
- * to this file or to the SuiteSparse_config directory.
- * Author: Timothy A. Davis.
- */
-
-#ifndef SUITESPARSE_CONFIG_H
-#define SUITESPARSE_CONFIG_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <limits.h>
-#include <stdlib.h>
-
-/* ========================================================================== */
-/* === SuiteSparse_long ===================================================== */
-/* ========================================================================== */
-
-#ifndef SuiteSparse_long
-
-#ifdef _WIN64
-
-#define SuiteSparse_long __int64
-#define SuiteSparse_long_max _I64_MAX
-#define SuiteSparse_long_idd "I64d"
-
-#else
-
-#define SuiteSparse_long long
-#define SuiteSparse_long_max LONG_MAX
-#define SuiteSparse_long_idd "ld"
-
-#endif
-#define SuiteSparse_long_id "%" SuiteSparse_long_idd
-#endif
-
-/* ========================================================================== */
-/* === SuiteSparse_config parameters and functions ========================== */
-/* ========================================================================== */
-
-/* SuiteSparse-wide parameters are placed in this struct.  It is meant to be
-   an extern, globally-accessible struct.  It is not meant to be updated
-   frequently by multiple threads.  Rather, if an application needs to modify
-   SuiteSparse_config, it should do it once at the beginning of the application,
-   before multiple threads are launched.
-
-   The intent of these function pointers is that they not be used in your
-   application directly, except to assign them to the desired user-provided
-   functions.  Rather, you should use the
- */
-
-struct SuiteSparse_config_struct
-{
-    void *(*malloc_func) (size_t) ;             /* pointer to malloc */
-    void *(*calloc_func) (size_t, size_t) ;     /* pointer to calloc */
-    void *(*realloc_func) (void *, size_t) ;    /* pointer to realloc */
-    void (*free_func) (void *) ;                /* pointer to free */
-    int (*printf_func) (const char *, ...) ;    /* pointer to printf */
-    double (*hypot_func) (double, double) ;     /* pointer to hypot */
-    int (*divcomplex_func) (double, double, double, double, double *, double *);
-} ;
-
-extern struct SuiteSparse_config_struct SuiteSparse_config ;
-
-void SuiteSparse_start ( void ) ;   /* called to start SuiteSparse */
-
-void SuiteSparse_finish ( void ) ;  /* called to finish SuiteSparse */
-
-void *SuiteSparse_malloc    /* pointer to allocated block of memory */
-(
-    size_t nitems,          /* number of items to malloc (>=1 is enforced) */
-    size_t size_of_item     /* sizeof each item */
-) ;
-
-void *SuiteSparse_calloc    /* pointer to allocated block of memory */
-(
-    size_t nitems,          /* number of items to calloc (>=1 is enforced) */
-    size_t size_of_item     /* sizeof each item */
-) ;
-
-void *SuiteSparse_realloc   /* pointer to reallocated block of memory, or
-                               to original block if the realloc failed. */
-(
-    size_t nitems_new,      /* new number of items in the object */
-    size_t nitems_old,      /* old number of items in the object */
-    size_t size_of_item,    /* sizeof each item */
-    void *p,                /* old object to reallocate */
-    int *ok                 /* 1 if successful, 0 otherwise */
-) ;
-
-void *SuiteSparse_free      /* always returns NULL */
-(
-    void *p                 /* block to free */
-) ;
-
-void SuiteSparse_tic    /* start the timer */
-(
-    double tic [2]      /* output, contents undefined on input */
-) ;
-
-double SuiteSparse_toc  /* return time in seconds since last tic */
-(
-    double tic [2]      /* input: from last call to SuiteSparse_tic */
-) ;
-
-double SuiteSparse_time  /* returns current wall clock time in seconds */
-(
-    void
-) ;
-
-/* returns sqrt (x^2 + y^2), computed reliably */
-double SuiteSparse_hypot (double x, double y) ;
-
-/* complex division of c = a/b */
-int SuiteSparse_divcomplex
-(
-    double ar, double ai,	/* real and imaginary parts of a */
-    double br, double bi,	/* real and imaginary parts of b */
-    double *cr, double *ci	/* real and imaginary parts of c */
-) ;
-
-/* determine which timer to use, if any */
-#ifndef NTIMER
-#ifdef _POSIX_C_SOURCE
-#if    _POSIX_C_SOURCE >= 199309L
-#define SUITESPARSE_TIMER_ENABLED
-#endif
-#endif
-#endif
-
-/* SuiteSparse printf macro */
-#define SUITESPARSE_PRINTF(params) \
-{ \
-    if (SuiteSparse_config.printf_func != NULL) \
-    { \
-        (void) (SuiteSparse_config.printf_func) params ; \
-    } \
-}
-
-/* ========================================================================== */
-/* === SuiteSparse version ================================================== */
-/* ========================================================================== */
-
-/* SuiteSparse is not a package itself, but a collection of packages, some of
- * which must be used together (UMFPACK requires AMD, CHOLMOD requires AMD,
- * COLAMD, CAMD, and CCOLAMD, etc).  A version number is provided here for the
- * collection itself.  The versions of packages within each version of
- * SuiteSparse are meant to work together.  Combining one package from one
- * version of SuiteSparse, with another package from another version of
- * SuiteSparse, may or may not work.
- *
- * SuiteSparse contains the following packages:
- *
- *  SuiteSparse_config version 4.4.1 (version always the same as SuiteSparse)
- *  AMD             version 2.4.1
- *  BTF             version 1.2.1
- *  CAMD            version 2.4.1
- *  CCOLAMD         version 2.9.1
- *  CHOLMOD         version 3.0.6
- *  COLAMD          version 2.9.1
- *  CSparse         version 3.1.4
- *  CXSparse        version 3.1.4
- *  KLU             version 1.3.3
- *  LDL             version 2.2.1
- *  RBio            version 2.2.1
- *  SPQR            version 2.0.1
- *  GPUQREngine     version 1.0.0
- *  SuiteSparse_GPURuntime  version 1.0.0
- *  UMFPACK         version 5.7.1
- *  MATLAB_Tools    various packages & M-files
- *
- * Other package dependencies:
- *  BLAS            required by CHOLMOD and UMFPACK
- *  LAPACK          required by CHOLMOD
- *  METIS 4.0.1     required by CHOLMOD (optional) and KLU (optional)
- *  CUBLAS, CUDART  NVIDIA libraries required by CHOLMOD and SPQR when
- *                  they are compiled with GPU acceleration.
- */
-
-
-int SuiteSparse_version     /* returns SUITESPARSE_VERSION */
-(
-    /* output, not defined on input.  Not used if NULL.  Returns
-       the three version codes in version [0..2]:
-       version [0] is SUITESPARSE_MAIN_VERSION
-       version [1] is SUITESPARSE_SUB_VERSION
-       version [2] is SUITESPARSE_SUBSUB_VERSION
-       */
-    int version [3]
-) ;
-
-/* Versions prior to 4.2.0 do not have the above function.  The following
-   code fragment will work with any version of SuiteSparse:
-
-   #ifdef SUITESPARSE_HAS_VERSION_FUNCTION
-   v = SuiteSparse_version (NULL) ;
-   #else
-   v = SUITESPARSE_VERSION ;
-   #endif
-*/
-#define SUITESPARSE_HAS_VERSION_FUNCTION
-
-#define SUITESPARSE_DATE "July 14, 2015"
-#define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub))
-#define SUITESPARSE_MAIN_VERSION 4
-#define SUITESPARSE_SUB_VERSION 4
-#define SUITESPARSE_SUBSUB_VERSION 5
-#define SUITESPARSE_VERSION \
-    SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION)
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk
deleted file mode 100644
index 3ab813c..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config.mk
+++ /dev/null
@@ -1,452 +0,0 @@
-#===============================================================================
-# SuiteSparse_config.mk:  common configuration file for the SuiteSparse
-#===============================================================================
-
-# This file contains all configuration settings for all packages authored or
-# co-authored by Tim Davis:
-#
-# Package Version       Description
-# ------- -------       -----------
-# AMD     1.2 or later  approximate minimum degree ordering
-# COLAMD  2.4 or later  column approximate minimum degree ordering
-# CCOLAMD 1.0 or later  constrained column approximate minimum degree ordering
-# CAMD    any           constrained approximate minimum degree ordering
-# UMFPACK 4.5 or later  sparse LU factorization, with the BLAS
-# CHOLMOD any           sparse Cholesky factorization, update/downdate
-# KLU     0.8 or later  sparse LU factorization, BLAS-free
-# BTF     0.8 or later  permutation to block triangular form
-# LDL     1.2 or later  concise sparse LDL'
-# CXSparse any          extended version of CSparse (int/long, real/complex)
-# SuiteSparseQR any     sparse QR factorization
-# RBio    2.0 or later  read/write sparse matrices in Rutherford-Boeing format
-#
-# By design, this file is NOT included in the CSparse makefile.
-# That package is fully stand-alone.  CSparse is primarily for teaching;
-# production code should use CXSparse.
-#
-# The SuiteSparse_config directory and the above packages should all appear in
-# a single directory, in order for the Makefile's within each package to find
-# this file.
-#
-# To enable an option of the form "# OPTION = ...", edit this file and
-# delete the "#" in the first column of the option you wish to use.
-#
-# The use of METIS 4.0.1 is optional.  To exclude METIS, you must compile with
-# CHOLMOD_CONFIG set to -DNPARTITION.  See below for details.  However, if you
-# do not have a metis-4.0 directory inside the SuiteSparse directory, the
-# */Makefile's that optionally rely on METIS will automatically detect this
-# and compile without METIS.
-
-#------------------------------------------------------------------------------
-# Generic configuration
-#------------------------------------------------------------------------------
-
-# Using standard definitions from the make environment, typically:
-#
-#   CC              cc      C compiler
-#   CXX             g++     C++ compiler
-#   CFLAGS          [ ]     flags for C and C++ compiler
-#   CPPFLAGS        [ ]     flags for C and C++ compiler
-#   TARGET_ARCH     [ ]     target architecture
-#   FFLAGS          [ ]     flags for Fortran compiler
-#   RM              rm -f   delete a file
-#   AR              ar      create a static *.a library archive
-#   ARFLAGS         rv      flags for ar
-#   MAKE            make    make itself (sometimes called gmake)
-#
-# You can redefine them here, but by default they are used from the
-# default make environment.
-
-# To use OpenMP add -openmp to the CFLAGS
-# If OpenMP is used, it is recommended to define CHOLMOD_OMP_NUM_THREADS
-# as the number of cores per socket on the machine being used to maximize
-# memory performance
-  CFLAGS = 
-# CFLAGS = -g
-# for the icc compiler and OpenMP:
-# CFLAGS = -openmp
-
-# C and C++ compiler flags.  The first three are standard for *.c and *.cpp
-# Add -DNTIMER if you do use any timing routines (otherwise -lrt is required).
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER
-  CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC
-# for the MKL BLAS:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -I$(MKLROOT)/include -D_GNU_SOURCE
-# with no optimization:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)     -fexceptions -fPIC
-
-# ranlib, and ar, for generating libraries.  If you don't need ranlib,
-# just change it to RANLAB = echo
-RANLIB = ranlib
-ARCHIVE = $(AR) $(ARFLAGS)
-
-# copy and delete a file
-CP = cp -f
-MV = mv -f
-
-# Fortran compiler (not required for 'make' or 'make library')
-F77 = gfortran
-F77FLAGS = $(FFLAGS) -O
-F77LIB =
-
-# C and Fortran libraries.  Remove -lrt if you don't have it.
-  LIB = -lm -lrt
-# Using the following requires CF = ... -DNTIMER on POSIX C systems.
-# LIB = -lm
-
-# For "make install"
-INSTALL_LIB = /usr/local/lib
-INSTALL_INCLUDE = /usr/local/include
-
-# Which version of MAKE you are using (default is "make")
-# MAKE = make
-# MAKE = gmake
-
-#------------------------------------------------------------------------------
-# BLAS and LAPACK configuration:
-#------------------------------------------------------------------------------
-
-# UMFPACK and CHOLMOD both require the BLAS.  CHOLMOD also requires LAPACK.
-# See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or
-# http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD.
-# LAPACK is at http://www.netlib.org/lapack/ .  You can use the standard
-# Fortran LAPACK along with Goto's BLAS to obtain very good performance.
-# CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz
-# Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops
-# on a 2.5Ghz dual-core AMD Opteron.
-
-# These settings will probably not work, since there is no fixed convention for
-# naming the BLAS and LAPACK library (*.a or *.so) files.
-
-# This is probably slow ... it might connect to the Standard Reference BLAS:
-# BLAS = -lblas -lgfortran
-  LAPACK = -llapack
-
-# MKL 
-# BLAS = -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
-# LAPACK = 
-
-# ACML
-# BLAS = -lacml -lgfortran
-# LAPACK =
-
-# OpenBLAS
-  BLAS = -lopenblas
-# LAPACK = 
-
-# NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto"
-# statement.  Rather, the Goto BLAS is written by Dr. Kazushige Goto.
-# Using the Goto BLAS:
-# BLAS = -lgoto -lgfortran -lgfortranbegin
-# BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread
-
-# Using non-optimized versions:
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack_plain
-
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack
-
-# The BLAS might not contain xerbla, an error-handling routine for LAPACK and
-# the BLAS.  Also, the standard xerbla requires the Fortran I/O library, and
-# stops the application program if an error occurs.  A C version of xerbla
-# distributed with this software (SuiteSparse_config/xerbla/libcerbla.a)
-# includes a Fortran-callable xerbla routine that prints nothing and does not
-# stop the application program.  This is optional.
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a 
-
-# If you wish to use the XERBLA in LAPACK and/or the BLAS instead,
-# use this option:
-XERBLA = 
-
-# If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead,
-# use this:
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a 
-
-#------------------------------------------------------------------------------
-# GPU configuration for CHOLMOD and SPQR
-#------------------------------------------------------------------------------
-
-# no cuda
-  CUDA_ROOT     =
-  GPU_BLAS_PATH =
-  GPU_CONFIG    =
-  CUDA_PATH     =
-  CUDART_LIB    =
-  CUBLAS_LIB    =
-  CUDA_INC_PATH =
-  NV20          =
-  NV30          =
-  NV35          =
-  NVCC          = echo
-  NVCCFLAGS     =
-
-# with cuda for CHOLMOD
-# CUDA_ROOT     = /usr/local/cuda
-# GPU_BLAS_PATH = $(CUDA_ROOT)
-# with 4 cores (default):
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS
-# with 10 cores:
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10
-# CUDA_PATH     = $(CUDA_ROOT)
-# CUDART_LIB    = $(CUDA_ROOT)/lib64/libcudart.so
-# CUBLAS_LIB    = $(CUDA_ROOT)/lib64/libcublas.so
-# CUDA_INC_PATH = $(CUDA_ROOT)/include/
-# NV20          = -arch=sm_20 -Xcompiler -fPIC
-# NV30          = -arch=sm_30 -Xcompiler -fPIC
-# NV35          = -arch=sm_35 -Xcompiler -fPIC
-# NVCC          = $(CUDA_ROOT)/bin/nvcc
-# NVCCFLAGS     = $(NV20) -O3 -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35
-
-# was NVCC      = $(CUDA_ROOT)/bin/nvcc $(NV35) $(NV30) $(NV20)
-
-#------------------------------------------------------------------------------
-# METIS, optionally used by CHOLMOD
-#------------------------------------------------------------------------------
-
-# If you do not have METIS, or do not wish to use it in CHOLMOD, you must
-# compile CHOLMOD with the -DNPARTITION flag.
-
-# The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc.
-# You may wish to use an absolute path.  METIS is optional.  Compile
-# CHOLMOD with -DNPARTITION if you do not wish to use METIS.
-METIS_PATH = ../../metis-4.0
-METIS = ../../metis-4.0/libmetis.a
-
-#------------------------------------------------------------------------------
-# UMFPACK configuration:
-#------------------------------------------------------------------------------
-
-# Configuration flags for UMFPACK.  See UMFPACK/Source/umf_config.h for details.
-#
-# -DNBLAS       do not use the BLAS.  UMFPACK will be very slow.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#               LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF    do not use the Sun Perf. Library (default is use it on Solaris)
-# -DNRECIPROCAL do not multiply by the reciprocal
-# -DNO_DIVIDE_BY_ZERO   do not divide by zero
-# -DNCHOLMOD    do not use CHOLMOD as a ordering method.  If -DNCHOLMOD is
-#               included in UMFPACK_CONFIG, then UMFPACK  does not rely on
-#               CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS.
-
-UMFPACK_CONFIG =
-
-# uncomment this line to compile UMFPACK without CHOLMOD:
-# UMFPACK_CONFIG = -DNCHOLMOD
-
-#------------------------------------------------------------------------------
-# CHOLMOD configuration
-#------------------------------------------------------------------------------
-
-# CHOLMOD Library Modules, which appear in libcholmod.a:
-# Core          requires: none
-# Check         requires: Core
-# Cholesky      requires: Core, AMD, COLAMD.  optional: Partition, Supernodal
-# MatrixOps     requires: Core
-# Modify        requires: Core
-# Partition     requires: Core, CCOLAMD, METIS.  optional: Cholesky
-# Supernodal    requires: Core, BLAS, LAPACK
-#
-# CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a):
-# Tcov          requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal
-#               optional: Partition
-# Valgrind      same as Tcov
-# Demo          requires: Core, Check, Cholesky, MatrixOps, Supernodal
-#               optional: Partition
-#
-# Configuration flags:
-# -DNCHECK          do not include the Check module.       License GNU LGPL
-# -DNCHOLESKY       do not include the Cholesky module.    License GNU LGPL
-# -DNPARTITION      do not include the Partition module.   License GNU LGPL
-#                   also do not include METIS.
-# -DNCAMD           do not use CAMD, etc from Partition module.    GNU LGPL
-# -DNGPL            do not include any GNU GPL Modules in the CHOLMOD library:
-# -DNMATRIXOPS      do not include the MatrixOps module.   License GNU GPL
-# -DNMODIFY         do not include the Modify module.      License GNU GPL
-# -DNSUPERNODAL     do not include the Supernodal module.  License GNU GPL
-#
-# -DNPRINT          do not print anything.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#                   LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF        for Solaris only.  If defined, do not use the Sun
-#                   Performance Library
-
-CHOLMOD_CONFIG = $(GPU_CONFIG)
-
-# uncomment this line to compile CHOLMOD without METIS:
-# CHOLMOD_CONFIG = -DNPARTITION
-
-#------------------------------------------------------------------------------
-# SuiteSparseQR configuration:
-#------------------------------------------------------------------------------
-
-# The SuiteSparseQR library can be compiled with the following options:
-#
-# -DNPARTITION      do not include the CHOLMOD partition module
-# -DNEXPERT         do not include the functions in SuiteSparseQR_expert.cpp
-# -DHAVE_TBB        enable the use of Intel's Threading Building Blocks (TBB)
-
-# default, without timing, without TBB:
-SPQR_CONFIG = $(GPU_CONFIG)
-# with TBB:
-# SPQR_CONFIG = -DHAVE_TBB
-
-# This is needed for IBM AIX: (but not for and C codes, just C++)
-# SPQR_CONFIG = -DBLAS_NO_UNDERSCORE
-
-# with TBB, you must select this:
-# TBB = -ltbb
-# without TBB:
-TBB =
-
-#------------------------------------------------------------------------------
-# code formatting
-#------------------------------------------------------------------------------
-
-# Use "grep" only, if you do not have "indent"  
-# PRETTY = grep -v "^\#"
-# PRETTY = grep -v "^\#" | indent -bl -nce -ss -bli0 -i4 -sob -l120
-  PRETTY = grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120
-
-#------------------------------------------------------------------------------
-# Linux
-#------------------------------------------------------------------------------
-
-# Using default compilers:
-# CC = gcc
-# CF = $(CFLAGS) -O3 -fexceptions
-
-# alternatives:
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \
-#       -funit-at-a-time
-# CF = $(CFLAGS) -O3 -fexceptions \
-#       -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi
-# CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
-# CF = $(CFLAGS) -O3
-# CF = $(CFLAGS) -O3 -g -fexceptions
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow \
-#       -Wredundant-decls -Wdisabled-optimization -ansi
-
-# consider:
-# -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering
-# -frename-registers -ffast-math -funroll-loops
-
-# Using the Goto BLAS:
-# BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread
-
-# Using Intel's icc and ifort compilers:
-#   (does not work for mexFunctions unless you add a mexopts.sh file)
-# F77 = ifort
-# CC = icc
-# CF = $(CFLAGS) -O3 -xN -vec_report=0
-# CF = $(CFLAGS) -g
-
-# 64bit:
-# F77FLAGS = -O -m64
-# CF = $(CFLAGS) -O3 -fexceptions -m64
-# BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA)
-# LAPACK = -llapack64
-
-# SUSE Linux 10.1, AMD Opteron, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-
-# SUSE Linux 10.1, Intel Pentium, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto -lgfortran
-
-#------------------------------------------------------------------------------
-# Mac
-#------------------------------------------------------------------------------
-
-# As recommended by macports, http://suitesparse.darwinports.com/
-# I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard),
-# on my MacBook Air, and they work fine.
-
-# F77 = gfortran
-# CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER
-# BLAS = -framework Accelerate
-# LAPACK = -framework Accelerate
-# LIB = -lm
-
-#------------------------------------------------------------------------------
-# Solaris
-#------------------------------------------------------------------------------
-
-# 32-bit
-# CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32
-
-# 64-bit
-# CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc
-
-# FFLAGS = -fast -KPIC -dalign -xlibmil -m64
-
-# The Sun Performance Library includes both LAPACK and the BLAS:
-# BLAS = -xlic_lib=sunperf
-# LAPACK =
-
-
-#------------------------------------------------------------------------------
-# Compaq Alpha
-#------------------------------------------------------------------------------
-
-# 64-bit mode only
-# CF = $(CFLAGS) -O2 -std1
-# BLAS = -ldxml
-# LAPACK =
-
-#------------------------------------------------------------------------------
-# IBM RS 6000
-#------------------------------------------------------------------------------
-
-# BLAS = -lessl
-# LAPACK =
-
-# 32-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384
-
-# 64-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64
-
-#------------------------------------------------------------------------------
-# SGI IRIX
-#------------------------------------------------------------------------------
-
-# BLAS = -lscsl
-# LAPACK =
-
-# 32-bit mode
-# CF = $(CFLAGS) -O
-
-# 64-bit mode (32 bit int's and 64-bit long's):
-# CF = $(CFLAGS) -64
-# F77FLAGS = -64
-
-# SGI doesn't have ranlib
-# RANLIB = echo
-
-#------------------------------------------------------------------------------
-# AMD Opteron (64 bit)
-#------------------------------------------------------------------------------
-
-# BLAS = -lgoto_opteron64 -lg2c
-# LAPACK = -llapack_opteron64
-
-# SUSE Linux 10.1, AMD Opteron
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-# LAPACK = -llapack_opteron64
-
-#------------------------------------------------------------------------------
-# remove object files and profile output
-#------------------------------------------------------------------------------
-
-CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_debug.mk b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_debug.mk
deleted file mode 100644
index be6a62f..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_debug.mk
+++ /dev/null
@@ -1,452 +0,0 @@
-#===============================================================================
-# SuiteSparse_config.mk:  common configuration file for the SuiteSparse
-#===============================================================================
-
-# This file contains all configuration settings for all packages authored or
-# co-authored by Tim Davis:
-#
-# Package Version       Description
-# ------- -------       -----------
-# AMD     1.2 or later  approximate minimum degree ordering
-# COLAMD  2.4 or later  column approximate minimum degree ordering
-# CCOLAMD 1.0 or later  constrained column approximate minimum degree ordering
-# CAMD    any           constrained approximate minimum degree ordering
-# UMFPACK 4.5 or later  sparse LU factorization, with the BLAS
-# CHOLMOD any           sparse Cholesky factorization, update/downdate
-# KLU     0.8 or later  sparse LU factorization, BLAS-free
-# BTF     0.8 or later  permutation to block triangular form
-# LDL     1.2 or later  concise sparse LDL'
-# CXSparse any          extended version of CSparse (int/long, real/complex)
-# SuiteSparseQR any     sparse QR factorization
-# RBio    2.0 or later  read/write sparse matrices in Rutherford-Boeing format
-#
-# By design, this file is NOT included in the CSparse makefile.
-# That package is fully stand-alone.  CSparse is primarily for teaching;
-# production code should use CXSparse.
-#
-# The SuiteSparse_config directory and the above packages should all appear in
-# a single directory, in order for the Makefile's within each package to find
-# this file.
-#
-# To enable an option of the form "# OPTION = ...", edit this file and
-# delete the "#" in the first column of the option you wish to use.
-#
-# The use of METIS 4.0.1 is optional.  To exclude METIS, you must compile with
-# CHOLMOD_CONFIG set to -DNPARTITION.  See below for details.  However, if you
-# do not have a metis-4.0 directory inside the SuiteSparse directory, the
-# */Makefile's that optionally rely on METIS will automatically detect this
-# and compile without METIS.
-
-#------------------------------------------------------------------------------
-# Generic configuration
-#------------------------------------------------------------------------------
-
-# Using standard definitions from the make environment, typically:
-#
-#   CC              cc      C compiler
-#   CXX             g++     C++ compiler
-#   CFLAGS          [ ]     flags for C and C++ compiler
-#   CPPFLAGS        [ ]     flags for C and C++ compiler
-#   TARGET_ARCH     [ ]     target architecture
-#   FFLAGS          [ ]     flags for Fortran compiler
-#   RM              rm -f   delete a file
-#   AR              ar      create a static *.a library archive
-#   ARFLAGS         rv      flags for ar
-#   MAKE            make    make itself (sometimes called gmake)
-#
-# You can redefine them here, but by default they are used from the
-# default make environment.
-
-# To use OpenMP add -openmp to the CFLAGS
-# If OpenMP is used, it is recommended to define CHOLMOD_OMP_NUM_THREADS
-# as the number of cores per socket on the machine being used to maximize
-# memory performance
-# CFLAGS = 
-  CFLAGS = -g
-# for the icc compiler and OpenMP:
-# CFLAGS = -openmp
-
-# C and C++ compiler flags.  The first three are standard for *.c and *.cpp
-# Add -DNTIMER if you do use any timing routines (otherwise -lrt is required).
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC
-# for the MKL BLAS:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -I$(MKLROOT)/include -D_GNU_SOURCE
-# with no optimization:
-  CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)     -fexceptions -fPIC
-
-# ranlib, and ar, for generating libraries.  If you don't need ranlib,
-# just change it to RANLAB = echo
-RANLIB = ranlib
-ARCHIVE = $(AR) $(ARFLAGS)
-
-# copy and delete a file
-CP = cp -f
-MV = mv -f
-
-# Fortran compiler (not required for 'make' or 'make library')
-F77 = gfortran
-F77FLAGS = $(FFLAGS) -O
-F77LIB =
-
-# C and Fortran libraries.  Remove -lrt if you don't have it.
-  LIB = -lm -lrt
-# Using the following requires CF = ... -DNTIMER on POSIX C systems.
-# LIB = -lm
-
-# For "make install"
-INSTALL_LIB = /usr/local/lib
-INSTALL_INCLUDE = /usr/local/include
-
-# Which version of MAKE you are using (default is "make")
-# MAKE = make
-# MAKE = gmake
-
-#------------------------------------------------------------------------------
-# BLAS and LAPACK configuration:
-#------------------------------------------------------------------------------
-
-# UMFPACK and CHOLMOD both require the BLAS.  CHOLMOD also requires LAPACK.
-# See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or
-# http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD.
-# LAPACK is at http://www.netlib.org/lapack/ .  You can use the standard
-# Fortran LAPACK along with Goto's BLAS to obtain very good performance.
-# CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz
-# Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops
-# on a 2.5Ghz dual-core AMD Opteron.
-
-# These settings will probably not work, since there is no fixed convention for
-# naming the BLAS and LAPACK library (*.a or *.so) files.
-
-# This is probably slow ... it might connect to the Standard Reference BLAS:
-  BLAS = -lblas -lgfortran
-  LAPACK = -llapack
-
-# MKL 
-# BLAS = -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
-# LAPACK = 
-
-# ACML
-# BLAS = -lacml -lgfortran
-# LAPACK =
-
-# OpenBLAS
-# BLAS = -lopenblas
-# LAPACK = 
-
-# NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto"
-# statement.  Rather, the Goto BLAS is written by Dr. Kazushige Goto.
-# Using the Goto BLAS:
-# BLAS = -lgoto -lgfortran -lgfortranbegin
-# BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread
-
-# Using non-optimized versions:
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack_plain
-
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack
-
-# The BLAS might not contain xerbla, an error-handling routine for LAPACK and
-# the BLAS.  Also, the standard xerbla requires the Fortran I/O library, and
-# stops the application program if an error occurs.  A C version of xerbla
-# distributed with this software (SuiteSparse_config/xerbla/libcerbla.a)
-# includes a Fortran-callable xerbla routine that prints nothing and does not
-# stop the application program.  This is optional.
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a 
-
-# If you wish to use the XERBLA in LAPACK and/or the BLAS instead,
-# use this option:
-XERBLA = 
-
-# If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead,
-# use this:
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a 
-
-#------------------------------------------------------------------------------
-# GPU configuration for CHOLMOD and SPQR
-#------------------------------------------------------------------------------
-
-# no cuda
-# CUDA_ROOT     =
-# GPU_BLAS_PATH =
-# GPU_CONFIG    =
-# CUDA_PATH     =
-# CUDART_LIB    =
-# CUBLAS_LIB    =
-# CUDA_INC_PATH =
-# NV20          =
-# NV30          =
-# NV35          =
-# NVCC          = echo
-# NVCCFLAGS     =
-
-# with cuda for CHOLMOD
-  CUDA_ROOT     = /usr/local/cuda
-  GPU_BLAS_PATH = $(CUDA_ROOT)
-# with 4 cores (default):
-  GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS
-# with 10 cores:
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10
-  CUDA_PATH     = $(CUDA_ROOT)
-  CUDART_LIB    = $(CUDA_ROOT)/lib64/libcudart.so
-  CUBLAS_LIB    = $(CUDA_ROOT)/lib64/libcublas.so
-  CUDA_INC_PATH = $(CUDA_ROOT)/include/
-  NV20          = -arch=sm_20 -Xcompiler -fPIC
-  NV30          = -arch=sm_30 -Xcompiler -fPIC
-  NV35          = -arch=sm_35 -Xcompiler -fPIC
-  NVCC          = $(CUDA_ROOT)/bin/nvcc
-  NVCCFLAGS     = $(NV20) -O3 -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35
-
-# was NVCC      = $(CUDA_ROOT)/bin/nvcc $(NV35) $(NV30) $(NV20)
-
-#------------------------------------------------------------------------------
-# METIS, optionally used by CHOLMOD
-#------------------------------------------------------------------------------
-
-# If you do not have METIS, or do not wish to use it in CHOLMOD, you must
-# compile CHOLMOD with the -DNPARTITION flag.
-
-# The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc.
-# You may wish to use an absolute path.  METIS is optional.  Compile
-# CHOLMOD with -DNPARTITION if you do not wish to use METIS.
-METIS_PATH = ../../metis-4.0
-METIS = ../../metis-4.0/libmetis.a
-
-#------------------------------------------------------------------------------
-# UMFPACK configuration:
-#------------------------------------------------------------------------------
-
-# Configuration flags for UMFPACK.  See UMFPACK/Source/umf_config.h for details.
-#
-# -DNBLAS       do not use the BLAS.  UMFPACK will be very slow.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#               LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF    do not use the Sun Perf. Library (default is use it on Solaris)
-# -DNRECIPROCAL do not multiply by the reciprocal
-# -DNO_DIVIDE_BY_ZERO   do not divide by zero
-# -DNCHOLMOD    do not use CHOLMOD as a ordering method.  If -DNCHOLMOD is
-#               included in UMFPACK_CONFIG, then UMFPACK  does not rely on
-#               CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS.
-
-UMFPACK_CONFIG =
-
-# uncomment this line to compile UMFPACK without CHOLMOD:
-# UMFPACK_CONFIG = -DNCHOLMOD
-
-#------------------------------------------------------------------------------
-# CHOLMOD configuration
-#------------------------------------------------------------------------------
-
-# CHOLMOD Library Modules, which appear in libcholmod.a:
-# Core          requires: none
-# Check         requires: Core
-# Cholesky      requires: Core, AMD, COLAMD.  optional: Partition, Supernodal
-# MatrixOps     requires: Core
-# Modify        requires: Core
-# Partition     requires: Core, CCOLAMD, METIS.  optional: Cholesky
-# Supernodal    requires: Core, BLAS, LAPACK
-#
-# CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a):
-# Tcov          requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal
-#               optional: Partition
-# Valgrind      same as Tcov
-# Demo          requires: Core, Check, Cholesky, MatrixOps, Supernodal
-#               optional: Partition
-#
-# Configuration flags:
-# -DNCHECK          do not include the Check module.       License GNU LGPL
-# -DNCHOLESKY       do not include the Cholesky module.    License GNU LGPL
-# -DNPARTITION      do not include the Partition module.   License GNU LGPL
-#                   also do not include METIS.
-# -DNCAMD           do not use CAMD, etc from Partition module.    GNU LGPL
-# -DNGPL            do not include any GNU GPL Modules in the CHOLMOD library:
-# -DNMATRIXOPS      do not include the MatrixOps module.   License GNU GPL
-# -DNMODIFY         do not include the Modify module.      License GNU GPL
-# -DNSUPERNODAL     do not include the Supernodal module.  License GNU GPL
-#
-# -DNPRINT          do not print anything.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#                   LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF        for Solaris only.  If defined, do not use the Sun
-#                   Performance Library
-
-CHOLMOD_CONFIG = $(GPU_CONFIG)
-
-# uncomment this line to compile CHOLMOD without METIS:
-# CHOLMOD_CONFIG = -DNPARTITION
-
-#------------------------------------------------------------------------------
-# SuiteSparseQR configuration:
-#------------------------------------------------------------------------------
-
-# The SuiteSparseQR library can be compiled with the following options:
-#
-# -DNPARTITION      do not include the CHOLMOD partition module
-# -DNEXPERT         do not include the functions in SuiteSparseQR_expert.cpp
-# -DHAVE_TBB        enable the use of Intel's Threading Building Blocks (TBB)
-
-# default, without timing, without TBB:
-SPQR_CONFIG = $(GPU_CONFIG)
-# with TBB:
-# SPQR_CONFIG = -DHAVE_TBB
-
-# This is needed for IBM AIX: (but not for and C codes, just C++)
-# SPQR_CONFIG = -DBLAS_NO_UNDERSCORE
-
-# with TBB, you must select this:
-# TBB = -ltbb
-# without TBB:
-TBB =
-
-#------------------------------------------------------------------------------
-# code formatting
-#------------------------------------------------------------------------------
-
-# Use "grep" only, if you do not have "indent"  
-# PRETTY = grep -v "^\#"
-# PRETTY = grep -v "^\#" | indent -bl -nce -ss -bli0 -i4 -sob -l120
-  PRETTY = grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120
-
-#------------------------------------------------------------------------------
-# Linux
-#------------------------------------------------------------------------------
-
-# Using default compilers:
-# CC = gcc
-# CF = $(CFLAGS) -O3 -fexceptions
-
-# alternatives:
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \
-#       -funit-at-a-time
-# CF = $(CFLAGS) -O3 -fexceptions \
-#       -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi
-# CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
-# CF = $(CFLAGS) -O3
-# CF = $(CFLAGS) -O3 -g -fexceptions
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow \
-#       -Wredundant-decls -Wdisabled-optimization -ansi
-
-# consider:
-# -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering
-# -frename-registers -ffast-math -funroll-loops
-
-# Using the Goto BLAS:
-# BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread
-
-# Using Intel's icc and ifort compilers:
-#   (does not work for mexFunctions unless you add a mexopts.sh file)
-# F77 = ifort
-# CC = icc
-# CF = $(CFLAGS) -O3 -xN -vec_report=0
-# CF = $(CFLAGS) -g
-
-# 64bit:
-# F77FLAGS = -O -m64
-# CF = $(CFLAGS) -O3 -fexceptions -m64
-# BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA)
-# LAPACK = -llapack64
-
-# SUSE Linux 10.1, AMD Opteron, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-
-# SUSE Linux 10.1, Intel Pentium, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto -lgfortran
-
-#------------------------------------------------------------------------------
-# Mac
-#------------------------------------------------------------------------------
-
-# As recommended by macports, http://suitesparse.darwinports.com/
-# I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard),
-# on my MacBook Air, and they work fine.
-
-# F77 = gfortran
-# CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER
-# BLAS = -framework Accelerate
-# LAPACK = -framework Accelerate
-# LIB = -lm
-
-#------------------------------------------------------------------------------
-# Solaris
-#------------------------------------------------------------------------------
-
-# 32-bit
-# CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32
-
-# 64-bit
-# CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc
-
-# FFLAGS = -fast -KPIC -dalign -xlibmil -m64
-
-# The Sun Performance Library includes both LAPACK and the BLAS:
-# BLAS = -xlic_lib=sunperf
-# LAPACK =
-
-
-#------------------------------------------------------------------------------
-# Compaq Alpha
-#------------------------------------------------------------------------------
-
-# 64-bit mode only
-# CF = $(CFLAGS) -O2 -std1
-# BLAS = -ldxml
-# LAPACK =
-
-#------------------------------------------------------------------------------
-# IBM RS 6000
-#------------------------------------------------------------------------------
-
-# BLAS = -lessl
-# LAPACK =
-
-# 32-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384
-
-# 64-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64
-
-#------------------------------------------------------------------------------
-# SGI IRIX
-#------------------------------------------------------------------------------
-
-# BLAS = -lscsl
-# LAPACK =
-
-# 32-bit mode
-# CF = $(CFLAGS) -O
-
-# 64-bit mode (32 bit int's and 64-bit long's):
-# CF = $(CFLAGS) -64
-# F77FLAGS = -64
-
-# SGI doesn't have ranlib
-# RANLIB = echo
-
-#------------------------------------------------------------------------------
-# AMD Opteron (64 bit)
-#------------------------------------------------------------------------------
-
-# BLAS = -lgoto_opteron64 -lg2c
-# LAPACK = -llapack_opteron64
-
-# SUSE Linux 10.1, AMD Opteron
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-# LAPACK = -llapack_opteron64
-
-#------------------------------------------------------------------------------
-# remove object files and profile output
-#------------------------------------------------------------------------------
-
-CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_gcc.mk b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_gcc.mk
deleted file mode 100644
index 79d888c..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_gcc.mk
+++ /dev/null
@@ -1,452 +0,0 @@
-#===============================================================================
-# SuiteSparse_config.mk:  common configuration file for the SuiteSparse
-#===============================================================================
-
-# This file contains all configuration settings for all packages authored or
-# co-authored by Tim Davis:
-#
-# Package Version       Description
-# ------- -------       -----------
-# AMD     1.2 or later  approximate minimum degree ordering
-# COLAMD  2.4 or later  column approximate minimum degree ordering
-# CCOLAMD 1.0 or later  constrained column approximate minimum degree ordering
-# CAMD    any           constrained approximate minimum degree ordering
-# UMFPACK 4.5 or later  sparse LU factorization, with the BLAS
-# CHOLMOD any           sparse Cholesky factorization, update/downdate
-# KLU     0.8 or later  sparse LU factorization, BLAS-free
-# BTF     0.8 or later  permutation to block triangular form
-# LDL     1.2 or later  concise sparse LDL'
-# CXSparse any          extended version of CSparse (int/long, real/complex)
-# SuiteSparseQR any     sparse QR factorization
-# RBio    2.0 or later  read/write sparse matrices in Rutherford-Boeing format
-#
-# By design, this file is NOT included in the CSparse makefile.
-# That package is fully stand-alone.  CSparse is primarily for teaching;
-# production code should use CXSparse.
-#
-# The SuiteSparse_config directory and the above packages should all appear in
-# a single directory, in order for the Makefile's within each package to find
-# this file.
-#
-# To enable an option of the form "# OPTION = ...", edit this file and
-# delete the "#" in the first column of the option you wish to use.
-#
-# The use of METIS 4.0.1 is optional.  To exclude METIS, you must compile with
-# CHOLMOD_CONFIG set to -DNPARTITION.  See below for details.  However, if you
-# do not have a metis-4.0 directory inside the SuiteSparse directory, the
-# */Makefile's that optionally rely on METIS will automatically detect this
-# and compile without METIS.
-
-#------------------------------------------------------------------------------
-# Generic configuration
-#------------------------------------------------------------------------------
-
-# Using standard definitions from the make environment, typically:
-#
-#   CC              cc      C compiler
-#   CXX             g++     C++ compiler
-#   CFLAGS          [ ]     flags for C and C++ compiler
-#   CPPFLAGS        [ ]     flags for C and C++ compiler
-#   TARGET_ARCH     [ ]     target architecture
-#   FFLAGS          [ ]     flags for Fortran compiler
-#   RM              rm -f   delete a file
-#   AR              ar      create a static *.a library archive
-#   ARFLAGS         rv      flags for ar
-#   MAKE            make    make itself (sometimes called gmake)
-#
-# You can redefine them here, but by default they are used from the
-# default make environment.
-
-# To use OpenMP add -openmp to the CFLAGS
-# If OpenMP is used, it is recommended to define CHOLMOD_OMP_NUM_THREADS
-# as the number of cores per socket on the machine being used to maximize
-# memory performance
-  CFLAGS = 
-# CFLAGS = -g
-# for the icc compiler and OpenMP:
-# CFLAGS = -openmp
-
-# C and C++ compiler flags.  The first three are standard for *.c and *.cpp
-# Add -DNTIMER if you do use any timing routines (otherwise -lrt is required).
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER
-  CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC
-# for the MKL BLAS:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -I$(MKLROOT)/include -D_GNU_SOURCE
-# with no optimization:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)     -fexceptions -fPIC
-
-# ranlib, and ar, for generating libraries.  If you don't need ranlib,
-# just change it to RANLAB = echo
-RANLIB = ranlib
-ARCHIVE = $(AR) $(ARFLAGS)
-
-# copy and delete a file
-CP = cp -f
-MV = mv -f
-
-# Fortran compiler (not required for 'make' or 'make library')
-F77 = gfortran
-F77FLAGS = $(FFLAGS) -O
-F77LIB =
-
-# C and Fortran libraries.  Remove -lrt if you don't have it.
-  LIB = -lm -lrt
-# Using the following requires CF = ... -DNTIMER on POSIX C systems.
-# LIB = -lm
-
-# For "make install"
-INSTALL_LIB = /usr/local/lib
-INSTALL_INCLUDE = /usr/local/include
-
-# Which version of MAKE you are using (default is "make")
-# MAKE = make
-# MAKE = gmake
-
-#------------------------------------------------------------------------------
-# BLAS and LAPACK configuration:
-#------------------------------------------------------------------------------
-
-# UMFPACK and CHOLMOD both require the BLAS.  CHOLMOD also requires LAPACK.
-# See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or
-# http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD.
-# LAPACK is at http://www.netlib.org/lapack/ .  You can use the standard
-# Fortran LAPACK along with Goto's BLAS to obtain very good performance.
-# CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz
-# Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops
-# on a 2.5Ghz dual-core AMD Opteron.
-
-# These settings will probably not work, since there is no fixed convention for
-# naming the BLAS and LAPACK library (*.a or *.so) files.
-
-# This is probably slow ... it might connect to the Standard Reference BLAS:
-  BLAS = -lblas -lgfortran
-  LAPACK = -llapack
-
-# MKL 
-# BLAS = -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
-# LAPACK = 
-
-# ACML
-# BLAS = -lacml -lgfortran
-# LAPACK =
-
-# OpenBLAS
-# BLAS = -lopenblas
-# LAPACK = 
-
-# NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto"
-# statement.  Rather, the Goto BLAS is written by Dr. Kazushige Goto.
-# Using the Goto BLAS:
-# BLAS = -lgoto -lgfortran -lgfortranbegin
-# BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread
-
-# Using non-optimized versions:
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack_plain
-
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack
-
-# The BLAS might not contain xerbla, an error-handling routine for LAPACK and
-# the BLAS.  Also, the standard xerbla requires the Fortran I/O library, and
-# stops the application program if an error occurs.  A C version of xerbla
-# distributed with this software (SuiteSparse_config/xerbla/libcerbla.a)
-# includes a Fortran-callable xerbla routine that prints nothing and does not
-# stop the application program.  This is optional.
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a 
-
-# If you wish to use the XERBLA in LAPACK and/or the BLAS instead,
-# use this option:
-XERBLA = 
-
-# If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead,
-# use this:
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a 
-
-#------------------------------------------------------------------------------
-# GPU configuration for CHOLMOD and SPQR
-#------------------------------------------------------------------------------
-
-# no cuda
-# CUDA_ROOT     =
-# GPU_BLAS_PATH =
-# GPU_CONFIG    =
-# CUDA_PATH     =
-# CUDART_LIB    =
-# CUBLAS_LIB    =
-# CUDA_INC_PATH =
-# NV20          =
-# NV30          =
-# NV35          =
-# NVCC          = echo
-# NVCCFLAGS     =
-
-# with cuda for CHOLMOD
-  CUDA_ROOT     = /usr/local/cuda
-  GPU_BLAS_PATH = $(CUDA_ROOT)
-# with 4 cores (default):
-  GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS
-# with 10 cores:
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10
-  CUDA_PATH     = $(CUDA_ROOT)
-  CUDART_LIB    = $(CUDA_ROOT)/lib64/libcudart.so
-  CUBLAS_LIB    = $(CUDA_ROOT)/lib64/libcublas.so
-  CUDA_INC_PATH = $(CUDA_ROOT)/include/
-  NV20          = -arch=sm_20 -Xcompiler -fPIC
-  NV30          = -arch=sm_30 -Xcompiler -fPIC
-  NV35          = -arch=sm_35 -Xcompiler -fPIC
-  NVCC          = $(CUDA_ROOT)/bin/nvcc
-  NVCCFLAGS     = $(NV20) -O3 -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35
-
-# was NVCC      = $(CUDA_ROOT)/bin/nvcc $(NV35) $(NV30) $(NV20)
-
-#------------------------------------------------------------------------------
-# METIS, optionally used by CHOLMOD
-#------------------------------------------------------------------------------
-
-# If you do not have METIS, or do not wish to use it in CHOLMOD, you must
-# compile CHOLMOD with the -DNPARTITION flag.
-
-# The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc.
-# You may wish to use an absolute path.  METIS is optional.  Compile
-# CHOLMOD with -DNPARTITION if you do not wish to use METIS.
-METIS_PATH = ../../metis-4.0
-METIS = ../../metis-4.0/libmetis.a
-
-#------------------------------------------------------------------------------
-# UMFPACK configuration:
-#------------------------------------------------------------------------------
-
-# Configuration flags for UMFPACK.  See UMFPACK/Source/umf_config.h for details.
-#
-# -DNBLAS       do not use the BLAS.  UMFPACK will be very slow.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#               LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF    do not use the Sun Perf. Library (default is use it on Solaris)
-# -DNRECIPROCAL do not multiply by the reciprocal
-# -DNO_DIVIDE_BY_ZERO   do not divide by zero
-# -DNCHOLMOD    do not use CHOLMOD as a ordering method.  If -DNCHOLMOD is
-#               included in UMFPACK_CONFIG, then UMFPACK  does not rely on
-#               CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS.
-
-UMFPACK_CONFIG =
-
-# uncomment this line to compile UMFPACK without CHOLMOD:
-# UMFPACK_CONFIG = -DNCHOLMOD
-
-#------------------------------------------------------------------------------
-# CHOLMOD configuration
-#------------------------------------------------------------------------------
-
-# CHOLMOD Library Modules, which appear in libcholmod.a:
-# Core          requires: none
-# Check         requires: Core
-# Cholesky      requires: Core, AMD, COLAMD.  optional: Partition, Supernodal
-# MatrixOps     requires: Core
-# Modify        requires: Core
-# Partition     requires: Core, CCOLAMD, METIS.  optional: Cholesky
-# Supernodal    requires: Core, BLAS, LAPACK
-#
-# CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a):
-# Tcov          requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal
-#               optional: Partition
-# Valgrind      same as Tcov
-# Demo          requires: Core, Check, Cholesky, MatrixOps, Supernodal
-#               optional: Partition
-#
-# Configuration flags:
-# -DNCHECK          do not include the Check module.       License GNU LGPL
-# -DNCHOLESKY       do not include the Cholesky module.    License GNU LGPL
-# -DNPARTITION      do not include the Partition module.   License GNU LGPL
-#                   also do not include METIS.
-# -DNCAMD           do not use CAMD, etc from Partition module.    GNU LGPL
-# -DNGPL            do not include any GNU GPL Modules in the CHOLMOD library:
-# -DNMATRIXOPS      do not include the MatrixOps module.   License GNU GPL
-# -DNMODIFY         do not include the Modify module.      License GNU GPL
-# -DNSUPERNODAL     do not include the Supernodal module.  License GNU GPL
-#
-# -DNPRINT          do not print anything.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#                   LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF        for Solaris only.  If defined, do not use the Sun
-#                   Performance Library
-
-CHOLMOD_CONFIG = $(GPU_CONFIG)
-
-# uncomment this line to compile CHOLMOD without METIS:
-# CHOLMOD_CONFIG = -DNPARTITION
-
-#------------------------------------------------------------------------------
-# SuiteSparseQR configuration:
-#------------------------------------------------------------------------------
-
-# The SuiteSparseQR library can be compiled with the following options:
-#
-# -DNPARTITION      do not include the CHOLMOD partition module
-# -DNEXPERT         do not include the functions in SuiteSparseQR_expert.cpp
-# -DHAVE_TBB        enable the use of Intel's Threading Building Blocks (TBB)
-
-# default, without timing, without TBB:
-SPQR_CONFIG = $(GPU_CONFIG)
-# with TBB:
-# SPQR_CONFIG = -DHAVE_TBB
-
-# This is needed for IBM AIX: (but not for and C codes, just C++)
-# SPQR_CONFIG = -DBLAS_NO_UNDERSCORE
-
-# with TBB, you must select this:
-# TBB = -ltbb
-# without TBB:
-TBB =
-
-#------------------------------------------------------------------------------
-# code formatting
-#------------------------------------------------------------------------------
-
-# Use "grep" only, if you do not have "indent"  
-# PRETTY = grep -v "^\#"
-# PRETTY = grep -v "^\#" | indent -bl -nce -ss -bli0 -i4 -sob -l120
-  PRETTY = grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120
-
-#------------------------------------------------------------------------------
-# Linux
-#------------------------------------------------------------------------------
-
-# Using default compilers:
-# CC = gcc
-# CF = $(CFLAGS) -O3 -fexceptions
-
-# alternatives:
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \
-#       -funit-at-a-time
-# CF = $(CFLAGS) -O3 -fexceptions \
-#       -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi
-# CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
-# CF = $(CFLAGS) -O3
-# CF = $(CFLAGS) -O3 -g -fexceptions
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow \
-#       -Wredundant-decls -Wdisabled-optimization -ansi
-
-# consider:
-# -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering
-# -frename-registers -ffast-math -funroll-loops
-
-# Using the Goto BLAS:
-# BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread
-
-# Using Intel's icc and ifort compilers:
-#   (does not work for mexFunctions unless you add a mexopts.sh file)
-# F77 = ifort
-# CC = icc
-# CF = $(CFLAGS) -O3 -xN -vec_report=0
-# CF = $(CFLAGS) -g
-
-# 64bit:
-# F77FLAGS = -O -m64
-# CF = $(CFLAGS) -O3 -fexceptions -m64
-# BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA)
-# LAPACK = -llapack64
-
-# SUSE Linux 10.1, AMD Opteron, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-
-# SUSE Linux 10.1, Intel Pentium, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto -lgfortran
-
-#------------------------------------------------------------------------------
-# Mac
-#------------------------------------------------------------------------------
-
-# As recommended by macports, http://suitesparse.darwinports.com/
-# I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard),
-# on my MacBook Air, and they work fine.
-
-# F77 = gfortran
-# CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER
-# BLAS = -framework Accelerate
-# LAPACK = -framework Accelerate
-# LIB = -lm
-
-#------------------------------------------------------------------------------
-# Solaris
-#------------------------------------------------------------------------------
-
-# 32-bit
-# CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32
-
-# 64-bit
-# CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc
-
-# FFLAGS = -fast -KPIC -dalign -xlibmil -m64
-
-# The Sun Performance Library includes both LAPACK and the BLAS:
-# BLAS = -xlic_lib=sunperf
-# LAPACK =
-
-
-#------------------------------------------------------------------------------
-# Compaq Alpha
-#------------------------------------------------------------------------------
-
-# 64-bit mode only
-# CF = $(CFLAGS) -O2 -std1
-# BLAS = -ldxml
-# LAPACK =
-
-#------------------------------------------------------------------------------
-# IBM RS 6000
-#------------------------------------------------------------------------------
-
-# BLAS = -lessl
-# LAPACK =
-
-# 32-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384
-
-# 64-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64
-
-#------------------------------------------------------------------------------
-# SGI IRIX
-#------------------------------------------------------------------------------
-
-# BLAS = -lscsl
-# LAPACK =
-
-# 32-bit mode
-# CF = $(CFLAGS) -O
-
-# 64-bit mode (32 bit int's and 64-bit long's):
-# CF = $(CFLAGS) -64
-# F77FLAGS = -64
-
-# SGI doesn't have ranlib
-# RANLIB = echo
-
-#------------------------------------------------------------------------------
-# AMD Opteron (64 bit)
-#------------------------------------------------------------------------------
-
-# BLAS = -lgoto_opteron64 -lg2c
-# LAPACK = -llapack_opteron64
-
-# SUSE Linux 10.1, AMD Opteron
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-# LAPACK = -llapack_opteron64
-
-#------------------------------------------------------------------------------
-# remove object files and profile output
-#------------------------------------------------------------------------------
-
-CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_icc.mk b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_icc.mk
deleted file mode 100644
index 8f75139..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_icc.mk
+++ /dev/null
@@ -1,452 +0,0 @@
-#===============================================================================
-# SuiteSparse_config.mk:  common configuration file for the SuiteSparse
-#===============================================================================
-
-# This file contains all configuration settings for all packages authored or
-# co-authored by Tim Davis:
-#
-# Package Version       Description
-# ------- -------       -----------
-# AMD     1.2 or later  approximate minimum degree ordering
-# COLAMD  2.4 or later  column approximate minimum degree ordering
-# CCOLAMD 1.0 or later  constrained column approximate minimum degree ordering
-# CAMD    any           constrained approximate minimum degree ordering
-# UMFPACK 4.5 or later  sparse LU factorization, with the BLAS
-# CHOLMOD any           sparse Cholesky factorization, update/downdate
-# KLU     0.8 or later  sparse LU factorization, BLAS-free
-# BTF     0.8 or later  permutation to block triangular form
-# LDL     1.2 or later  concise sparse LDL'
-# CXSparse any          extended version of CSparse (int/long, real/complex)
-# SuiteSparseQR any     sparse QR factorization
-# RBio    2.0 or later  read/write sparse matrices in Rutherford-Boeing format
-#
-# By design, this file is NOT included in the CSparse makefile.
-# That package is fully stand-alone.  CSparse is primarily for teaching;
-# production code should use CXSparse.
-#
-# The SuiteSparse_config directory and the above packages should all appear in
-# a single directory, in order for the Makefile's within each package to find
-# this file.
-#
-# To enable an option of the form "# OPTION = ...", edit this file and
-# delete the "#" in the first column of the option you wish to use.
-#
-# The use of METIS 4.0.1 is optional.  To exclude METIS, you must compile with
-# CHOLMOD_CONFIG set to -DNPARTITION.  See below for details.  However, if you
-# do not have a metis-4.0 directory inside the SuiteSparse directory, the
-# */Makefile's that optionally rely on METIS will automatically detect this
-# and compile without METIS.
-
-#------------------------------------------------------------------------------
-# Generic configuration
-#------------------------------------------------------------------------------
-
-# Using standard definitions from the make environment, typically:
-#
-#   CC              cc      C compiler
-#   CXX             g++     C++ compiler
-#   CFLAGS          [ ]     flags for C and C++ compiler
-#   CPPFLAGS        [ ]     flags for C and C++ compiler
-#   TARGET_ARCH     [ ]     target architecture
-#   FFLAGS          [ ]     flags for Fortran compiler
-#   RM              rm -f   delete a file
-#   AR              ar      create a static *.a library archive
-#   ARFLAGS         rv      flags for ar
-#   MAKE            make    make itself (sometimes called gmake)
-#
-# You can redefine them here, but by default they are used from the
-# default make environment.
-
-# To use OpenMP add -openmp to the CFLAGS
-# If OpenMP is used, it is recommended to define CHOLMOD_OMP_NUM_THREADS
-# as the number of cores per socket on the machine being used to maximize
-# memory performance
-  CFLAGS = 
-# CFLAGS = -g
-# for the icc compiler and OpenMP:
-  CFLAGS = -openmp
-
-# C and C++ compiler flags.  The first three are standard for *.c and *.cpp
-# Add -DNTIMER if you do use any timing routines (otherwise -lrt is required).
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC
-# for the MKL BLAS:
-  CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -I$(MKLROOT)/include -D_GNU_SOURCE
-# with no optimization:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)     -fexceptions -fPIC
-
-# ranlib, and ar, for generating libraries.  If you don't need ranlib,
-# just change it to RANLAB = echo
-RANLIB = ranlib
-ARCHIVE = $(AR) $(ARFLAGS)
-
-# copy and delete a file
-CP = cp -f
-MV = mv -f
-
-# Fortran compiler (not required for 'make' or 'make library')
-F77 = gfortran
-F77FLAGS = $(FFLAGS) -O
-F77LIB =
-
-# C and Fortran libraries.  Remove -lrt if you don't have it.
-  LIB = -lm -lrt
-# Using the following requires CF = ... -DNTIMER on POSIX C systems.
-# LIB = -lm
-
-# For "make install"
-INSTALL_LIB = /usr/local/lib
-INSTALL_INCLUDE = /usr/local/include
-
-# Which version of MAKE you are using (default is "make")
-# MAKE = make
-# MAKE = gmake
-
-#------------------------------------------------------------------------------
-# BLAS and LAPACK configuration:
-#------------------------------------------------------------------------------
-
-# UMFPACK and CHOLMOD both require the BLAS.  CHOLMOD also requires LAPACK.
-# See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or
-# http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD.
-# LAPACK is at http://www.netlib.org/lapack/ .  You can use the standard
-# Fortran LAPACK along with Goto's BLAS to obtain very good performance.
-# CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz
-# Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops
-# on a 2.5Ghz dual-core AMD Opteron.
-
-# These settings will probably not work, since there is no fixed convention for
-# naming the BLAS and LAPACK library (*.a or *.so) files.
-
-# This is probably slow ... it might connect to the Standard Reference BLAS:
-# BLAS = -lblas -lgfortran
-# LAPACK = -llapack
-
-# MKL 
-  BLAS = -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
-  LAPACK = 
-
-# ACML
-# BLAS = -lacml -lgfortran
-# LAPACK =
-
-# OpenBLAS
-# BLAS = -lopenblas
-# LAPACK = 
-
-# NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto"
-# statement.  Rather, the Goto BLAS is written by Dr. Kazushige Goto.
-# Using the Goto BLAS:
-# BLAS = -lgoto -lgfortran -lgfortranbegin
-# BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread
-
-# Using non-optimized versions:
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack_plain
-
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack
-
-# The BLAS might not contain xerbla, an error-handling routine for LAPACK and
-# the BLAS.  Also, the standard xerbla requires the Fortran I/O library, and
-# stops the application program if an error occurs.  A C version of xerbla
-# distributed with this software (SuiteSparse_config/xerbla/libcerbla.a)
-# includes a Fortran-callable xerbla routine that prints nothing and does not
-# stop the application program.  This is optional.
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a 
-
-# If you wish to use the XERBLA in LAPACK and/or the BLAS instead,
-# use this option:
-XERBLA = 
-
-# If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead,
-# use this:
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a 
-
-#------------------------------------------------------------------------------
-# GPU configuration for CHOLMOD and SPQR
-#------------------------------------------------------------------------------
-
-# no cuda
-# CUDA_ROOT     =
-# GPU_BLAS_PATH =
-# GPU_CONFIG    =
-# CUDA_PATH     =
-# CUDART_LIB    =
-# CUBLAS_LIB    =
-# CUDA_INC_PATH =
-# NV20          =
-# NV30          =
-# NV35          =
-# NVCC          = echo
-# NVCCFLAGS     =
-
-# with cuda for CHOLMOD
-  CUDA_ROOT     = /usr/local/cuda
-  GPU_BLAS_PATH = $(CUDA_ROOT)
-# with 4 cores (default):
-  GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS
-# with 10 cores:
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10
-  CUDA_PATH     = $(CUDA_ROOT)
-  CUDART_LIB    = $(CUDA_ROOT)/lib64/libcudart.so
-  CUBLAS_LIB    = $(CUDA_ROOT)/lib64/libcublas.so
-  CUDA_INC_PATH = $(CUDA_ROOT)/include/
-  NV20          = -arch=sm_20 -Xcompiler -fPIC
-  NV30          = -arch=sm_30 -Xcompiler -fPIC
-  NV35          = -arch=sm_35 -Xcompiler -fPIC
-  NVCC          = $(CUDA_ROOT)/bin/nvcc
-  NVCCFLAGS     = -O3 -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35 -Xcompiler -fPIC
-
-# was NVCC      = $(CUDA_ROOT)/bin/nvcc $(NV35) $(NV30) $(NV20)
-
-#------------------------------------------------------------------------------
-# METIS, optionally used by CHOLMOD
-#------------------------------------------------------------------------------
-
-# If you do not have METIS, or do not wish to use it in CHOLMOD, you must
-# compile CHOLMOD with the -DNPARTITION flag.
-
-# The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc.
-# You may wish to use an absolute path.  METIS is optional.  Compile
-# CHOLMOD with -DNPARTITION if you do not wish to use METIS.
-METIS_PATH = ../../metis-4.0
-METIS = ../../metis-4.0/libmetis.a
-
-#------------------------------------------------------------------------------
-# UMFPACK configuration:
-#------------------------------------------------------------------------------
-
-# Configuration flags for UMFPACK.  See UMFPACK/Source/umf_config.h for details.
-#
-# -DNBLAS       do not use the BLAS.  UMFPACK will be very slow.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#               LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF    do not use the Sun Perf. Library (default is use it on Solaris)
-# -DNRECIPROCAL do not multiply by the reciprocal
-# -DNO_DIVIDE_BY_ZERO   do not divide by zero
-# -DNCHOLMOD    do not use CHOLMOD as a ordering method.  If -DNCHOLMOD is
-#               included in UMFPACK_CONFIG, then UMFPACK  does not rely on
-#               CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS.
-
-UMFPACK_CONFIG =
-
-# uncomment this line to compile UMFPACK without CHOLMOD:
-# UMFPACK_CONFIG = -DNCHOLMOD
-
-#------------------------------------------------------------------------------
-# CHOLMOD configuration
-#------------------------------------------------------------------------------
-
-# CHOLMOD Library Modules, which appear in libcholmod.a:
-# Core          requires: none
-# Check         requires: Core
-# Cholesky      requires: Core, AMD, COLAMD.  optional: Partition, Supernodal
-# MatrixOps     requires: Core
-# Modify        requires: Core
-# Partition     requires: Core, CCOLAMD, METIS.  optional: Cholesky
-# Supernodal    requires: Core, BLAS, LAPACK
-#
-# CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a):
-# Tcov          requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal
-#               optional: Partition
-# Valgrind      same as Tcov
-# Demo          requires: Core, Check, Cholesky, MatrixOps, Supernodal
-#               optional: Partition
-#
-# Configuration flags:
-# -DNCHECK          do not include the Check module.       License GNU LGPL
-# -DNCHOLESKY       do not include the Cholesky module.    License GNU LGPL
-# -DNPARTITION      do not include the Partition module.   License GNU LGPL
-#                   also do not include METIS.
-# -DNCAMD           do not use CAMD, etc from Partition module.    GNU LGPL
-# -DNGPL            do not include any GNU GPL Modules in the CHOLMOD library:
-# -DNMATRIXOPS      do not include the MatrixOps module.   License GNU GPL
-# -DNMODIFY         do not include the Modify module.      License GNU GPL
-# -DNSUPERNODAL     do not include the Supernodal module.  License GNU GPL
-#
-# -DNPRINT          do not print anything.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#                   LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF        for Solaris only.  If defined, do not use the Sun
-#                   Performance Library
-
-CHOLMOD_CONFIG = $(GPU_CONFIG)
-
-# uncomment this line to compile CHOLMOD without METIS:
-# CHOLMOD_CONFIG = -DNPARTITION
-
-#------------------------------------------------------------------------------
-# SuiteSparseQR configuration:
-#------------------------------------------------------------------------------
-
-# The SuiteSparseQR library can be compiled with the following options:
-#
-# -DNPARTITION      do not include the CHOLMOD partition module
-# -DNEXPERT         do not include the functions in SuiteSparseQR_expert.cpp
-# -DHAVE_TBB        enable the use of Intel's Threading Building Blocks (TBB)
-
-# default, without timing, without TBB:
-SPQR_CONFIG = $(GPU_CONFIG)
-# with TBB:
-# SPQR_CONFIG = -DHAVE_TBB
-
-# This is needed for IBM AIX: (but not for and C codes, just C++)
-# SPQR_CONFIG = -DBLAS_NO_UNDERSCORE
-
-# with TBB, you must select this:
-# TBB = -ltbb
-# without TBB:
-TBB =
-
-#------------------------------------------------------------------------------
-# code formatting
-#------------------------------------------------------------------------------
-
-# Use "grep" only, if you do not have "indent"  
-# PRETTY = grep -v "^\#"
-# PRETTY = grep -v "^\#" | indent -bl -nce -ss -bli0 -i4 -sob -l120
-  PRETTY = grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120
-
-#------------------------------------------------------------------------------
-# Linux
-#------------------------------------------------------------------------------
-
-# Using default compilers:
-# CC = gcc
-# CF = $(CFLAGS) -O3 -fexceptions
-
-# alternatives:
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \
-#       -funit-at-a-time
-# CF = $(CFLAGS) -O3 -fexceptions \
-#       -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi
-# CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
-# CF = $(CFLAGS) -O3
-# CF = $(CFLAGS) -O3 -g -fexceptions
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow \
-#       -Wredundant-decls -Wdisabled-optimization -ansi
-
-# consider:
-# -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering
-# -frename-registers -ffast-math -funroll-loops
-
-# Using the Goto BLAS:
-# BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread
-
-# Using Intel's icc and ifort compilers:
-#   (does not work for mexFunctions unless you add a mexopts.sh file)
-# F77 = ifort
-  CC = icc
-# CF = $(CFLAGS) -O3 -xN -vec_report=0
-# CF = $(CFLAGS) -g
-
-# 64bit:
-# F77FLAGS = -O -m64
-# CF = $(CFLAGS) -O3 -fexceptions -m64
-# BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA)
-# LAPACK = -llapack64
-
-# SUSE Linux 10.1, AMD Opteron, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-
-# SUSE Linux 10.1, Intel Pentium, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto -lgfortran
-
-#------------------------------------------------------------------------------
-# Mac
-#------------------------------------------------------------------------------
-
-# As recommended by macports, http://suitesparse.darwinports.com/
-# I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard),
-# on my MacBook Air, and they work fine.
-
-# F77 = gfortran
-# CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER
-# BLAS = -framework Accelerate
-# LAPACK = -framework Accelerate
-# LIB = -lm
-
-#------------------------------------------------------------------------------
-# Solaris
-#------------------------------------------------------------------------------
-
-# 32-bit
-# CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32
-
-# 64-bit
-# CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc
-
-# FFLAGS = -fast -KPIC -dalign -xlibmil -m64
-
-# The Sun Performance Library includes both LAPACK and the BLAS:
-# BLAS = -xlic_lib=sunperf
-# LAPACK =
-
-
-#------------------------------------------------------------------------------
-# Compaq Alpha
-#------------------------------------------------------------------------------
-
-# 64-bit mode only
-# CF = $(CFLAGS) -O2 -std1
-# BLAS = -ldxml
-# LAPACK =
-
-#------------------------------------------------------------------------------
-# IBM RS 6000
-#------------------------------------------------------------------------------
-
-# BLAS = -lessl
-# LAPACK =
-
-# 32-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384
-
-# 64-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64
-
-#------------------------------------------------------------------------------
-# SGI IRIX
-#------------------------------------------------------------------------------
-
-# BLAS = -lscsl
-# LAPACK =
-
-# 32-bit mode
-# CF = $(CFLAGS) -O
-
-# 64-bit mode (32 bit int's and 64-bit long's):
-# CF = $(CFLAGS) -64
-# F77FLAGS = -64
-
-# SGI doesn't have ranlib
-# RANLIB = echo
-
-#------------------------------------------------------------------------------
-# AMD Opteron (64 bit)
-#------------------------------------------------------------------------------
-
-# BLAS = -lgoto_opteron64 -lg2c
-# LAPACK = -llapack_opteron64
-
-# SUSE Linux 10.1, AMD Opteron
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-# LAPACK = -llapack_opteron64
-
-#------------------------------------------------------------------------------
-# remove object files and profile output
-#------------------------------------------------------------------------------
-
-CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_icc10.mk b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_icc10.mk
deleted file mode 100644
index 8e2fde3..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_GPU_icc10.mk
+++ /dev/null
@@ -1,453 +0,0 @@
-#===============================================================================
-# SuiteSparse_config.mk:  common configuration file for the SuiteSparse
-#===============================================================================
-
-# This file contains all configuration settings for all packages authored or
-# co-authored by Tim Davis:
-#
-# Package Version       Description
-# ------- -------       -----------
-# AMD     1.2 or later  approximate minimum degree ordering
-# COLAMD  2.4 or later  column approximate minimum degree ordering
-# CCOLAMD 1.0 or later  constrained column approximate minimum degree ordering
-# CAMD    any           constrained approximate minimum degree ordering
-# UMFPACK 4.5 or later  sparse LU factorization, with the BLAS
-# CHOLMOD any           sparse Cholesky factorization, update/downdate
-# KLU     0.8 or later  sparse LU factorization, BLAS-free
-# BTF     0.8 or later  permutation to block triangular form
-# LDL     1.2 or later  concise sparse LDL'
-# CXSparse any          extended version of CSparse (int/long, real/complex)
-# SuiteSparseQR any     sparse QR factorization
-# RBio    2.0 or later  read/write sparse matrices in Rutherford-Boeing format
-#
-# By design, this file is NOT included in the CSparse makefile.
-# That package is fully stand-alone.  CSparse is primarily for teaching;
-# production code should use CXSparse.
-#
-# The SuiteSparse_config directory and the above packages should all appear in
-# a single directory, in order for the Makefile's within each package to find
-# this file.
-#
-# To enable an option of the form "# OPTION = ...", edit this file and
-# delete the "#" in the first column of the option you wish to use.
-#
-# The use of METIS 4.0.1 is optional.  To exclude METIS, you must compile with
-# CHOLMOD_CONFIG set to -DNPARTITION.  See below for details.  However, if you
-# do not have a metis-4.0 directory inside the SuiteSparse directory, the
-# */Makefile's that optionally rely on METIS will automatically detect this
-# and compile without METIS.
-
-#------------------------------------------------------------------------------
-# Generic configuration
-#------------------------------------------------------------------------------
-
-# Using standard definitions from the make environment, typically:
-#
-#   CC              cc      C compiler
-#   CXX             g++     C++ compiler
-#   CFLAGS          [ ]     flags for C and C++ compiler
-#   CPPFLAGS        [ ]     flags for C and C++ compiler
-#   TARGET_ARCH     [ ]     target architecture
-#   FFLAGS          [ ]     flags for Fortran compiler
-#   RM              rm -f   delete a file
-#   AR              ar      create a static *.a library archive
-#   ARFLAGS         rv      flags for ar
-#   MAKE            make    make itself (sometimes called gmake)
-#
-# You can redefine them here, but by default they are used from the
-# default make environment.
-
-# To use OpenMP add -openmp to the CFLAGS
-# If OpenMP is used, it is recommended to define CHOLMOD_OMP_NUM_THREADS
-# as the number of cores per socket on the machine being used to maximize
-# memory performance
-  CFLAGS = 
-# CFLAGS = -g
-# for the icc compiler and OpenMP:
-  CXX = icpc
-  CFLAGS = -openmp
-
-# C and C++ compiler flags.  The first three are standard for *.c and *.cpp
-# Add -DNTIMER if you do use any timing routines (otherwise -lrt is required).
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC
-# for the MKL BLAS:
-  CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -I$(MKLROOT)/include -D_GNU_SOURCE
-# with no optimization:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)     -fexceptions -fPIC
-
-# ranlib, and ar, for generating libraries.  If you don't need ranlib,
-# just change it to RANLAB = echo
-RANLIB = ranlib
-ARCHIVE = $(AR) $(ARFLAGS)
-
-# copy and delete a file
-CP = cp -f
-MV = mv -f
-
-# Fortran compiler (not required for 'make' or 'make library')
-F77 = gfortran
-F77FLAGS = $(FFLAGS) -O
-F77LIB =
-
-# C and Fortran libraries.  Remove -lrt if you don't have it.
-  LIB = -lm -lrt
-# Using the following requires CF = ... -DNTIMER on POSIX C systems.
-# LIB = -lm
-
-# For "make install"
-INSTALL_LIB = /usr/local/lib
-INSTALL_INCLUDE = /usr/local/include
-
-# Which version of MAKE you are using (default is "make")
-# MAKE = make
-# MAKE = gmake
-
-#------------------------------------------------------------------------------
-# BLAS and LAPACK configuration:
-#------------------------------------------------------------------------------
-
-# UMFPACK and CHOLMOD both require the BLAS.  CHOLMOD also requires LAPACK.
-# See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or
-# http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD.
-# LAPACK is at http://www.netlib.org/lapack/ .  You can use the standard
-# Fortran LAPACK along with Goto's BLAS to obtain very good performance.
-# CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz
-# Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops
-# on a 2.5Ghz dual-core AMD Opteron.
-
-# These settings will probably not work, since there is no fixed convention for
-# naming the BLAS and LAPACK library (*.a or *.so) files.
-
-# This is probably slow ... it might connect to the Standard Reference BLAS:
-# BLAS = -lblas -lgfortran
-# LAPACK = -llapack
-
-# MKL 
-  BLAS = -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
-  LAPACK = 
-
-# ACML
-# BLAS = -lacml -lgfortran
-# LAPACK =
-
-# OpenBLAS
-# BLAS = -lopenblas
-# LAPACK = 
-
-# NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto"
-# statement.  Rather, the Goto BLAS is written by Dr. Kazushige Goto.
-# Using the Goto BLAS:
-# BLAS = -lgoto -lgfortran -lgfortranbegin
-# BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread
-
-# Using non-optimized versions:
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack_plain
-
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack
-
-# The BLAS might not contain xerbla, an error-handling routine for LAPACK and
-# the BLAS.  Also, the standard xerbla requires the Fortran I/O library, and
-# stops the application program if an error occurs.  A C version of xerbla
-# distributed with this software (SuiteSparse_config/xerbla/libcerbla.a)
-# includes a Fortran-callable xerbla routine that prints nothing and does not
-# stop the application program.  This is optional.
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a 
-
-# If you wish to use the XERBLA in LAPACK and/or the BLAS instead,
-# use this option:
-XERBLA = 
-
-# If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead,
-# use this:
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a 
-
-#------------------------------------------------------------------------------
-# GPU configuration for CHOLMOD and SPQR
-#------------------------------------------------------------------------------
-
-# no cuda
-# CUDA_ROOT     =
-# GPU_BLAS_PATH =
-# GPU_CONFIG    =
-# CUDA_PATH     =
-# CUDART_LIB    =
-# CUBLAS_LIB    =
-# CUDA_INC_PATH =
-# NV20          =
-# NV30          =
-# NV35          =
-# NVCC          = echo
-# NVCCFLAGS     =
-
-# with cuda for CHOLMOD
-#  CUDA_ROOT     = /usr/local/cuda
-  GPU_BLAS_PATH = $(CUDA_ROOT)
-# with 4 cores (default):
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS
-# with 10 cores:
- GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10
- CUDA_PATH     = $(CUDA_ROOT)
- CUDART_LIB    = $(CUDA_ROOT)/lib64/libcudart.so
- CUBLAS_LIB    = $(CUDA_ROOT)/lib64/libcublas.so
- CUDA_INC_PATH = $(CUDA_ROOT)/include/
- NV20          = -arch=sm_20 -Xcompiler -fPIC
- NV30          = -arch=sm_30 -Xcompiler -fPIC
- NV35          = -arch=sm_35 -Xcompiler -fPIC
- NVCC          = $(CUDA_ROOT)/bin/nvcc
- NVCCFLAGS     = -O3 -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35 -Xcompiler -fPIC
-
-# was NVCC      = $(CUDA_ROOT)/bin/nvcc $(NV35) $(NV30) $(NV20)
-
-#------------------------------------------------------------------------------
-# METIS, optionally used by CHOLMOD
-#------------------------------------------------------------------------------
-
-# If you do not have METIS, or do not wish to use it in CHOLMOD, you must
-# compile CHOLMOD with the -DNPARTITION flag.
-
-# The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc.
-# You may wish to use an absolute path.  METIS is optional.  Compile
-# CHOLMOD with -DNPARTITION if you do not wish to use METIS.
-METIS_PATH = ../../metis-4.0
-METIS = ../../metis-4.0/libmetis.a
-
-#------------------------------------------------------------------------------
-# UMFPACK configuration:
-#------------------------------------------------------------------------------
-
-# Configuration flags for UMFPACK.  See UMFPACK/Source/umf_config.h for details.
-#
-# -DNBLAS       do not use the BLAS.  UMFPACK will be very slow.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#               LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF    do not use the Sun Perf. Library (default is use it on Solaris)
-# -DNRECIPROCAL do not multiply by the reciprocal
-# -DNO_DIVIDE_BY_ZERO   do not divide by zero
-# -DNCHOLMOD    do not use CHOLMOD as a ordering method.  If -DNCHOLMOD is
-#               included in UMFPACK_CONFIG, then UMFPACK  does not rely on
-#               CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS.
-
-UMFPACK_CONFIG =
-
-# uncomment this line to compile UMFPACK without CHOLMOD:
-# UMFPACK_CONFIG = -DNCHOLMOD
-
-#------------------------------------------------------------------------------
-# CHOLMOD configuration
-#------------------------------------------------------------------------------
-
-# CHOLMOD Library Modules, which appear in libcholmod.a:
-# Core          requires: none
-# Check         requires: Core
-# Cholesky      requires: Core, AMD, COLAMD.  optional: Partition, Supernodal
-# MatrixOps     requires: Core
-# Modify        requires: Core
-# Partition     requires: Core, CCOLAMD, METIS.  optional: Cholesky
-# Supernodal    requires: Core, BLAS, LAPACK
-#
-# CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a):
-# Tcov          requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal
-#               optional: Partition
-# Valgrind      same as Tcov
-# Demo          requires: Core, Check, Cholesky, MatrixOps, Supernodal
-#               optional: Partition
-#
-# Configuration flags:
-# -DNCHECK          do not include the Check module.       License GNU LGPL
-# -DNCHOLESKY       do not include the Cholesky module.    License GNU LGPL
-# -DNPARTITION      do not include the Partition module.   License GNU LGPL
-#                   also do not include METIS.
-# -DNCAMD           do not use CAMD, etc from Partition module.    GNU LGPL
-# -DNGPL            do not include any GNU GPL Modules in the CHOLMOD library:
-# -DNMATRIXOPS      do not include the MatrixOps module.   License GNU GPL
-# -DNMODIFY         do not include the Modify module.      License GNU GPL
-# -DNSUPERNODAL     do not include the Supernodal module.  License GNU GPL
-#
-# -DNPRINT          do not print anything.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#                   LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF        for Solaris only.  If defined, do not use the Sun
-#                   Performance Library
-
-CHOLMOD_CONFIG = $(GPU_CONFIG)
-
-# uncomment this line to compile CHOLMOD without METIS:
-# CHOLMOD_CONFIG = -DNPARTITION
-
-#------------------------------------------------------------------------------
-# SuiteSparseQR configuration:
-#------------------------------------------------------------------------------
-
-# The SuiteSparseQR library can be compiled with the following options:
-#
-# -DNPARTITION      do not include the CHOLMOD partition module
-# -DNEXPERT         do not include the functions in SuiteSparseQR_expert.cpp
-# -DHAVE_TBB        enable the use of Intel's Threading Building Blocks (TBB)
-
-# default, without timing, without TBB:
-SPQR_CONFIG = $(GPU_CONFIG)
-# with TBB:
-# SPQR_CONFIG = -DHAVE_TBB
-
-# This is needed for IBM AIX: (but not for and C codes, just C++)
-# SPQR_CONFIG = -DBLAS_NO_UNDERSCORE
-
-# with TBB, you must select this:
-# TBB = -ltbb
-# without TBB:
-TBB =
-
-#------------------------------------------------------------------------------
-# code formatting
-#------------------------------------------------------------------------------
-
-# Use "grep" only, if you do not have "indent"  
-# PRETTY = grep -v "^\#"
-# PRETTY = grep -v "^\#" | indent -bl -nce -ss -bli0 -i4 -sob -l120
-  PRETTY = grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120
-
-#------------------------------------------------------------------------------
-# Linux
-#------------------------------------------------------------------------------
-
-# Using default compilers:
-# CC = gcc
-# CF = $(CFLAGS) -O3 -fexceptions
-
-# alternatives:
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \
-#       -funit-at-a-time
-# CF = $(CFLAGS) -O3 -fexceptions \
-#       -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi
-# CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
-# CF = $(CFLAGS) -O3
-# CF = $(CFLAGS) -O3 -g -fexceptions
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow \
-#       -Wredundant-decls -Wdisabled-optimization -ansi
-
-# consider:
-# -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering
-# -frename-registers -ffast-math -funroll-loops
-
-# Using the Goto BLAS:
-# BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread
-
-# Using Intel's icc and ifort compilers:
-#   (does not work for mexFunctions unless you add a mexopts.sh file)
-# F77 = ifort
-  CC = icc
-# CF = $(CFLAGS) -O3 -xN -vec_report=0
-# CF = $(CFLAGS) -g
-
-# 64bit:
-# F77FLAGS = -O -m64
-# CF = $(CFLAGS) -O3 -fexceptions -m64
-# BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA)
-# LAPACK = -llapack64
-
-# SUSE Linux 10.1, AMD Opteron, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-
-# SUSE Linux 10.1, Intel Pentium, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto -lgfortran
-
-#------------------------------------------------------------------------------
-# Mac
-#------------------------------------------------------------------------------
-
-# As recommended by macports, http://suitesparse.darwinports.com/
-# I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard),
-# on my MacBook Air, and they work fine.
-
-# F77 = gfortran
-# CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER
-# BLAS = -framework Accelerate
-# LAPACK = -framework Accelerate
-# LIB = -lm
-
-#------------------------------------------------------------------------------
-# Solaris
-#------------------------------------------------------------------------------
-
-# 32-bit
-# CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32
-
-# 64-bit
-# CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc
-
-# FFLAGS = -fast -KPIC -dalign -xlibmil -m64
-
-# The Sun Performance Library includes both LAPACK and the BLAS:
-# BLAS = -xlic_lib=sunperf
-# LAPACK =
-
-
-#------------------------------------------------------------------------------
-# Compaq Alpha
-#------------------------------------------------------------------------------
-
-# 64-bit mode only
-# CF = $(CFLAGS) -O2 -std1
-# BLAS = -ldxml
-# LAPACK =
-
-#------------------------------------------------------------------------------
-# IBM RS 6000
-#------------------------------------------------------------------------------
-
-# BLAS = -lessl
-# LAPACK =
-
-# 32-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384
-
-# 64-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64
-
-#------------------------------------------------------------------------------
-# SGI IRIX
-#------------------------------------------------------------------------------
-
-# BLAS = -lscsl
-# LAPACK =
-
-# 32-bit mode
-# CF = $(CFLAGS) -O
-
-# 64-bit mode (32 bit int's and 64-bit long's):
-# CF = $(CFLAGS) -64
-# F77FLAGS = -64
-
-# SGI doesn't have ranlib
-# RANLIB = echo
-
-#------------------------------------------------------------------------------
-# AMD Opteron (64 bit)
-#------------------------------------------------------------------------------
-
-# BLAS = -lgoto_opteron64 -lg2c
-# LAPACK = -llapack_opteron64
-
-# SUSE Linux 10.1, AMD Opteron
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-# LAPACK = -llapack_opteron64
-
-#------------------------------------------------------------------------------
-# remove object files and profile output
-#------------------------------------------------------------------------------
-
-CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_Mac.mk b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_Mac.mk
deleted file mode 100644
index 9179819..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_Mac.mk
+++ /dev/null
@@ -1,452 +0,0 @@
-#===============================================================================
-# SuiteSparse_config.mk:  common configuration file for the SuiteSparse
-#===============================================================================
-
-# This file contains all configuration settings for all packages authored or
-# co-authored by Tim Davis:
-#
-# Package Version       Description
-# ------- -------       -----------
-# AMD     1.2 or later  approximate minimum degree ordering
-# COLAMD  2.4 or later  column approximate minimum degree ordering
-# CCOLAMD 1.0 or later  constrained column approximate minimum degree ordering
-# CAMD    any           constrained approximate minimum degree ordering
-# UMFPACK 4.5 or later  sparse LU factorization, with the BLAS
-# CHOLMOD any           sparse Cholesky factorization, update/downdate
-# KLU     0.8 or later  sparse LU factorization, BLAS-free
-# BTF     0.8 or later  permutation to block triangular form
-# LDL     1.2 or later  concise sparse LDL'
-# CXSparse any          extended version of CSparse (int/long, real/complex)
-# SuiteSparseQR any     sparse QR factorization
-# RBio    2.0 or later  read/write sparse matrices in Rutherford-Boeing format
-#
-# By design, this file is NOT included in the CSparse makefile.
-# That package is fully stand-alone.  CSparse is primarily for teaching;
-# production code should use CXSparse.
-#
-# The SuiteSparse_config directory and the above packages should all appear in
-# a single directory, in order for the Makefile's within each package to find
-# this file.
-#
-# To enable an option of the form "# OPTION = ...", edit this file and
-# delete the "#" in the first column of the option you wish to use.
-#
-# The use of METIS 4.0.1 is optional.  To exclude METIS, you must compile with
-# CHOLMOD_CONFIG set to -DNPARTITION.  See below for details.  However, if you
-# do not have a metis-4.0 directory inside the SuiteSparse directory, the
-# */Makefile's that optionally rely on METIS will automatically detect this
-# and compile without METIS.
-
-#------------------------------------------------------------------------------
-# Generic configuration
-#------------------------------------------------------------------------------
-
-# Using standard definitions from the make environment, typically:
-#
-#   CC              cc      C compiler
-#   CXX             g++     C++ compiler
-#   CFLAGS          [ ]     flags for C and C++ compiler
-#   CPPFLAGS        [ ]     flags for C and C++ compiler
-#   TARGET_ARCH     [ ]     target architecture
-#   FFLAGS          [ ]     flags for Fortran compiler
-#   RM              rm -f   delete a file
-#   AR              ar      create a static *.a library archive
-#   ARFLAGS         rv      flags for ar
-#   MAKE            make    make itself (sometimes called gmake)
-#
-# You can redefine them here, but by default they are used from the
-# default make environment.
-
-# To use OpenMP add -openmp to the CFLAGS
-# If OpenMP is used, it is recommended to define CHOLMOD_OMP_NUM_THREADS
-# as the number of cores per socket on the machine being used to maximize
-# memory performance
-  CFLAGS = 
-# CFLAGS = -g
-# for the icc compiler and OpenMP:
-# CFLAGS = -openmp
-
-# C and C++ compiler flags.  The first three are standard for *.c and *.cpp
-# Add -DNTIMER if you do use any timing routines (otherwise -lrt is required).
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER
-  CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC
-# for the MKL BLAS:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -I$(MKLROOT)/include -D_GNU_SOURCE
-# with no optimization:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)     -fexceptions -fPIC
-
-# ranlib, and ar, for generating libraries.  If you don't need ranlib,
-# just change it to RANLAB = echo
-RANLIB = ranlib
-ARCHIVE = $(AR) $(ARFLAGS)
-
-# copy and delete a file
-CP = cp -f
-MV = mv -f
-
-# Fortran compiler (not required for 'make' or 'make library')
-F77 = gfortran
-F77FLAGS = $(FFLAGS) -O
-F77LIB =
-
-# C and Fortran libraries.  Remove -lrt if you don't have it.
-  LIB = -lm -lrt
-# Using the following requires CF = ... -DNTIMER on POSIX C systems.
-# LIB = -lm
-
-# For "make install"
-INSTALL_LIB = /usr/local/lib
-INSTALL_INCLUDE = /usr/local/include
-
-# Which version of MAKE you are using (default is "make")
-# MAKE = make
-# MAKE = gmake
-
-#------------------------------------------------------------------------------
-# BLAS and LAPACK configuration:
-#------------------------------------------------------------------------------
-
-# UMFPACK and CHOLMOD both require the BLAS.  CHOLMOD also requires LAPACK.
-# See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or
-# http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD.
-# LAPACK is at http://www.netlib.org/lapack/ .  You can use the standard
-# Fortran LAPACK along with Goto's BLAS to obtain very good performance.
-# CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz
-# Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops
-# on a 2.5Ghz dual-core AMD Opteron.
-
-# These settings will probably not work, since there is no fixed convention for
-# naming the BLAS and LAPACK library (*.a or *.so) files.
-
-# This is probably slow ... it might connect to the Standard Reference BLAS:
-  BLAS = -lblas -lgfortran
-  LAPACK = -llapack
-
-# MKL 
-# BLAS = -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
-# LAPACK = 
-
-# ACML
-# BLAS = -lacml -lgfortran
-# LAPACK =
-
-# OpenBLAS
-# BLAS = -lopenblas
-# LAPACK = 
-
-# NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto"
-# statement.  Rather, the Goto BLAS is written by Dr. Kazushige Goto.
-# Using the Goto BLAS:
-# BLAS = -lgoto -lgfortran -lgfortranbegin
-# BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread
-
-# Using non-optimized versions:
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack_plain
-
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack
-
-# The BLAS might not contain xerbla, an error-handling routine for LAPACK and
-# the BLAS.  Also, the standard xerbla requires the Fortran I/O library, and
-# stops the application program if an error occurs.  A C version of xerbla
-# distributed with this software (SuiteSparse_config/xerbla/libcerbla.a)
-# includes a Fortran-callable xerbla routine that prints nothing and does not
-# stop the application program.  This is optional.
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a 
-
-# If you wish to use the XERBLA in LAPACK and/or the BLAS instead,
-# use this option:
-XERBLA = 
-
-# If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead,
-# use this:
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a 
-
-#------------------------------------------------------------------------------
-# GPU configuration for CHOLMOD and SPQR
-#------------------------------------------------------------------------------
-
-# no cuda
-  CUDA_ROOT     =
-  GPU_BLAS_PATH =
-  GPU_CONFIG    =
-  CUDA_PATH     =
-  CUDART_LIB    =
-  CUBLAS_LIB    =
-  CUDA_INC_PATH =
-  NV20          =
-  NV30          =
-  NV35          =
-  NVCC          = echo
-  NVCCFLAGS     =
-
-# with cuda for CHOLMOD
-# CUDA_ROOT     = /usr/local/cuda
-# GPU_BLAS_PATH = $(CUDA_ROOT)
-# with 4 cores (default):
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS
-# with 10 cores:
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10
-# CUDA_PATH     = $(CUDA_ROOT)
-# CUDART_LIB    = $(CUDA_ROOT)/lib64/libcudart.so
-# CUBLAS_LIB    = $(CUDA_ROOT)/lib64/libcublas.so
-# CUDA_INC_PATH = $(CUDA_ROOT)/include/
-# NV20          = -arch=sm_20 -Xcompiler -fPIC
-# NV30          = -arch=sm_30 -Xcompiler -fPIC
-# NV35          = -arch=sm_35 -Xcompiler -fPIC
-# NVCC          = $(CUDA_ROOT)/bin/nvcc
-# NVCCFLAGS     = $(NV20) -O3 -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35
-
-# was NVCC      = $(CUDA_ROOT)/bin/nvcc $(NV35) $(NV30) $(NV20)
-
-#------------------------------------------------------------------------------
-# METIS, optionally used by CHOLMOD
-#------------------------------------------------------------------------------
-
-# If you do not have METIS, or do not wish to use it in CHOLMOD, you must
-# compile CHOLMOD with the -DNPARTITION flag.
-
-# The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc.
-# You may wish to use an absolute path.  METIS is optional.  Compile
-# CHOLMOD with -DNPARTITION if you do not wish to use METIS.
-METIS_PATH = ../../metis-4.0
-METIS = ../../metis-4.0/libmetis.a
-
-#------------------------------------------------------------------------------
-# UMFPACK configuration:
-#------------------------------------------------------------------------------
-
-# Configuration flags for UMFPACK.  See UMFPACK/Source/umf_config.h for details.
-#
-# -DNBLAS       do not use the BLAS.  UMFPACK will be very slow.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#               LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF    do not use the Sun Perf. Library (default is use it on Solaris)
-# -DNRECIPROCAL do not multiply by the reciprocal
-# -DNO_DIVIDE_BY_ZERO   do not divide by zero
-# -DNCHOLMOD    do not use CHOLMOD as a ordering method.  If -DNCHOLMOD is
-#               included in UMFPACK_CONFIG, then UMFPACK  does not rely on
-#               CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS.
-
-UMFPACK_CONFIG =
-
-# uncomment this line to compile UMFPACK without CHOLMOD:
-# UMFPACK_CONFIG = -DNCHOLMOD
-
-#------------------------------------------------------------------------------
-# CHOLMOD configuration
-#------------------------------------------------------------------------------
-
-# CHOLMOD Library Modules, which appear in libcholmod.a:
-# Core          requires: none
-# Check         requires: Core
-# Cholesky      requires: Core, AMD, COLAMD.  optional: Partition, Supernodal
-# MatrixOps     requires: Core
-# Modify        requires: Core
-# Partition     requires: Core, CCOLAMD, METIS.  optional: Cholesky
-# Supernodal    requires: Core, BLAS, LAPACK
-#
-# CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a):
-# Tcov          requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal
-#               optional: Partition
-# Valgrind      same as Tcov
-# Demo          requires: Core, Check, Cholesky, MatrixOps, Supernodal
-#               optional: Partition
-#
-# Configuration flags:
-# -DNCHECK          do not include the Check module.       License GNU LGPL
-# -DNCHOLESKY       do not include the Cholesky module.    License GNU LGPL
-# -DNPARTITION      do not include the Partition module.   License GNU LGPL
-#                   also do not include METIS.
-# -DNCAMD           do not use CAMD, etc from Partition module.    GNU LGPL
-# -DNGPL            do not include any GNU GPL Modules in the CHOLMOD library:
-# -DNMATRIXOPS      do not include the MatrixOps module.   License GNU GPL
-# -DNMODIFY         do not include the Modify module.      License GNU GPL
-# -DNSUPERNODAL     do not include the Supernodal module.  License GNU GPL
-#
-# -DNPRINT          do not print anything.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#                   LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF        for Solaris only.  If defined, do not use the Sun
-#                   Performance Library
-
-CHOLMOD_CONFIG = $(GPU_CONFIG)
-
-# uncomment this line to compile CHOLMOD without METIS:
-# CHOLMOD_CONFIG = -DNPARTITION
-
-#------------------------------------------------------------------------------
-# SuiteSparseQR configuration:
-#------------------------------------------------------------------------------
-
-# The SuiteSparseQR library can be compiled with the following options:
-#
-# -DNPARTITION      do not include the CHOLMOD partition module
-# -DNEXPERT         do not include the functions in SuiteSparseQR_expert.cpp
-# -DHAVE_TBB        enable the use of Intel's Threading Building Blocks (TBB)
-
-# default, without timing, without TBB:
-SPQR_CONFIG = $(GPU_CONFIG)
-# with TBB:
-# SPQR_CONFIG = -DHAVE_TBB
-
-# This is needed for IBM AIX: (but not for and C codes, just C++)
-# SPQR_CONFIG = -DBLAS_NO_UNDERSCORE
-
-# with TBB, you must select this:
-# TBB = -ltbb
-# without TBB:
-TBB =
-
-#------------------------------------------------------------------------------
-# code formatting
-#------------------------------------------------------------------------------
-
-# Use "grep" only, if you do not have "indent"  
-  PRETTY = grep -v "^\#"
-# PRETTY = grep -v "^\#" | indent -bl -nce -ss -bli0 -i4 -sob -l120
-# PRETTY = grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120
-
-#------------------------------------------------------------------------------
-# Linux
-#------------------------------------------------------------------------------
-
-# Using default compilers:
-# CC = gcc
-# CF = $(CFLAGS) -O3 -fexceptions
-
-# alternatives:
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \
-#       -funit-at-a-time
-# CF = $(CFLAGS) -O3 -fexceptions \
-#       -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi
-# CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
-# CF = $(CFLAGS) -O3
-# CF = $(CFLAGS) -O3 -g -fexceptions
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow \
-#       -Wredundant-decls -Wdisabled-optimization -ansi
-
-# consider:
-# -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering
-# -frename-registers -ffast-math -funroll-loops
-
-# Using the Goto BLAS:
-# BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread
-
-# Using Intel's icc and ifort compilers:
-#   (does not work for mexFunctions unless you add a mexopts.sh file)
-# F77 = ifort
-# CC = icc
-# CF = $(CFLAGS) -O3 -xN -vec_report=0
-# CF = $(CFLAGS) -g
-
-# 64bit:
-# F77FLAGS = -O -m64
-# CF = $(CFLAGS) -O3 -fexceptions -m64
-# BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA)
-# LAPACK = -llapack64
-
-# SUSE Linux 10.1, AMD Opteron, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-
-# SUSE Linux 10.1, Intel Pentium, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto -lgfortran
-
-#------------------------------------------------------------------------------
-# Mac
-#------------------------------------------------------------------------------
-
-# As recommended by macports, http://suitesparse.darwinports.com/
-# I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard),
-# on my MacBook Air, and they work fine.
-
-  F77 = gfortran
-  CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER
-  BLAS = -framework Accelerate
-  LAPACK = -framework Accelerate
-  LIB = -lm
-
-#------------------------------------------------------------------------------
-# Solaris
-#------------------------------------------------------------------------------
-
-# 32-bit
-# CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32
-
-# 64-bit
-# CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc
-
-# FFLAGS = -fast -KPIC -dalign -xlibmil -m64
-
-# The Sun Performance Library includes both LAPACK and the BLAS:
-# BLAS = -xlic_lib=sunperf
-# LAPACK =
-
-
-#------------------------------------------------------------------------------
-# Compaq Alpha
-#------------------------------------------------------------------------------
-
-# 64-bit mode only
-# CF = $(CFLAGS) -O2 -std1
-# BLAS = -ldxml
-# LAPACK =
-
-#------------------------------------------------------------------------------
-# IBM RS 6000
-#------------------------------------------------------------------------------
-
-# BLAS = -lessl
-# LAPACK =
-
-# 32-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384
-
-# 64-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64
-
-#------------------------------------------------------------------------------
-# SGI IRIX
-#------------------------------------------------------------------------------
-
-# BLAS = -lscsl
-# LAPACK =
-
-# 32-bit mode
-# CF = $(CFLAGS) -O
-
-# 64-bit mode (32 bit int's and 64-bit long's):
-# CF = $(CFLAGS) -64
-# F77FLAGS = -64
-
-# SGI doesn't have ranlib
-# RANLIB = echo
-
-#------------------------------------------------------------------------------
-# AMD Opteron (64 bit)
-#------------------------------------------------------------------------------
-
-# BLAS = -lgoto_opteron64 -lg2c
-# LAPACK = -llapack_opteron64
-
-# SUSE Linux 10.1, AMD Opteron
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-# LAPACK = -llapack_opteron64
-
-#------------------------------------------------------------------------------
-# remove object files and profile output
-#------------------------------------------------------------------------------
-
-CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_backslash.mk b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_backslash.mk
deleted file mode 100644
index 3ab813c..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_backslash.mk
+++ /dev/null
@@ -1,452 +0,0 @@
-#===============================================================================
-# SuiteSparse_config.mk:  common configuration file for the SuiteSparse
-#===============================================================================
-
-# This file contains all configuration settings for all packages authored or
-# co-authored by Tim Davis:
-#
-# Package Version       Description
-# ------- -------       -----------
-# AMD     1.2 or later  approximate minimum degree ordering
-# COLAMD  2.4 or later  column approximate minimum degree ordering
-# CCOLAMD 1.0 or later  constrained column approximate minimum degree ordering
-# CAMD    any           constrained approximate minimum degree ordering
-# UMFPACK 4.5 or later  sparse LU factorization, with the BLAS
-# CHOLMOD any           sparse Cholesky factorization, update/downdate
-# KLU     0.8 or later  sparse LU factorization, BLAS-free
-# BTF     0.8 or later  permutation to block triangular form
-# LDL     1.2 or later  concise sparse LDL'
-# CXSparse any          extended version of CSparse (int/long, real/complex)
-# SuiteSparseQR any     sparse QR factorization
-# RBio    2.0 or later  read/write sparse matrices in Rutherford-Boeing format
-#
-# By design, this file is NOT included in the CSparse makefile.
-# That package is fully stand-alone.  CSparse is primarily for teaching;
-# production code should use CXSparse.
-#
-# The SuiteSparse_config directory and the above packages should all appear in
-# a single directory, in order for the Makefile's within each package to find
-# this file.
-#
-# To enable an option of the form "# OPTION = ...", edit this file and
-# delete the "#" in the first column of the option you wish to use.
-#
-# The use of METIS 4.0.1 is optional.  To exclude METIS, you must compile with
-# CHOLMOD_CONFIG set to -DNPARTITION.  See below for details.  However, if you
-# do not have a metis-4.0 directory inside the SuiteSparse directory, the
-# */Makefile's that optionally rely on METIS will automatically detect this
-# and compile without METIS.
-
-#------------------------------------------------------------------------------
-# Generic configuration
-#------------------------------------------------------------------------------
-
-# Using standard definitions from the make environment, typically:
-#
-#   CC              cc      C compiler
-#   CXX             g++     C++ compiler
-#   CFLAGS          [ ]     flags for C and C++ compiler
-#   CPPFLAGS        [ ]     flags for C and C++ compiler
-#   TARGET_ARCH     [ ]     target architecture
-#   FFLAGS          [ ]     flags for Fortran compiler
-#   RM              rm -f   delete a file
-#   AR              ar      create a static *.a library archive
-#   ARFLAGS         rv      flags for ar
-#   MAKE            make    make itself (sometimes called gmake)
-#
-# You can redefine them here, but by default they are used from the
-# default make environment.
-
-# To use OpenMP add -openmp to the CFLAGS
-# If OpenMP is used, it is recommended to define CHOLMOD_OMP_NUM_THREADS
-# as the number of cores per socket on the machine being used to maximize
-# memory performance
-  CFLAGS = 
-# CFLAGS = -g
-# for the icc compiler and OpenMP:
-# CFLAGS = -openmp
-
-# C and C++ compiler flags.  The first three are standard for *.c and *.cpp
-# Add -DNTIMER if you do use any timing routines (otherwise -lrt is required).
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER
-  CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC
-# for the MKL BLAS:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -I$(MKLROOT)/include -D_GNU_SOURCE
-# with no optimization:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)     -fexceptions -fPIC
-
-# ranlib, and ar, for generating libraries.  If you don't need ranlib,
-# just change it to RANLAB = echo
-RANLIB = ranlib
-ARCHIVE = $(AR) $(ARFLAGS)
-
-# copy and delete a file
-CP = cp -f
-MV = mv -f
-
-# Fortran compiler (not required for 'make' or 'make library')
-F77 = gfortran
-F77FLAGS = $(FFLAGS) -O
-F77LIB =
-
-# C and Fortran libraries.  Remove -lrt if you don't have it.
-  LIB = -lm -lrt
-# Using the following requires CF = ... -DNTIMER on POSIX C systems.
-# LIB = -lm
-
-# For "make install"
-INSTALL_LIB = /usr/local/lib
-INSTALL_INCLUDE = /usr/local/include
-
-# Which version of MAKE you are using (default is "make")
-# MAKE = make
-# MAKE = gmake
-
-#------------------------------------------------------------------------------
-# BLAS and LAPACK configuration:
-#------------------------------------------------------------------------------
-
-# UMFPACK and CHOLMOD both require the BLAS.  CHOLMOD also requires LAPACK.
-# See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or
-# http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD.
-# LAPACK is at http://www.netlib.org/lapack/ .  You can use the standard
-# Fortran LAPACK along with Goto's BLAS to obtain very good performance.
-# CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz
-# Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops
-# on a 2.5Ghz dual-core AMD Opteron.
-
-# These settings will probably not work, since there is no fixed convention for
-# naming the BLAS and LAPACK library (*.a or *.so) files.
-
-# This is probably slow ... it might connect to the Standard Reference BLAS:
-# BLAS = -lblas -lgfortran
-  LAPACK = -llapack
-
-# MKL 
-# BLAS = -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
-# LAPACK = 
-
-# ACML
-# BLAS = -lacml -lgfortran
-# LAPACK =
-
-# OpenBLAS
-  BLAS = -lopenblas
-# LAPACK = 
-
-# NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto"
-# statement.  Rather, the Goto BLAS is written by Dr. Kazushige Goto.
-# Using the Goto BLAS:
-# BLAS = -lgoto -lgfortran -lgfortranbegin
-# BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread
-
-# Using non-optimized versions:
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack_plain
-
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack
-
-# The BLAS might not contain xerbla, an error-handling routine for LAPACK and
-# the BLAS.  Also, the standard xerbla requires the Fortran I/O library, and
-# stops the application program if an error occurs.  A C version of xerbla
-# distributed with this software (SuiteSparse_config/xerbla/libcerbla.a)
-# includes a Fortran-callable xerbla routine that prints nothing and does not
-# stop the application program.  This is optional.
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a 
-
-# If you wish to use the XERBLA in LAPACK and/or the BLAS instead,
-# use this option:
-XERBLA = 
-
-# If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead,
-# use this:
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a 
-
-#------------------------------------------------------------------------------
-# GPU configuration for CHOLMOD and SPQR
-#------------------------------------------------------------------------------
-
-# no cuda
-  CUDA_ROOT     =
-  GPU_BLAS_PATH =
-  GPU_CONFIG    =
-  CUDA_PATH     =
-  CUDART_LIB    =
-  CUBLAS_LIB    =
-  CUDA_INC_PATH =
-  NV20          =
-  NV30          =
-  NV35          =
-  NVCC          = echo
-  NVCCFLAGS     =
-
-# with cuda for CHOLMOD
-# CUDA_ROOT     = /usr/local/cuda
-# GPU_BLAS_PATH = $(CUDA_ROOT)
-# with 4 cores (default):
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS
-# with 10 cores:
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10
-# CUDA_PATH     = $(CUDA_ROOT)
-# CUDART_LIB    = $(CUDA_ROOT)/lib64/libcudart.so
-# CUBLAS_LIB    = $(CUDA_ROOT)/lib64/libcublas.so
-# CUDA_INC_PATH = $(CUDA_ROOT)/include/
-# NV20          = -arch=sm_20 -Xcompiler -fPIC
-# NV30          = -arch=sm_30 -Xcompiler -fPIC
-# NV35          = -arch=sm_35 -Xcompiler -fPIC
-# NVCC          = $(CUDA_ROOT)/bin/nvcc
-# NVCCFLAGS     = $(NV20) -O3 -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35
-
-# was NVCC      = $(CUDA_ROOT)/bin/nvcc $(NV35) $(NV30) $(NV20)
-
-#------------------------------------------------------------------------------
-# METIS, optionally used by CHOLMOD
-#------------------------------------------------------------------------------
-
-# If you do not have METIS, or do not wish to use it in CHOLMOD, you must
-# compile CHOLMOD with the -DNPARTITION flag.
-
-# The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc.
-# You may wish to use an absolute path.  METIS is optional.  Compile
-# CHOLMOD with -DNPARTITION if you do not wish to use METIS.
-METIS_PATH = ../../metis-4.0
-METIS = ../../metis-4.0/libmetis.a
-
-#------------------------------------------------------------------------------
-# UMFPACK configuration:
-#------------------------------------------------------------------------------
-
-# Configuration flags for UMFPACK.  See UMFPACK/Source/umf_config.h for details.
-#
-# -DNBLAS       do not use the BLAS.  UMFPACK will be very slow.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#               LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF    do not use the Sun Perf. Library (default is use it on Solaris)
-# -DNRECIPROCAL do not multiply by the reciprocal
-# -DNO_DIVIDE_BY_ZERO   do not divide by zero
-# -DNCHOLMOD    do not use CHOLMOD as a ordering method.  If -DNCHOLMOD is
-#               included in UMFPACK_CONFIG, then UMFPACK  does not rely on
-#               CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS.
-
-UMFPACK_CONFIG =
-
-# uncomment this line to compile UMFPACK without CHOLMOD:
-# UMFPACK_CONFIG = -DNCHOLMOD
-
-#------------------------------------------------------------------------------
-# CHOLMOD configuration
-#------------------------------------------------------------------------------
-
-# CHOLMOD Library Modules, which appear in libcholmod.a:
-# Core          requires: none
-# Check         requires: Core
-# Cholesky      requires: Core, AMD, COLAMD.  optional: Partition, Supernodal
-# MatrixOps     requires: Core
-# Modify        requires: Core
-# Partition     requires: Core, CCOLAMD, METIS.  optional: Cholesky
-# Supernodal    requires: Core, BLAS, LAPACK
-#
-# CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a):
-# Tcov          requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal
-#               optional: Partition
-# Valgrind      same as Tcov
-# Demo          requires: Core, Check, Cholesky, MatrixOps, Supernodal
-#               optional: Partition
-#
-# Configuration flags:
-# -DNCHECK          do not include the Check module.       License GNU LGPL
-# -DNCHOLESKY       do not include the Cholesky module.    License GNU LGPL
-# -DNPARTITION      do not include the Partition module.   License GNU LGPL
-#                   also do not include METIS.
-# -DNCAMD           do not use CAMD, etc from Partition module.    GNU LGPL
-# -DNGPL            do not include any GNU GPL Modules in the CHOLMOD library:
-# -DNMATRIXOPS      do not include the MatrixOps module.   License GNU GPL
-# -DNMODIFY         do not include the Modify module.      License GNU GPL
-# -DNSUPERNODAL     do not include the Supernodal module.  License GNU GPL
-#
-# -DNPRINT          do not print anything.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#                   LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF        for Solaris only.  If defined, do not use the Sun
-#                   Performance Library
-
-CHOLMOD_CONFIG = $(GPU_CONFIG)
-
-# uncomment this line to compile CHOLMOD without METIS:
-# CHOLMOD_CONFIG = -DNPARTITION
-
-#------------------------------------------------------------------------------
-# SuiteSparseQR configuration:
-#------------------------------------------------------------------------------
-
-# The SuiteSparseQR library can be compiled with the following options:
-#
-# -DNPARTITION      do not include the CHOLMOD partition module
-# -DNEXPERT         do not include the functions in SuiteSparseQR_expert.cpp
-# -DHAVE_TBB        enable the use of Intel's Threading Building Blocks (TBB)
-
-# default, without timing, without TBB:
-SPQR_CONFIG = $(GPU_CONFIG)
-# with TBB:
-# SPQR_CONFIG = -DHAVE_TBB
-
-# This is needed for IBM AIX: (but not for and C codes, just C++)
-# SPQR_CONFIG = -DBLAS_NO_UNDERSCORE
-
-# with TBB, you must select this:
-# TBB = -ltbb
-# without TBB:
-TBB =
-
-#------------------------------------------------------------------------------
-# code formatting
-#------------------------------------------------------------------------------
-
-# Use "grep" only, if you do not have "indent"  
-# PRETTY = grep -v "^\#"
-# PRETTY = grep -v "^\#" | indent -bl -nce -ss -bli0 -i4 -sob -l120
-  PRETTY = grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120
-
-#------------------------------------------------------------------------------
-# Linux
-#------------------------------------------------------------------------------
-
-# Using default compilers:
-# CC = gcc
-# CF = $(CFLAGS) -O3 -fexceptions
-
-# alternatives:
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \
-#       -funit-at-a-time
-# CF = $(CFLAGS) -O3 -fexceptions \
-#       -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi
-# CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
-# CF = $(CFLAGS) -O3
-# CF = $(CFLAGS) -O3 -g -fexceptions
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow \
-#       -Wredundant-decls -Wdisabled-optimization -ansi
-
-# consider:
-# -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering
-# -frename-registers -ffast-math -funroll-loops
-
-# Using the Goto BLAS:
-# BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread
-
-# Using Intel's icc and ifort compilers:
-#   (does not work for mexFunctions unless you add a mexopts.sh file)
-# F77 = ifort
-# CC = icc
-# CF = $(CFLAGS) -O3 -xN -vec_report=0
-# CF = $(CFLAGS) -g
-
-# 64bit:
-# F77FLAGS = -O -m64
-# CF = $(CFLAGS) -O3 -fexceptions -m64
-# BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA)
-# LAPACK = -llapack64
-
-# SUSE Linux 10.1, AMD Opteron, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-
-# SUSE Linux 10.1, Intel Pentium, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto -lgfortran
-
-#------------------------------------------------------------------------------
-# Mac
-#------------------------------------------------------------------------------
-
-# As recommended by macports, http://suitesparse.darwinports.com/
-# I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard),
-# on my MacBook Air, and they work fine.
-
-# F77 = gfortran
-# CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER
-# BLAS = -framework Accelerate
-# LAPACK = -framework Accelerate
-# LIB = -lm
-
-#------------------------------------------------------------------------------
-# Solaris
-#------------------------------------------------------------------------------
-
-# 32-bit
-# CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32
-
-# 64-bit
-# CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc
-
-# FFLAGS = -fast -KPIC -dalign -xlibmil -m64
-
-# The Sun Performance Library includes both LAPACK and the BLAS:
-# BLAS = -xlic_lib=sunperf
-# LAPACK =
-
-
-#------------------------------------------------------------------------------
-# Compaq Alpha
-#------------------------------------------------------------------------------
-
-# 64-bit mode only
-# CF = $(CFLAGS) -O2 -std1
-# BLAS = -ldxml
-# LAPACK =
-
-#------------------------------------------------------------------------------
-# IBM RS 6000
-#------------------------------------------------------------------------------
-
-# BLAS = -lessl
-# LAPACK =
-
-# 32-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384
-
-# 64-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64
-
-#------------------------------------------------------------------------------
-# SGI IRIX
-#------------------------------------------------------------------------------
-
-# BLAS = -lscsl
-# LAPACK =
-
-# 32-bit mode
-# CF = $(CFLAGS) -O
-
-# 64-bit mode (32 bit int's and 64-bit long's):
-# CF = $(CFLAGS) -64
-# F77FLAGS = -64
-
-# SGI doesn't have ranlib
-# RANLIB = echo
-
-#------------------------------------------------------------------------------
-# AMD Opteron (64 bit)
-#------------------------------------------------------------------------------
-
-# BLAS = -lgoto_opteron64 -lg2c
-# LAPACK = -llapack_opteron64
-
-# SUSE Linux 10.1, AMD Opteron
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-# LAPACK = -llapack_opteron64
-
-#------------------------------------------------------------------------------
-# remove object files and profile output
-#------------------------------------------------------------------------------
-
-CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno
diff --git a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_linux.mk b/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_linux.mk
deleted file mode 100644
index ba2da23..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/SuiteSparse_config_linux.mk
+++ /dev/null
@@ -1,452 +0,0 @@
-#===============================================================================
-# SuiteSparse_config.mk:  common configuration file for the SuiteSparse
-#===============================================================================
-
-# This file contains all configuration settings for all packages authored or
-# co-authored by Tim Davis:
-#
-# Package Version       Description
-# ------- -------       -----------
-# AMD     1.2 or later  approximate minimum degree ordering
-# COLAMD  2.4 or later  column approximate minimum degree ordering
-# CCOLAMD 1.0 or later  constrained column approximate minimum degree ordering
-# CAMD    any           constrained approximate minimum degree ordering
-# UMFPACK 4.5 or later  sparse LU factorization, with the BLAS
-# CHOLMOD any           sparse Cholesky factorization, update/downdate
-# KLU     0.8 or later  sparse LU factorization, BLAS-free
-# BTF     0.8 or later  permutation to block triangular form
-# LDL     1.2 or later  concise sparse LDL'
-# CXSparse any          extended version of CSparse (int/long, real/complex)
-# SuiteSparseQR any     sparse QR factorization
-# RBio    2.0 or later  read/write sparse matrices in Rutherford-Boeing format
-#
-# By design, this file is NOT included in the CSparse makefile.
-# That package is fully stand-alone.  CSparse is primarily for teaching;
-# production code should use CXSparse.
-#
-# The SuiteSparse_config directory and the above packages should all appear in
-# a single directory, in order for the Makefile's within each package to find
-# this file.
-#
-# To enable an option of the form "# OPTION = ...", edit this file and
-# delete the "#" in the first column of the option you wish to use.
-#
-# The use of METIS 4.0.1 is optional.  To exclude METIS, you must compile with
-# CHOLMOD_CONFIG set to -DNPARTITION.  See below for details.  However, if you
-# do not have a metis-4.0 directory inside the SuiteSparse directory, the
-# */Makefile's that optionally rely on METIS will automatically detect this
-# and compile without METIS.
-
-#------------------------------------------------------------------------------
-# Generic configuration
-#------------------------------------------------------------------------------
-
-# Using standard definitions from the make environment, typically:
-#
-#   CC              cc      C compiler
-#   CXX             g++     C++ compiler
-#   CFLAGS          [ ]     flags for C and C++ compiler
-#   CPPFLAGS        [ ]     flags for C and C++ compiler
-#   TARGET_ARCH     [ ]     target architecture
-#   FFLAGS          [ ]     flags for Fortran compiler
-#   RM              rm -f   delete a file
-#   AR              ar      create a static *.a library archive
-#   ARFLAGS         rv      flags for ar
-#   MAKE            make    make itself (sometimes called gmake)
-#
-# You can redefine them here, but by default they are used from the
-# default make environment.
-
-# To use OpenMP add -openmp to the CFLAGS
-# If OpenMP is used, it is recommended to define CHOLMOD_OMP_NUM_THREADS
-# as the number of cores per socket on the machine being used to maximize
-# memory performance
-  CFLAGS = 
-# CFLAGS = -g
-# for the icc compiler and OpenMP:
-# CFLAGS = -openmp
-
-# C and C++ compiler flags.  The first three are standard for *.c and *.cpp
-# Add -DNTIMER if you do use any timing routines (otherwise -lrt is required).
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -DNTIMER
-  CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC
-# for the MKL BLAS:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -O3 -fexceptions -fPIC -I$(MKLROOT)/include -D_GNU_SOURCE
-# with no optimization:
-# CF = $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)     -fexceptions -fPIC
-
-# ranlib, and ar, for generating libraries.  If you don't need ranlib,
-# just change it to RANLAB = echo
-RANLIB = ranlib
-ARCHIVE = $(AR) $(ARFLAGS)
-
-# copy and delete a file
-CP = cp -f
-MV = mv -f
-
-# Fortran compiler (not required for 'make' or 'make library')
-F77 = gfortran
-F77FLAGS = $(FFLAGS) -O
-F77LIB =
-
-# C and Fortran libraries.  Remove -lrt if you don't have it.
-  LIB = -lm -lrt
-# Using the following requires CF = ... -DNTIMER on POSIX C systems.
-# LIB = -lm
-
-# For "make install"
-INSTALL_LIB = /usr/local/lib
-INSTALL_INCLUDE = /usr/local/include
-
-# Which version of MAKE you are using (default is "make")
-# MAKE = make
-# MAKE = gmake
-
-#------------------------------------------------------------------------------
-# BLAS and LAPACK configuration:
-#------------------------------------------------------------------------------
-
-# UMFPACK and CHOLMOD both require the BLAS.  CHOLMOD also requires LAPACK.
-# See Kazushige Goto's BLAS at http://www.cs.utexas.edu/users/flame/goto/ or
-# http://www.tacc.utexas.edu/~kgoto/ for the best BLAS to use with CHOLMOD.
-# LAPACK is at http://www.netlib.org/lapack/ .  You can use the standard
-# Fortran LAPACK along with Goto's BLAS to obtain very good performance.
-# CHOLMOD gets a peak numeric factorization rate of 3.6 Gflops on a 3.2 GHz
-# Pentium 4 (512K cache, 4GB main memory) with the Goto BLAS, and 6 Gflops
-# on a 2.5Ghz dual-core AMD Opteron.
-
-# These settings will probably not work, since there is no fixed convention for
-# naming the BLAS and LAPACK library (*.a or *.so) files.
-
-# This is probably slow ... it might connect to the Standard Reference BLAS:
-  BLAS = -lblas -lgfortran
-  LAPACK = -llapack
-
-# MKL 
-# BLAS = -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm
-# LAPACK = 
-
-# ACML
-# BLAS = -lacml -lgfortran
-# LAPACK =
-
-# OpenBLAS
-# BLAS = -lopenblas
-# LAPACK = 
-
-# NOTE: this next option for the "Goto BLAS" has nothing to do with a "goto"
-# statement.  Rather, the Goto BLAS is written by Dr. Kazushige Goto.
-# Using the Goto BLAS:
-# BLAS = -lgoto -lgfortran -lgfortranbegin
-# BLAS = -lgoto2 -lgfortran -lgfortranbegin -lpthread
-
-# Using non-optimized versions:
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack_plain
-
-# BLAS = -lblas_plain -lgfortran -lgfortranbegin
-# LAPACK = -llapack
-
-# The BLAS might not contain xerbla, an error-handling routine for LAPACK and
-# the BLAS.  Also, the standard xerbla requires the Fortran I/O library, and
-# stops the application program if an error occurs.  A C version of xerbla
-# distributed with this software (SuiteSparse_config/xerbla/libcerbla.a)
-# includes a Fortran-callable xerbla routine that prints nothing and does not
-# stop the application program.  This is optional.
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libcerbla.a 
-
-# If you wish to use the XERBLA in LAPACK and/or the BLAS instead,
-# use this option:
-XERBLA = 
-
-# If you wish to use the Fortran SuiteSparse_config/xerbla/xerbla.f instead,
-# use this:
-
-# XERBLA = ../../SuiteSparse_config/xerbla/libxerbla.a 
-
-#------------------------------------------------------------------------------
-# GPU configuration for CHOLMOD and SPQR
-#------------------------------------------------------------------------------
-
-# no cuda
-  CUDA_ROOT     =
-  GPU_BLAS_PATH =
-  GPU_CONFIG    =
-  CUDA_PATH     =
-  CUDART_LIB    =
-  CUBLAS_LIB    =
-  CUDA_INC_PATH =
-  NV20          =
-  NV30          =
-  NV35          =
-  NVCC          = echo
-  NVCCFLAGS     =
-
-# with cuda for CHOLMOD
-# CUDA_ROOT     = /usr/local/cuda
-# GPU_BLAS_PATH = $(CUDA_ROOT)
-# with 4 cores (default):
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS
-# with 10 cores:
-# GPU_CONFIG    = -I$(CUDA_ROOT)/include -DGPU_BLAS -DCHOLMOD_OMP_NUM_THREADS=10
-# CUDA_PATH     = $(CUDA_ROOT)
-# CUDART_LIB    = $(CUDA_ROOT)/lib64/libcudart.so
-# CUBLAS_LIB    = $(CUDA_ROOT)/lib64/libcublas.so
-# CUDA_INC_PATH = $(CUDA_ROOT)/include/
-# NV20          = -arch=sm_20 -Xcompiler -fPIC
-# NV30          = -arch=sm_30 -Xcompiler -fPIC
-# NV35          = -arch=sm_35 -Xcompiler -fPIC
-# NVCC          = $(CUDA_ROOT)/bin/nvcc
-# NVCCFLAGS     = $(NV20) -O3 -gencode=arch=compute_20,code=sm_20 -gencode=arch=compute_30,code=sm_30 -gencode=arch=compute_35,code=sm_35
-
-# was NVCC      = $(CUDA_ROOT)/bin/nvcc $(NV35) $(NV30) $(NV20)
-
-#------------------------------------------------------------------------------
-# METIS, optionally used by CHOLMOD
-#------------------------------------------------------------------------------
-
-# If you do not have METIS, or do not wish to use it in CHOLMOD, you must
-# compile CHOLMOD with the -DNPARTITION flag.
-
-# The path is relative to where it is used, in CHOLMOD/Lib, CHOLMOD/MATLAB, etc.
-# You may wish to use an absolute path.  METIS is optional.  Compile
-# CHOLMOD with -DNPARTITION if you do not wish to use METIS.
-METIS_PATH = ../../metis-4.0
-METIS = ../../metis-4.0/libmetis.a
-
-#------------------------------------------------------------------------------
-# UMFPACK configuration:
-#------------------------------------------------------------------------------
-
-# Configuration flags for UMFPACK.  See UMFPACK/Source/umf_config.h for details.
-#
-# -DNBLAS       do not use the BLAS.  UMFPACK will be very slow.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#               LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF    do not use the Sun Perf. Library (default is use it on Solaris)
-# -DNRECIPROCAL do not multiply by the reciprocal
-# -DNO_DIVIDE_BY_ZERO   do not divide by zero
-# -DNCHOLMOD    do not use CHOLMOD as a ordering method.  If -DNCHOLMOD is
-#               included in UMFPACK_CONFIG, then UMFPACK  does not rely on
-#               CHOLMOD, CAMD, CCOLAMD, COLAMD, and METIS.
-
-UMFPACK_CONFIG =
-
-# uncomment this line to compile UMFPACK without CHOLMOD:
-# UMFPACK_CONFIG = -DNCHOLMOD
-
-#------------------------------------------------------------------------------
-# CHOLMOD configuration
-#------------------------------------------------------------------------------
-
-# CHOLMOD Library Modules, which appear in libcholmod.a:
-# Core          requires: none
-# Check         requires: Core
-# Cholesky      requires: Core, AMD, COLAMD.  optional: Partition, Supernodal
-# MatrixOps     requires: Core
-# Modify        requires: Core
-# Partition     requires: Core, CCOLAMD, METIS.  optional: Cholesky
-# Supernodal    requires: Core, BLAS, LAPACK
-#
-# CHOLMOD test/demo Modules (all are GNU GPL, do not appear in libcholmod.a):
-# Tcov          requires: Core, Check, Cholesky, MatrixOps, Modify, Supernodal
-#               optional: Partition
-# Valgrind      same as Tcov
-# Demo          requires: Core, Check, Cholesky, MatrixOps, Supernodal
-#               optional: Partition
-#
-# Configuration flags:
-# -DNCHECK          do not include the Check module.       License GNU LGPL
-# -DNCHOLESKY       do not include the Cholesky module.    License GNU LGPL
-# -DNPARTITION      do not include the Partition module.   License GNU LGPL
-#                   also do not include METIS.
-# -DNCAMD           do not use CAMD, etc from Partition module.    GNU LGPL
-# -DNGPL            do not include any GNU GPL Modules in the CHOLMOD library:
-# -DNMATRIXOPS      do not include the MatrixOps module.   License GNU GPL
-# -DNMODIFY         do not include the Modify module.      License GNU GPL
-# -DNSUPERNODAL     do not include the Supernodal module.  License GNU GPL
-#
-# -DNPRINT          do not print anything.
-# -D'LONGBLAS=long' or -DLONGBLAS='long long' defines the integers used by
-#                   LAPACK and the BLAS (defaults to 'int')
-# -DNSUNPERF        for Solaris only.  If defined, do not use the Sun
-#                   Performance Library
-
-CHOLMOD_CONFIG = $(GPU_CONFIG)
-
-# uncomment this line to compile CHOLMOD without METIS:
-# CHOLMOD_CONFIG = -DNPARTITION
-
-#------------------------------------------------------------------------------
-# SuiteSparseQR configuration:
-#------------------------------------------------------------------------------
-
-# The SuiteSparseQR library can be compiled with the following options:
-#
-# -DNPARTITION      do not include the CHOLMOD partition module
-# -DNEXPERT         do not include the functions in SuiteSparseQR_expert.cpp
-# -DHAVE_TBB        enable the use of Intel's Threading Building Blocks (TBB)
-
-# default, without timing, without TBB:
-SPQR_CONFIG = $(GPU_CONFIG)
-# with TBB:
-# SPQR_CONFIG = -DHAVE_TBB
-
-# This is needed for IBM AIX: (but not for and C codes, just C++)
-# SPQR_CONFIG = -DBLAS_NO_UNDERSCORE
-
-# with TBB, you must select this:
-# TBB = -ltbb
-# without TBB:
-TBB =
-
-#------------------------------------------------------------------------------
-# code formatting
-#------------------------------------------------------------------------------
-
-# Use "grep" only, if you do not have "indent"  
-# PRETTY = grep -v "^\#"
-# PRETTY = grep -v "^\#" | indent -bl -nce -ss -bli0 -i4 -sob -l120
-  PRETTY = grep -v "^\#" | indent -bl -nce -bli0 -i4 -sob -l120
-
-#------------------------------------------------------------------------------
-# Linux
-#------------------------------------------------------------------------------
-
-# Using default compilers:
-# CC = gcc
-# CF = $(CFLAGS) -O3 -fexceptions
-
-# alternatives:
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi \
-#       -funit-at-a-time
-# CF = $(CFLAGS) -O3 -fexceptions \
-#       -Wall -W -Werror -Wshadow -Wmissing-prototypes -Wstrict-prototypes \
-#       -Wredundant-decls -Wnested-externs -Wdisabled-optimization -ansi
-# CF = $(CFLAGS) -O3 -fexceptions -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
-# CF = $(CFLAGS) -O3
-# CF = $(CFLAGS) -O3 -g -fexceptions
-# CF = $(CFLAGS) -g -fexceptions \
-#       -Wall -W -Wshadow \
-#       -Wredundant-decls -Wdisabled-optimization -ansi
-
-# consider:
-# -fforce-addr -fmove-all-movables -freduce-all-givs -ftsp-ordering
-# -frename-registers -ffast-math -funroll-loops
-
-# Using the Goto BLAS:
-# BLAS = -lgoto -lfrtbegin -lg2c $(XERBLA) -lpthread
-
-# Using Intel's icc and ifort compilers:
-#   (does not work for mexFunctions unless you add a mexopts.sh file)
-# F77 = ifort
-# CC = icc
-# CF = $(CFLAGS) -O3 -xN -vec_report=0
-# CF = $(CFLAGS) -g
-
-# 64bit:
-# F77FLAGS = -O -m64
-# CF = $(CFLAGS) -O3 -fexceptions -m64
-# BLAS = -lgoto64 -lfrtbegin -lg2c -lpthread $(XERBLA)
-# LAPACK = -llapack64
-
-# SUSE Linux 10.1, AMD Opteron, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-
-# SUSE Linux 10.1, Intel Pentium, with GOTO Blas
-# F77 = gfortran
-# BLAS = -lgoto -lgfortran
-
-#------------------------------------------------------------------------------
-# Mac
-#------------------------------------------------------------------------------
-
-# As recommended by macports, http://suitesparse.darwinports.com/
-# I've tested them myself on Mac OSX 10.6.1 and 10.6.8 (Snow Leopard),
-# on my MacBook Air, and they work fine.
-
-# F77 = gfortran
-# CF = $(CFLAGS) -O3 -fno-common -fexceptions -DNTIMER
-# BLAS = -framework Accelerate
-# LAPACK = -framework Accelerate
-# LIB = -lm
-
-#------------------------------------------------------------------------------
-# Solaris
-#------------------------------------------------------------------------------
-
-# 32-bit
-# CF = $(CFLAGS) -KPIC -dalign -xc99=%none -Xc -xlibmieee -xO5 -xlibmil -m32
-
-# 64-bit
-# CF = $(CFLAGS) -fast -KPIC -xc99=%none -xlibmieee -xlibmil -m64 -Xc
-
-# FFLAGS = -fast -KPIC -dalign -xlibmil -m64
-
-# The Sun Performance Library includes both LAPACK and the BLAS:
-# BLAS = -xlic_lib=sunperf
-# LAPACK =
-
-
-#------------------------------------------------------------------------------
-# Compaq Alpha
-#------------------------------------------------------------------------------
-
-# 64-bit mode only
-# CF = $(CFLAGS) -O2 -std1
-# BLAS = -ldxml
-# LAPACK =
-
-#------------------------------------------------------------------------------
-# IBM RS 6000
-#------------------------------------------------------------------------------
-
-# BLAS = -lessl
-# LAPACK =
-
-# 32-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384
-
-# 64-bit mode:
-# CF = $(CFLAGS) -O4 -qipa -qmaxmem=16384 -q64 -qproto
-# F77FLAGS = -O4 -qipa -qmaxmem=16384 -q64
-
-#------------------------------------------------------------------------------
-# SGI IRIX
-#------------------------------------------------------------------------------
-
-# BLAS = -lscsl
-# LAPACK =
-
-# 32-bit mode
-# CF = $(CFLAGS) -O
-
-# 64-bit mode (32 bit int's and 64-bit long's):
-# CF = $(CFLAGS) -64
-# F77FLAGS = -64
-
-# SGI doesn't have ranlib
-# RANLIB = echo
-
-#------------------------------------------------------------------------------
-# AMD Opteron (64 bit)
-#------------------------------------------------------------------------------
-
-# BLAS = -lgoto_opteron64 -lg2c
-# LAPACK = -llapack_opteron64
-
-# SUSE Linux 10.1, AMD Opteron
-# F77 = gfortran
-# BLAS = -lgoto_opteron64 -lgfortran
-# LAPACK = -llapack_opteron64
-
-#------------------------------------------------------------------------------
-# remove object files and profile output
-#------------------------------------------------------------------------------
-
-CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d *.gcda *.gcno
diff --git a/src/C/SuiteSparse/SuiteSparse_config/xerbla/Makefile b/src/C/SuiteSparse/SuiteSparse_config/xerbla/Makefile
deleted file mode 100644
index 9de7330..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/xerbla/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-# Makefile for null-output xerbla
-
-default: ccode
-
-include ../SuiteSparse_config.mk
-
-ccode: libcerbla.a
-
-fortran: libxerbla.a 
-
-all: libxerbla.a libcerbla.a
-
-# Fortran version:
-libxerbla.a: xerbla.f
-	$(F77) $(F77FLAGS) -c xerbla.f
-	$(ARCHIVE)  libxerbla.a xerbla.o
-	- $(RANLIB) libxerbla.a
-	- $(RM) xerbla.o
-
-# C version:
-libcerbla.a: xerbla.c xerbla.h
-	$(CC) $(CF) -c xerbla.c
-	$(ARCHIVE)  libcerbla.a xerbla.o
-	- $(RANLIB) libcerbla.a
-	- $(RM) xerbla.o
-
-distclean: purge
-
-purge: clean
-	- $(RM) *.o *.a
-
-clean:
-	- $(RM) $(CLEAN)
diff --git a/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.c b/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.c
deleted file mode 100644
index 5107f03..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.c
+++ /dev/null
@@ -1,12 +0,0 @@
-
-void xerbla_ (char *srname, int *info)
-{
-    /* do nothing */ ;
-}
-
-
-void xerbla (char *srname, int *info)
-{
-    /* do nothing */ ;
-}
-
diff --git a/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.f b/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.f
deleted file mode 100644
index 4272004..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.f
+++ /dev/null
@@ -1,46 +0,0 @@
-      SUBROUTINE XERBLA( SRNAME, INFO )
-*
-*  -- LAPACK auxiliary 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*6        SRNAME
-      INTEGER            INFO
-*     ..
-*
-*  Purpose
-*  =======
-*
-*  XERBLA  is an error handler for the LAPACK routines.
-*  It is called by an LAPACK routine if an input parameter has an
-*  invalid value.  A message is printed and execution stops.
-*
-*  Installers may consider modifying the STOP statement in order to
-*  call system-specific exception-handling facilities.
-*
-*  Arguments
-*  =========
-*
-*  SRNAME  (input) CHARACTER*6
-*          The name of the routine which called XERBLA.
-*
-*  INFO    (input) INTEGER
-*          The position of the invalid parameter in the parameter list
-*          of the calling routine.
-*
-* =====================================================================
-*
-*     .. Executable Statements ..
-*
-*****      WRITE( *, FMT = 9999 )SRNAME, INFO
-*
-*****      STOP
-*
-***** 9999 FORMAT( ' ** On entry to ', A6, ' parameter number ', I2, ' had ',
-*****     $      'an illegal value' )
-*
-*     End of XERBLA
-*
-      END
diff --git a/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.h b/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.h
deleted file mode 100644
index b332eb3..0000000
--- a/src/C/SuiteSparse/SuiteSparse_config/xerbla/xerbla.h
+++ /dev/null
@@ -1,2 +0,0 @@
-void xerbla_ (char *srname, int *info) ;
-void xerbla  (char *srname, int *info) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Doc/ChangeLog b/src/C/SuiteSparse/UMFPACK/Doc/ChangeLog
deleted file mode 100644
index 5736af7..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/ChangeLog
+++ /dev/null
@@ -1,538 +0,0 @@
-Oct 10, 2014: version 5.7.1
-
-    modified MATLAB/umfpack_make.m.  No change to C code except version number.
-
-July 31, 2013: version 5.7.0
-
-    * changed malloc, printf, hypot and divcomplex pointers to use
-        SuiteSparse_config
-
-April 25, 2013: version 5.6.2
-
-    * bug fix in Demo/Makefile for Fortran interface
-
-Jun 20, 2012: verison 5.6.1
-
-    * minor update for Windows (removed filesep)
-
-Jun 1, 2012: version 5.6.0
-
-    * UFconfig replaced with SuiteSparse_config
-    * -DNO_TIMER option removed.  See SuiteSparse_config to configure the timer.
-
-Dec 7, 2011, version 5.5.2
-
-    * fixed the Makefile to better align with CFLAGS and other standards
-    * minor fix to umfpack_make.m
-    * Makefile now detects whether or not METIS is present, and
-        sets -DNPARTITION if it is not
-
-Jan 25, 2011, version 5.5.1
-
-    * minor fix to "make install"
-    * Demo/Makefile updated, to allow for METIS to be in a non-default path
-
-Nov 30, 2009, version 5.5.0
-
-    * changed and simplified how UMFPACK connects to 64-bit BLAS
-    * added user-ordering function option (umfpack_*_fsymbolic)
-    * added interface to CHOLMOD's ordering methods (METIS, in particular)
-    * added an option to disable the search for singletons.  Disabling this
-        search for singletons can slow UMFPACK down quite a bit for some
-        matrices, but it does ensure that L is well-conditioned and that
-        any ill-conditioning of A is captured only in U.
-    * removed UMFPACK/MATLAB/GNUmakefile and UMFPACK/MATLAB/Makefile;
-        to compile the UMFPACK mexFunction, use umfpack_make.m in MATLAB.
-    * added "make install" and "make uninstall"
-
-May 20, 2009, version 5.4.0
-
-    * bug fix in umfpack_make.m for Windows
-    * disabled 2-by-2 strategy.  It conflicts with how structurally singular
-	matrices are handled.
-
-March 24, 2009, version 5.3.0
-
-    * bug fix for 2-by-2 strategy (diagonal map) for structurally singular
-	matrices
-
-    * compiler workaround for gcc 4.2.{3,4} in umf_singletons.c
-
-    * added additional timer options in umfpack_timer.c (for POSIX)
-
-Sept 22, 2008
-
-    * minor update to documentation; no change to code
-
-Nov 1, 2007, version 5.2.0
-
-    * change of license to GNU GPL from GNU LGPL.  This is the primary change to
-	this version.
-
-    * minor lint cleanup
-
-    * port to MATLAB 7.5 (added -lmwblas to mex command)
-
-    * added info output to the umfpack_btf command.
-
-May 31, 2007, version 5.1.0
-
-    * port to 64-bit MATLAB
-
-    * Makefiles updated to reflect directory changes to AMD (UMFPACK v5.1.0
-	requires AMD v2.2.0)
-
-    * Source/Makefile and GNUMakefile moved to Lib/
-
-Dec 12, 2006: version 5.0.3
-
-    * minor MATLAB cleanup.  Renamed umfpack mexFunction to umfpack2, to avoid
-	filename clash with the built-in version of umfpack.
-
-Dec 2, 2006, version 5.0.2
-
-    * minor change to umfpack_report_info: does not print timings less
-	than 0.001 seconds.
-
-    * bug fix for complex case when using a non-gcc compiler (simplified the
-	scaling of the pivot column).  Does not affect the use of UMFPACK in
-	MATLAB.
-
-Aug 31, 2006, version 5.0.1
-
-    * Minor correction to comments in umfpack_get_numeric.h.
-
-May 5, 2006, version 5.0
-
-    * Tcov subdirectory added.  This has existed since the first C version of
-	UMFPACK, but is only now included in the released version.  It provides
-	a near 100% test coverage for UMFPACK.  The code isn't pretty, but it
-	works.
-
-    * now uses CHOLMOD's method for interfacing to the BLAS, including the
-	BLAS_INT definition.  This way, the UF_long version of UMFPACK can
-	call the int BLAS.
-
-    * revised to use AMD v2.0
-
-Apr 7, 2006
-
-    * Minor correction to UMFPACK/Source/Makefile, for those who
-	do not have GNU make.  No change to version number, because
-	no code was modified.
-
-Oct 10, 2005, version 4.6
-
-    * umf_solve.c modified for the complex case.  A, X, and b can be
-	split complex or unsplit.  Prior version required the form of
-	A, X, and B to be identical (all split or all unsplit).
-	(Thanks to David Bateman).
-
-    * added Cygwin to architecture detection.
-
-    * added UMFPACK_SUBSUB_VERSION
-
-Aug. 30, 2005: v4.5 released
-
-    * License changed to GNU LGPL.
-
-    * The Make/ directory removed; configurations are now in ../UFconfig.
-
-    * requires AMD v1.2 or later
-
-    * added UMFPACK_MAIN_VERSION and UMFPACK_SUB_VERSION, defined as 4 and 5,
-	respectively, for version 4.5.  These macros will be updated for all
-	future versions.  See Include/umfpack.h for details.
-
-    * function pointers used for malloc, free, calloc, realloc, printf,
-	hypot, and complex divide.  Defined in AMD/Source/amd_global.c,
-	AMD/Source/amd_internal.h, UMFPACK/Source/umfpack_global.c,
-	and UMFPACK/Include/umfpack_global.h.
-	Compile-time dependence on The MathWorks "util.h", ut* routines
-	and ut* macros removed.
-
-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.  (Thanks to David Bateman).
-
-    * 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.
-
-    * <float.h> 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 --git a/src/C/SuiteSparse/UMFPACK/Doc/License b/src/C/SuiteSparse/UMFPACK/Doc/License
deleted file mode 100644
index d29de06..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/License
+++ /dev/null
@@ -1,38 +0,0 @@
-UMFPACK, Copyright 1995-2009 by Timothy A. Davis.
-All Rights Reserved.
-UMFPACK is available under alternate licenses, contact T. Davis for details.
-
-UMFPACK License:
-
-    Your use or distribution of UMFPACK or any modified version of
-    UMFPACK 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 General Public
-    License as published by the Free Software Foundation; either
-    version 2 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
-    General Public License for more details.
-
-    You should have received a copy of the GNU General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
-    USA
-
-    Permission is hereby granted to use or copy this program under the
-    terms of the GNU GPL, 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/src/C/SuiteSparse/UMFPACK/Doc/Makefile b/src/C/SuiteSparse/UMFPACK/Doc/Makefile
deleted file mode 100644
index 6b93e0f..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/Makefile
+++ /dev/null
@@ -1,59 +0,0 @@
-#-------------------------------------------------------------------------------
-# 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.
-
-default: dist
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-#-------------------------------------------------------------------------------
-# 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
-
-clean:
-	- $(RM) $(CLEAN)
-
-#-------------------------------------------------------------------------------
-# 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) UserGuide.bib
-	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 --git a/src/C/SuiteSparse/UMFPACK/Doc/QuickStart.tex b/src/C/SuiteSparse/UMFPACK/Doc/QuickStart.tex
deleted file mode 100644
index ce4abba..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/QuickStart.tex
+++ /dev/null
@@ -1,1020 +0,0 @@
-%-------------------------------------------------------------------------------
-% The QuickStart.tex file.
-%-------------------------------------------------------------------------------
-
-\documentclass[11pt]{article}
-
-\newcommand{\m}[1]{{\bf{#1}}}       % for matrices and vectors
-\newcommand{\tr}{^{\sf T}}          % transpose
-
-\topmargin 0in
-\textheight 8.5in
-\oddsidemargin 0pt
-\evensidemargin 0pt
-\textwidth 6.5in
-
-\begin{document}
-
-\author{Timothy A. Davis \\
-DrTimothyAldenDavis at gmail.com, http://www.suitesparse.com}
-\title{UMFPACK Quick Start Guide}
-\date{VERSION 5.7.1, Oct 10, 2014}
-\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}
-%-------------------------------------------------------------------------------
-
-Copyright\copyright 1995-2013 by Timothy A. Davis.
-All Rights Reserved.  Refer to the UMFPACK User Guide
-for the License. See http://www.suitesparse.com
-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 is a built-in routine in MATLAB used by the forward and
-backslash operator, and the {\tt lu} routine.
-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 <stdio.h>
-    #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 ;
-
-    umfpack_di_defaults (Control) ;
-    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}
-}
-
-%-------------------------------------------------------------------------------
-\section{Installation}
-\label{Install}
-%-------------------------------------------------------------------------------
-
-You will need to install both UMFPACK and AMD 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.
-
-UMFPACK also requires CHOLMOD, CCAMD, CCOLAMD, COLAMD, and metis-4.0
-by default.  You can remove this dependency by compiling with
-{\tt -DNCHOLMOD}.  Add this to the {\tt UMFPACK\_CONFIG} definition
-in {\tt SuiteSparse\_config/SuiteSparse\_config.mk}.
-
-System-dependent configurations are in the {\tt SuiteSparse\_config/SuiteSparse\_config.mk}
-file.  The default
-settings will work on most systems, except for the BLAS definition.
-Sample configurations are provided
-for Linux, Mac, 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.
-
-If you have trouble with {\tt make} for UMFPACK,
-try using the plain {\tt Makefile} instead of {\tt GNUmakefile}.
-Go to the UMFPACK/Lib directory and type {\tt make -f Makefile}.
-
-Use the MATLAB command {\tt umfpack\_make} in the MATLAB directory
-to compile UMFPACK and AMD for use in MATLAB.
-
-If you compile UMFPACK and AMD and then later change the
-{\tt SuiteSparse\_config/SuiteSparse\_config.mk} file
-then you should type {\tt make purge} and then {\tt make} to recompile.
-
-Here are the various parameters that you can control in your
-{\tt SuiteSparse\_config/SuiteSparse\_config.mk} 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 UMFPACK\_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 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 UMFPACK\_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 -DNSUNPERF} if you are on Solaris but do not have the Sun
-    Performance Library.
-\item {\tt -DLONGBLAS} if your BLAS takes non-{\tt int} integer arguments.
-\item {\tt -DBLAS\_INT = } the integer used by the BLAS.
-
-\item {\tt -DBLAS\_NO\_UNDERSCORE}
-    for controlling how C calls the Fortran BLAS.
-    This is set automatically for Windows,
-    Sun Solaris, SGI Irix, Red Hat Linux, Compaq Alpha, and
-    AIX (the IBM RS 6000).
-
-\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 link your program with all libraries
-({\tt UMFPACK/Lib/libumfpack.a} and {\tt AMD/Lib/libamd.a},
-and unless you compile with \verb'-DNCHOLMOD' you also must link with
-{\tt CHOLMOD/Lib/libcholmod.a}, \newline
-{\tt COLAMD/Lib/libcolamd.a},
-{\tt CCOLAMD/Lib/libccolamd.a},
-{\tt CAMD/Lib/libcamd.a},
-and \newline
-{\tt metis-4.0/libmetis.a}).
-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.
-
-        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 (DrTimothyAldenDavis at gmail.com).
-
-        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 or UMFPACK_STRATEGY_UNSYMMETRIC
-\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
-            strategy is 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 --git a/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.bib b/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.bib
deleted file mode 100644
index 614c1c4..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.bib
+++ /dev/null
@@ -1,283 +0,0 @@
- at string{TOMS = "ACM Trans. Math. Softw."}
- at string{SIMAX = "SIAM J. Matrix Anal. Applic."}
- at string{SINUM = "SIAM J. Numer. Anal."}
- at string{SIAMJSC = "SIAM J. Sci. Comput."}
- at string{SIAMJSSC = "SIAM J. Sci. Statist. Comput."}
- at string{IJNME = "Internat. J. Numer. Methods Eng."}
- at string{SIAMJADM = "SIAM J. Alg. Disc. Meth."}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}
-	}
-
- at 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}}
-
- at 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}
-	}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}}
-
- at 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}
-}
-
-
- at 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}
-	}
-
- at 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"
-	}
-
-
- at 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}
-}
-
-
- at 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}
-	}
-
-
- at 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"
-	}
-
-
- at 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}
-	}
-
- at 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}
-	}
-
- at 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}
-	}
-
- at 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 --git a/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.sed1 b/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.sed1
deleted file mode 100644
index c49e8c1..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.sed1
+++ /dev/null
@@ -1,33 +0,0 @@
-/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 --git a/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.sed2 b/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.sed2
deleted file mode 100644
index 0df47d9..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.sed2
+++ /dev/null
@@ -1,3 +0,0 @@
-/[/][*]/d
-/[*][/]/d
-/INCLUDE umfpack/d
diff --git a/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.stex b/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.stex
deleted file mode 100644
index 2b8ca08..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/UserGuide.stex
+++ /dev/null
@@ -1,2781 +0,0 @@
-%-------------------------------------------------------------------------------
-% 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 8.5in
-\oddsidemargin 0pt
-\evensidemargin 0pt
-\textwidth 6.5in
-
-\begin{document}
-
-\author{Timothy A. Davis \\
-DrTimothyAldenDavis at gmail.com, http://www.suitesparse.com}
-\title{UMFPACK User Guide}
-\date{VERSION 5.7.1, Oct 10, 2014}
-\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)
-
-Copyright\copyright 1995-2013 by Timothy A. Davis.
-All Rights Reserved.
-UMFPACK is available under alternate licences; contact T. Davis for details.
-
-{\bf UMFPACK License:}
-    Your use or distribution of UMFPACK or any modified version of
-    UMFPACK 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 General Public
-    License as published by the Free Software Foundation; either
-    version 2 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
-    General Public License for more details.
-
-    You should have received a copy of the GNU General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
-    USA
-
-    Permission is hereby granted to use or copy this program under the
-    terms of the GNU GPL, 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.
-
-{\bf Availability:}
-    http://www.suitesparse.com
-
-{\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}
-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 two strategies for pre-ordering the rows and columns:
-{\em unsymmetric}
-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.
-    Let $d$ be the number of nonzero entries on the diagonal of $\m{S}$.
-    Let $\m{S}$ be $\nu$-by-$\nu$.
-    Rule 3: $(\sigma_1 \ge 0.5) \:\wedge\: (d \ge 0.9 \nu) \implies$ symmetric.
-    The matrix has a nearly symmetric nonzero pattern (50\% or more),
-    and a mostly-zero-free diagonal (90\% or more nonzero).
-\item Rule 4:
-    Otherwise, the unsymmetric strategy is used.
-\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}.
-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 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 strategy, and their automatic selection,
-are new to Version 4.1.  Version 4.0 only used the unsymmetric strategy.
-Versions 4.1 through 5.3 included a {\em 2-by-2} ordering strategy,
-but this option has been disabled in Version 5.4.
-
-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 strategy 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.suitesparse.com.
-
-%-------------------------------------------------------------------------------
-\section{Availability}
-%-------------------------------------------------------------------------------
-
-In addition to appearing as a Collected Algorithm of the ACM,
-UMFPACK is available at \newline http://www.suitesparse.com.
-It is included as a built-in routine in MATLAB.
-Version 4.0 (in MATLAB 6.5)
-does not have the symmetric strategy and it takes
-less advantage of the level-3
-BLAS \cite{DaydeDuff99,ACM679a,ATLAS,GotoVandeGeijn02}.
-Versions 5.x 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.suitesparse.com.
-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 as
-MA38 (functionally equivalent to Version 2.2.1) in the Harwell
-Subroutine Library.
-
-{\bf NOTE: you must use the correct version of AMD with UMFPACK; using
-an old version of AMD with a newer version of UMFPACK can fail.}
-
-%-------------------------------------------------------------------------------
-\section{Primary changes from prior versions}
-%-------------------------------------------------------------------------------
-
-A detailed list of changes is in the {\tt ChangeLog} file.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.7.0}
-%-------------------------------------------------------------------------------
-
-Replaced memory manager functions and printf with functions
-in {\tt SuiteSparse\_config}.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.6.0}
-%-------------------------------------------------------------------------------
-
-Replaced {\tt UFconfig} with {\tt SuiteSparse\_config}, for {\tt
-SuiteSparse\_timer}.  The {\tt UF\_long} type is replaced with {\tt
-SuiteSparse\_long} to avoid potential name conflicts with the {\tt UF\_}
-prefix, but the former is still available for user programs.
-User programs may safely {\tt \#undef} the {\tt UF\_long} macro and
-use {\tt SuiteSparse\_long} instead.  In future versions, {\tt UF\_long} will
-be removed completely from {\tt SuiteSparse\_config.h}.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.5.0}
-%-------------------------------------------------------------------------------
-
-Added more user ordering options (interface to CHOLMOD and METIS orderings,
-and the ability to pass in a user ordering function).
-Minor change to how the 64-bit BLAS is used.
-Added an option to disable the search for singletons.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.4.0}
-%-------------------------------------------------------------------------------
-
-Disabled the 2-by-2 ordering strategy.
-Bug fix for \verb'umfpack_make.m' for Windows.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.3.0}
-%-------------------------------------------------------------------------------
-
-A bug fix for structurally singular matrices, and a compiler workaround for
-gcc versions 4.2.(3 and 4).
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.2.0}
-%-------------------------------------------------------------------------------
-
-Change of license from GNU Lesser GPL to the GNU GPL.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.1.0}
-%-------------------------------------------------------------------------------
-
-Port of MATLAB interface to 64-bit MATLAB.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.0.3}
-%-------------------------------------------------------------------------------
-
-Renamed the MATLAB function to {\tt umfpack2}, so as not to confict with
-itself (the MATLAB built-in version of UMFPACK).
-
-%-------------------------------------------------------------------------------
-\subsection{Version 5.0}
-%-------------------------------------------------------------------------------
-
-Changed {\tt long} to {\tt UF\_long}, controlled by the {\tt UFconfig.h}
-file.  A {\tt UF\_long} is normally just {\tt long}, except on the Windows 64
-(WIN64) platform.  In that case, it becomes {\tt \_\_int64}.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 4.6}
-%-------------------------------------------------------------------------------
-
-Added additional options to {\tt umf\_solve.c}.
-
-%-------------------------------------------------------------------------------
-\subsection{Version 4.5}
-%-------------------------------------------------------------------------------
-
-Added function pointers for malloc, calloc, realloc, free, printf, hypot,
-and complex divisiion, so that these functions can be redefined at run-time.
-Added a version number so you can determine the
-version of UMFPACK at run time or compile time.  UMFPACK requires AMD v2.0
-or later.
-
-%-------------------------------------------------------------------------------
-\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.0.4, 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 compile both the UMFPACK and AMD mexFunctions, just type {\tt umfpack\_make}
-in MATLAB, while in the {\tt UMFPACK/MATLAB} directory.
-
-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 strategy).
-\end{minipage}
-&
-\begin{minipage}[t]{2.2in}
-\begin{verbatim}
-S = spones (A) ;
-Q = symamd (S+S') ;
-Control = umfpack ;
-Control.strategy = 'symmetric' ;
-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 structural
-rank {\tt m}
-and {\tt m} $<$ {\tt n}, then {\tt umfpack} might not find a factor
-{\tt U} with a structurally 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 (in the structural sense; they may
-be numerically zero).  Note that there is no guarantee
-as to the size of the diagonal entries of {\tt U}; UMFPACK does not do a
-rank-revealing factorization.  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.
-
-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 SuiteSparse\_long} integers.
-\item {\tt umfpack\_zi\_*}: complex double precision, {\tt int} integers.
-\item {\tt umfpack\_zl\_*}: complex double precision, {\tt SuiteSparse\_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 SuiteSparse\_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/SuiteSparse\_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 SuiteSparse\_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
-the {\tt SuiteSparse\_config/SuiteSparse\_config.mk} file.
-
-%-------------------------------------------------------------------------------
-\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 SuiteSparse\_long} version of UMFPACK:
-
-{\footnotesize
-\begin{verbatim}
-     SuiteSparse_long Ap [n+1] ;
-     SuiteSparse_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.  The default is \verb'UMFPACK_STRATEGY_AUTO',
-    in which UMFPACK selects the strategy by itself.
-    \verb'UMFPACK_STRATEGY_UNSYMMETRIC' gives the unsymmetric
-    strategy, which is to use a column pre-ordering (such as COLAMD)
-    and to give no preference to the diagonal during partial pivoting.
-    \verb'UMFPACK_STRATEGY_SYMMETRIC' gives the symmetric strategy,
-    which is to use a symmetric row and column ordering (such as AMD)
-    and to give strong preference to the diagonal during partial pivoting.
-
-    The parameter {\tt Control [UMFPACK\_ORDERING]} defines what ordering
-    method UMFPACK should use.  The options are:
-
-    \begin{itemize}
-    \item \verb'UMFPACK_ORDERING_CHOLMOD' (0).
-        This is the method used by CHOLMOD.  It first tries AMD or COLAMD
-        (depending on what strategy is used).  If that method gives low
-        fill-in, it is used without trying METIS at all.
-        Otherwise METIS is tried (on $\m{A}^T\m{A}$ for the unsymmetric
-        strategy, or $\m{A}+\m{A}^T$ for the symmetric strategy),
-        and the ordering (AMD/COLAMD or METIS) giving the lowest fill-in is
-        used.
-
-    \item \verb'UMFPACK_ORDERING_DEFAULT'.  This is the same as
-    \verb'UMFPACK_ORDERING_AMD'.
-
-    \item \verb'UMFPACK_ORDERING_AMD' (1).  This is the default.
-        AMD is used for the symmetric strategy, on the pattern of
-        $\m{A}+\m{A}^T$.  COLAMD is used on $\m{A}$ for the unsymmetric
-        strategy.
-
-    \item \verb'UMFPACK_ORDERING_GIVEN' (2).  This is assumed if
-        a permutation is provided to \newline
-        {\tt umfpack\_*\_qsymbolic}.
-
-    \item \verb'UMFPACK_ORDERING_METIS' (3).
-        Use METIS (on $\m{A}^T\m{A}$ for the unsymmetric
-        strategy, or $\m{A}+\m{A}^T$ for the symmetric strategy).
-
-    \item \verb'UMFPACK_ORDERING_BEST' (4).
-        Try three methods and take the best.  The three methods are
-        AMD/COLAMD, METIS, and NESDIS (CHOLMOD's nested dissection
-        ordering, based on METIS and CCAMD/CCOLAMD).  This results the
-        highest analysis time, but the lowest numerical factorization time.
-
-    \item \verb'UMFPACK_ORDERING_NONE' (5).
-        The matrix is factorized as-is, except that singletons are still
-        removed.
-
-    \item \verb'UMFPACK_ORDERING_USER' (6).  Use the user-ordering function
-        passed to \newline {\tt umfpack\_*\_fsymbolic}.    Refer to 
-        \verb'UMFPACK/Source/umf_cholmod.c' for an example.
-
-    \end{itemize}
-
-    To disable the singleton filter, set \verb'Control [UMFPACK_SINGLETONS]' to
-    0.  Disabling this search for singletons can slow UMFPACK down quite a bit
-    for some matrices, but it does ensure that $\m{L}$ is well-conditioned and
-    that any ill-conditioning of $\m{A}$ is captured only in $\m{U}$.
-
-\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 strategy.
-
-\item {\tt umfpack\_*\_fsymbolic}:
-
-    An alternative to {\tt umfpack\_*\_symbolic}.
-    Allows the user to pass a pointer to a function,
-    which is called to compute the ordering on the matrix
-    (or on a submatrix with singletons removed, if any exist).
-
-\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 SuiteSparse\_long} version:
-
-{\footnotesize
-\begin{verbatim}
-     SuiteSparse_long Ti [nz] ;
-     SuiteSparse_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}.
-The CHOLMOD provides many of these matrix operations, which
-can then be used in conjunction with UMFPACK.
-See 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}
-%-------------------------------------------------------------------------------
-
-Three timing routines are provided in UMFPACK Version 4.1 and following,
-{\tt umfpack\_tic}, {\tt umfpack\_toc}, and {\tt umfpack\_timer}.
-These three routines are the only user-callable
-routine that is identical in all four {\tt int}/{\tt SuiteSparse\_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 \\
-\verb'struct' & & & \\
-\hline
-{\tt prl}           & {\tt Control[UMFPACK\_PRL]} & 1 & printing level \\
--                   & {\tt Control[UMFPACK\_DENSE\_ROW]} & 0.2 & dense row parameter \\
--                   & {\tt Control[UMFPACK\_DENSE\_COL]} & 0.2 & dense column parameter \\
-{\tt tol}           & {\tt Control[UMFPACK\_PIVOT\_TOLERANCE]} & 0.1 & partial pivoting tolerance \\
--                   & {\tt Control[UMFPACK\_BLOCK\_SIZE]} & 32 & BLAS block size \\
-{\tt strategy}      & {\tt Control[UMFPACK\_STRATEGY]} & 0 (auto) & select strategy \\
-{\tt ordering}      & {\tt Control[UMFPACK\_ORDERING]} & 1 (AMD) & select ordering \\
--                   & {\tt Control[UMFPACK\_ALLOC\_INIT]} & 0.7 & initial memory allocation  \\
-{\tt irstep}        & {\tt Control[UMFPACK\_IRSTEP]} & 2 & max iter. refinement steps \\
-% {\tt Control(13)} & ignored & & \\
--                   & {\tt Control[UMFPACK\_FIXQ]} & 0 (auto) & fix or modify Q \\
--                   & {\tt Control[UMFPACK\_AMD\_DENSE]} & 10 & AMD dense row/col param. \\
-{\tt symtol}        & {\tt Control[UMFPACK\_SYM\_PIVOT\_TOLERANCE]} & 0.001 & for diagonal entries \\
-{\tt scale}         & {\tt Control[UMFPACK\_SCALE]} & 1 (sum) & row scaling (none, sum, max) \\
--                   & {\tt Control[UMFPACK\_FRONT\_ALLOC\_INIT]} & 0.5 & frontal matrix allocation ratio \\
--                   & {\tt Control[UMFPACK\_DROPTOL]} & 0 & drop tolerance \\
--                   & {\tt Control[UMFPACK\_AGGRESSIVE]} & 1 (yes) & aggressive absorption \\
-{\tt singletons}    & {\tt Control[UMFPACK\_SINGLETONS]} & 1 (enable) & enable singleton filter \\
-%
-\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\_*\_fsymbolic},
-{\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\_ordering\_failed},  (-18):
-    The ordering method failed.
-
-\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/Include/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 (DrTimothyAldenDavis at gmail.com)
-    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},
-{\tt umfpack\_*\_qsymbolic} or
-{\tt umfpack\_*\_fsymbolic}.
-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.suitesparse.com.
-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 SuiteSparse\_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 SuiteSparse\_long}.
-Similarly, the complex, {\tt SuiteSparse\_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 SuiteSparse\_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_fsymbolic (m, n, Ap, Ai, Ax, &user_ordering, user_params, &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_fsymbolic (m, n, Ap, Ai, Ax, Az, &user_ordering, user_params, &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 SuiteSparse\_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 and AMD 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 \cite{DaydeDuff99,ACM679a,ATLAS,GotoVandeGeijn02},
-but your performance will be much less than what it should be.
-
-UMFPACK also requires CHOLMOD, CCAMD, CCOLAMD, COLAMD, and metis-4.0
-by default.  You can remove this dependency by compiling with
-{\tt -DNCHOLMOD}.  Add this to the {\tt UMFPACK\_CONFIG} definition
-in {\tt SuiteSparse\_config/SuiteSparse\_config.mk}.
-
-System-dependent configurations are in the {\tt SuiteSparse\_config/SuiteSparse\_config.mk}
-file.  The default
-settings will work on most systems, except that UMFPACK will be compiled so
-that it does not use the BLAS.  Sample configurations are provided
-for Linux, Mac, 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.
-
-If you have trouble with {\tt make} for UMFPACK,
-try using the plain {\tt Makefile} instead of {\tt GNUmakefile}.
-Go to the UMFPACK/Lib directory and type {\tt make -f Makefile}.
-
-Use the MATLAB command {\tt umfpack\_make} in the MATLAB directory
-to compile UMFPACK and AMD for use in MATLAB.
-
-If you have the GNU version of {\tt make}, the {\tt Lib/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 Lib/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 SuiteSparse\_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 SuiteSparse\_config/SuiteSparse\_config.mk} file
-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 SuiteSparse\_config/SuiteSparse\_config.mk} 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 UMFPACK\_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 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 UMFPACK\_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 -DNSUNPERF} if you are on Solaris but do not have the Sun
-    Performance Library (for the BLAS).
-\item {\tt -DLONGBLAS} if your BLAS takes non-{\tt int} integer arguments.
-\item {\tt -DBLAS\_INT = } the integer used by the BLAS.
-
-\item {\tt -DBLAS\_NO\_UNDERSCORE}
-    for controlling how C calls the Fortran BLAS.
-    This is set automatically for Windows,
-    Sun Solaris, SGI Irix, Red Hat Linux, Compaq Alpha, and
-    AIX (the IBM RS 6000).
-
-\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.
-
-\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 all libraries
-({\tt UMFPACK/Lib/libumfpack.a} and {\tt AMD/Lib/libamd.a},
-and unless you compile with \verb'-DNCHOLMOD' you also must link with
-{\tt CHOLMOD/Lib/libcholmod.a}, \newline
-{\tt COLAMD/Lib/libcolamd.a},
-{\tt CCOLAMD/Lib/libccolamd.a},
-{\tt CAMD/Lib/libcamd.a},
-and \newline
-{\tt metis-4.0/libmetis.a}).
-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 SuiteSparse\_config/SuiteSparse\_config.mk}
-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 SuiteSparse\_config/SuiteSparse\_config.mk} file 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}
-%-------------------------------------------------------------------------------
-
-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).
-
-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 <matlab>}$\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.
-
-In particular, I was not able to get C and Fortran to work together on
-the Mac (Snow Leopard).
-
-%-------------------------------------------------------------------------------
-\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 the current version of UMFPACK,
-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 Remove the restriction that the column-oriented form be given with
-    sorted columns.  This has already been done in AMD Version 2.0.
-
-\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}).
-    See also CSparse and 
-    CXSparse for software for handling sparse right-hand sides.
-
-\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.
-    See also CSparse and 
-    CXSparse for software for handling sparse right-hand sides.
-
-\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.  KLU includes this feature.
-    See also {\tt cs\_dmperm} in CSparse and CXSparse.
-
-\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 strategy,
-    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.
-    See {\tt cs\_counts} in CSparse and CXSparse,
-    and {\tt cholmod\_analyze} in CHOLMOD.
-
-\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 SuiteSparse\_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 and umfpack\_*\_fsymbolic}
-
-{\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 --git a/src/C/SuiteSparse/UMFPACK/Doc/gpl.txt b/src/C/SuiteSparse/UMFPACK/Doc/gpl.txt
deleted file mode 100644
index 3912109..0000000
--- a/src/C/SuiteSparse/UMFPACK/Doc/gpl.txt
+++ /dev/null
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-

-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-

-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack.h
deleted file mode 100644
index 62ef2f9..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack.h
+++ /dev/null
@@ -1,434 +0,0 @@
-/* ========================================================================== */
-/* === umfpack.h ============================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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
-
-/* -------------------------------------------------------------------------- */
-/* Make it easy for C++ programs to include UMFPACK */
-/* -------------------------------------------------------------------------- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "SuiteSparse_config.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"
-
-/* AMD */
-#include "amd.h"
-
-/* global function pointers */
-#include "umfpack_global.h"
-
-/* -------------------------------------------------------------------------- */
-/* Version, copyright, and license */
-/* -------------------------------------------------------------------------- */
-
-#define UMFPACK_VERSION "UMFPACK V5.7.1 (Oct 10, 2014)"
-
-#define UMFPACK_COPYRIGHT \
-"UMFPACK:  Copyright (c) 2005-2013 by Timothy A. Davis.  All Rights Reserved.\n"
-
-#define UMFPACK_LICENSE_PART1 \
-"\nUMFPACK License:\n" \
-"\n" \
-"   UMFPACK is available under alternate licenses,\n" \
-"   contact T. Davis for details.\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 library is free software; you can redistribute it and/or\n" \
-"   modify it under the terms of the GNU General Public\n" \
-"   License as published by the Free Software Foundation; either\n" \
-"   version 2 of the License, or (at your option) any later version.\n" \
-"\n" \
-"   This library is distributed in the hope that it will be useful,\n" \
-"   but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
-"   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n" \
-"   General Public License for more details.\n" \
-"\n" \
-"   You should have received a copy of the GNU General Public\n" \
-"   License along with this library; if not, write to the Free Software\n" \
-"   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301\n" \
-"   USA\n" \
-
-#define UMFPACK_LICENSE_PART2 \
-"\n" \
-"   Permission is hereby granted to use or copy this program under the\n" \
-"   terms of the GNU GPL, provided that the Copyright, this License,\n" \
-"   and the Availability of the original version is retained on all copies.\n" \
-"   User documentation of any code that uses this code or any modified\n" \
-"   version of this code must cite the Copyright, this License, the\n" \
-"   Availability note, and \"Used by permission.\" Permission to modify\n" \
-"   the code and to distribute modified code is granted, provided the\n" \
-"   Copyright, this License, and the Availability note are retained,\n" \
-"   and a notice that the code was modified is included.\n"
-
-#define UMFPACK_LICENSE_PART3 \
-"\n" \
-"Availability: http://www.suitesparse.com" \
-"\n"
-
-/* UMFPACK Version 4.5 and later will include the following definitions.
- * As an example, to test if the version you are using is 4.5 or later:
- *
- * #ifdef UMFPACK_VER
- *	if (UMFPACK_VER >= UMFPACK_VER_CODE (4,5)) ...
- * #endif
- *
- * This also works during compile-time:
- *
- *	#if defined(UMFPACK_VER) && (UMFPACK >= UMFPACK_VER_CODE (4,5))
- *	    printf ("This is version 4.5 or later\n") ;
- *	#else
- *	    printf ("This is an early version\n") ;
- *	#endif
- *
- * Versions 4.4 and earlier of UMFPACK do not include a #define'd version
- * number, although they do include the UMFPACK_VERSION string, defined
- * above.
- */
-
-#define UMFPACK_DATE "Oct 10, 2014"
-#define UMFPACK_VER_CODE(main,sub) ((main) * 1000 + (sub))
-#define UMFPACK_MAIN_VERSION 5
-#define UMFPACK_SUB_VERSION 7
-#define UMFPACK_SUBSUB_VERSION 1
-#define UMFPACK_VER UMFPACK_VER_CODE(UMFPACK_MAIN_VERSION,UMFPACK_SUB_VERSION)
-
-/* -------------------------------------------------------------------------- */
-/* 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 (SuiteSparse_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 */
-#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 */
-
-/* 51:55 unused */
-
-/* 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. */
-
-/* -------------------------------------------------------------------------- */
-/* 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, or unsym. */
-#define UMFPACK_ORDERING 10             /* ordering method to use */
-#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 */
-#define UMFPACK_SINGLETONS 11           /* singleton filter on if true */
-
-/* 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 */
-
-/* 9,12: unused */
-
-/* -------------------------------------------------------------------------- */
-
-/* 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_OBSOLETE 2     /* 2-by-2 is no longer available */
-#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)) */
-
-/* Control [UMFPACK_ORDERING] and Info [UMFPACK_ORDERING_USED] are one of: */
-#define UMFPACK_ORDERING_CHOLMOD 0      /* use CHOLMOD (AMD/COLAMD then METIS)*/
-#define UMFPACK_ORDERING_AMD 1          /* use AMD/COLAMD */
-#define UMFPACK_ORDERING_GIVEN 2        /* user-provided Qinit */
-#define UMFPACK_ORDERING_METIS 3        /* use METIS */
-#define UMFPACK_ORDERING_BEST 4         /* try many orderings, pick best */
-#define UMFPACK_ORDERING_NONE 5         /* natural ordering */
-#define UMFPACK_ORDERING_USER 6         /* user-provided function */
-/* AMD/COLAMD means: use AMD for symmetric strategy, COLAMD for unsymmetric */
-
-/* -------------------------------------------------------------------------- */
-/* 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_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
-#define UMFPACK_DEFAULT_ORDERING UMFPACK_ORDERING_AMD
-#define UMFPACK_DEFAULT_SINGLETONS TRUE
-
-/* 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)
-
-#define UMFPACK_ERROR_ordering_failed (-18)
-
-/* -------------------------------------------------------------------------- */
-/* 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. */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* UMFPACK_H */
diff --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_col_to_triplet.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_col_to_triplet.h
deleted file mode 100644
index 8fa096f..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_col_to_triplet.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_col_to_triplet =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_col_to_triplet
-(
-    int n_col,
-    const int Ap [ ],
-    int Tj [ ]
-) ;
-
-SuiteSparse_long umfpack_dl_col_to_triplet
-(
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    SuiteSparse_long Tj [ ]
-) ;
-
-int umfpack_zi_col_to_triplet
-(
-    int n_col,
-    const int Ap [ ],
-    int Tj [ ]
-) ;
-
-SuiteSparse_long umfpack_zl_col_to_triplet
-(
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_defaults.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_defaults.h
deleted file mode 100644
index e1a3a8b..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_defaults.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_defaults ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 SuiteSparse_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 SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_free_numeric.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_free_numeric.h
deleted file mode 100644
index c86d909..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_free_numeric.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_free_numeric ================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 SuiteSparse_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 SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_free_symbolic.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_free_symbolic.h
deleted file mode 100644
index 8cb1eba..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_free_symbolic.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_free_symbolic ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 SuiteSparse_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 SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_determinant.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_determinant.h
deleted file mode 100644
index 333d5fc..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_determinant.h
+++ /dev/null
@@ -1,194 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_get_determinant ============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_get_determinant
-(
-    double *Mx,
-    double *Ex,
-    void *NumericHandle,
-    double User_Info [UMFPACK_INFO]
-) ;
-
-SuiteSparse_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]
-) ;
-
-SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_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 ;
-    SuiteSparse_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.
-
-Author: Contributed by David Bateman, Motorola, Paris
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_lunz.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_lunz.h
deleted file mode 100644
index 58b9ff2..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_lunz.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_get_lunz ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_get_lunz
-(
-    int *lnz,
-    int *unz,
-    int *n_row,
-    int *n_col,
-    int *nz_udiag,
-    void *Numeric
-) ;
-
-SuiteSparse_long umfpack_dl_get_lunz
-(
-    SuiteSparse_long *lnz,
-    SuiteSparse_long *unz,
-    SuiteSparse_long *n_row,
-    SuiteSparse_long *n_col,
-    SuiteSparse_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
-) ;
-
-SuiteSparse_long umfpack_zl_get_lunz
-(
-    SuiteSparse_long *lnz,
-    SuiteSparse_long *unz,
-    SuiteSparse_long *n_row,
-    SuiteSparse_long *n_col,
-    SuiteSparse_long *nz_udiag,
-    void *Numeric
-) ;
-
-/*
-double int Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    int status, lnz, unz, n_row, n_col, nz_udiag ;
-    status = umfpack_di_get_lunz (&lnz, &unz, &n_row, &n_col, &nz_udiag,
-	Numeric) ;
-
-double SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_long status, lnz, unz, n_row, n_col, nz_udiag ;
-    status = umfpack_dl_get_lunz (&lnz, &unz, &n_row, &n_col, &nz_udiag,
-	Numeric) ;
-
-complex int Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    int status, lnz, unz, n_row, n_col, nz_udiag ;
-    status = umfpack_zi_get_lunz (&lnz, &unz, &n_row, &n_col, &nz_udiag,
-	Numeric) ;
-
-complex SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_long status, lnz, unz, n_row, n_col, nz_udiag ;
-    status = umfpack_zl_get_lunz (&lnz, &unz, &n_row, &n_col, &nz_udiag,
-	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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_numeric.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_numeric.h
deleted file mode 100644
index 708608d..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_numeric.h
+++ /dev/null
@@ -1,253 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_get_numeric ================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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
-) ;
-
-SuiteSparse_long umfpack_dl_get_numeric
-(
-    SuiteSparse_long Lp [ ],
-    SuiteSparse_long Lj [ ],
-    double Lx [ ],
-    SuiteSparse_long Up [ ],
-    SuiteSparse_long Ui [ ],
-    double Ux [ ],
-    SuiteSparse_long P [ ],
-    SuiteSparse_long Q [ ],
-    double Dx [ ],
-    SuiteSparse_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
-) ;
-
-SuiteSparse_long umfpack_zl_get_numeric
-(
-    SuiteSparse_long Lp [ ],
-    SuiteSparse_long Lj [ ],
-    double Lx [ ], double Lz [ ],
-    SuiteSparse_long Up [ ],
-    SuiteSparse_long Ui [ ],
-    double Ux [ ], double Uz [ ],
-    SuiteSparse_long P [ ],
-    SuiteSparse_long Q [ ],
-    double Dx [ ], double Dz [ ],
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_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/SuiteSparse_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.
-
-	This argument defines how the scale factors Rs are to be interpretted.
-
-	If do_recip is TRUE (one), 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 FALSE (zero).
-
-    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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_symbolic.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_symbolic.h
deleted file mode 100644
index 8ef3f70..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_get_symbolic.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_get_symbolic ================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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
-) ;
-
-SuiteSparse_long umfpack_dl_get_symbolic
-(
-    SuiteSparse_long *n_row,
-    SuiteSparse_long *n_col,
-    SuiteSparse_long *n1,
-    SuiteSparse_long *nz,
-    SuiteSparse_long *nfr,
-    SuiteSparse_long *nchains,
-    SuiteSparse_long P [ ],
-    SuiteSparse_long Q [ ],
-    SuiteSparse_long Front_npivcol [ ],
-    SuiteSparse_long Front_parent [ ],
-    SuiteSparse_long Front_1strow [ ],
-    SuiteSparse_long Front_leftmostdesc [ ],
-    SuiteSparse_long Chain_start [ ],
-    SuiteSparse_long Chain_maxrows [ ],
-    SuiteSparse_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
-) ;
-
-SuiteSparse_long umfpack_zl_get_symbolic
-(
-    SuiteSparse_long *n_row,
-    SuiteSparse_long *n_col,
-    SuiteSparse_long *n1,
-    SuiteSparse_long *nz,
-    SuiteSparse_long *nfr,
-    SuiteSparse_long *nchains,
-    SuiteSparse_long P [ ],
-    SuiteSparse_long Q [ ],
-    SuiteSparse_long Front_npivcol [ ],
-    SuiteSparse_long Front_parent [ ],
-    SuiteSparse_long Front_1strow [ ],
-    SuiteSparse_long Front_leftmostdesc [ ],
-    SuiteSparse_long Chain_start [ ],
-    SuiteSparse_long Chain_maxrows [ ],
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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.  If no pivoting occurs during
-        numerical factorization, P [k] = i also defines the final permutation
-        of umfpack_*_numeric, for the symmetric strategy.
-
-    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 strategy is
-	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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_global.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_global.h
deleted file mode 100644
index ba5db82..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_global.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_global ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-    /* moved to SuiteSparse_config */
diff --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_load_numeric.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_load_numeric.h
deleted file mode 100644
index 1696b9a..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_load_numeric.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_load_numeric ================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_load_numeric
-(
-    void **Numeric,
-    char *filename
-) ;
-
-SuiteSparse_long umfpack_dl_load_numeric
-(
-    void **Numeric,
-    char *filename
-) ;
-
-int umfpack_zi_load_numeric
-(
-    void **Numeric,
-    char *filename
-) ;
-
-SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_load_symbolic.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_load_symbolic.h
deleted file mode 100644
index e860029..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_load_symbolic.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_load_symbolic ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_load_symbolic
-(
-    void **Symbolic,
-    char *filename
-) ;
-
-SuiteSparse_long umfpack_dl_load_symbolic
-(
-    void **Symbolic,
-    char *filename
-) ;
-
-int umfpack_zi_load_symbolic
-(
-    void **Symbolic,
-    char *filename
-) ;
-
-SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_numeric.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_numeric.h
deleted file mode 100644
index a12447a..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_numeric.h
+++ /dev/null
@@ -1,542 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_numeric ====================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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]
-) ;
-
-SuiteSparse_long umfpack_dl_numeric
-(
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_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]
-) ;
-
-SuiteSparse_long umfpack_zl_numeric
-(
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Symbolic, *Numeric ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Symbolic, *Numeric ;
-    SuiteSparse_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
-	    strategy is 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 when UMFPACK is used
-	    as a mexFunction MATLAB, since mxMalloc aborts the mexFunction if it
-	    fails.  This issue does not affect the use of UMFPACK as a part of
-	    the built-in x=A\b in MATLAB 6.5 and later.
-
-	    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 strategy is 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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_qsymbolic.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_qsymbolic.h
deleted file mode 100644
index f2390a7..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_qsymbolic.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_qsymbolic ==================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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]
-) ;
-
-SuiteSparse_long umfpack_dl_qsymbolic
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ],
-    const SuiteSparse_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]
-) ;
-
-SuiteSparse_long umfpack_zl_qsymbolic
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ], const double Az [ ],
-    const SuiteSparse_long Qinit [ ],
-    void **Symbolic,
-    const double Control [UMFPACK_CONTROL],
-    double Info [UMFPACK_INFO]
-) ;
-
-int umfpack_di_fsymbolic
-(
-    int n_row,
-    int n_col,
-    const int Ap [ ],
-    const int Ai [ ],
-    const double Ax [ ],
-
-    /* user-provided ordering function */
-    int (*user_ordering)    /* TRUE if OK, FALSE otherwise */
-    (
-        /* inputs, not modified on output */
-        int,            /* nrow */
-        int,            /* ncol */
-        int,            /* sym: if TRUE and nrow==ncol do A+A', else do A'A */
-        int *,          /* Ap, size ncol+1 */
-        int *,          /* Ai, size nz */
-        /* output */
-        int *,          /* size ncol, fill-reducing permutation */
-        /* input/output */
-        void *,         /* user_params (ignored by UMFPACK) */
-        double *        /* user_info[0..2], optional output for symmetric case.
-                           user_info[0]: max column count for L=chol(A+A')
-                           user_info[1]: nnz (L)
-                           user_info[2]: flop count for chol(A+A'), if A real */
-    ),
-    void *user_params,  /* passed to user_ordering function */
-
-    void **Symbolic,
-    const double Control [UMFPACK_CONTROL],
-    double Info [UMFPACK_INFO]
-) ;
-
-SuiteSparse_long umfpack_dl_fsymbolic
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ],
-
-    int (*user_ordering) (SuiteSparse_long, SuiteSparse_long, SuiteSparse_long,
-        SuiteSparse_long *, SuiteSparse_long *, SuiteSparse_long *, void *,
-        double *),
-    void *user_params,
-
-    void **Symbolic,
-    const double Control [UMFPACK_CONTROL],
-    double Info [UMFPACK_INFO]
-) ;
-
-int umfpack_zi_fsymbolic
-(
-    int n_row,
-    int n_col,
-    const int Ap [ ],
-    const int Ai [ ],
-    const double Ax [ ], const double Az [ ],
-
-    int (*user_ordering) (int, int, int, int *, int *, int *, void *, double *),
-    void *user_params,
-
-    void **Symbolic,
-    const double Control [UMFPACK_CONTROL],
-    double Info [UMFPACK_INFO]
-) ;
-
-SuiteSparse_long umfpack_zl_fsymbolic
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ], const double Az [ ],
-
-    int (*user_ordering) (SuiteSparse_long, SuiteSparse_long, SuiteSparse_long,
-        SuiteSparse_long *, SuiteSparse_long *, SuiteSparse_long *, void *,
-        double *),
-    void *user_params,
-
-    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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Symbolic ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Symbolic ;
-    SuiteSparse_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
-    strategy will preserve Qinit, unless the matrix is structurally singular.
-
-    See umfpack_*_symbolic for more information.  Note that Ax and Ax are
-    optional.  The may be NULL.
-
-    *** 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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_control.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_control.h
deleted file mode 100644
index 00eae25..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_control.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_control =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 SuiteSparse_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 SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_info.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_info.h
deleted file mode 100644
index 23a4ddd..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_info.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_info ================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 SuiteSparse_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 SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_matrix.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_matrix.h
deleted file mode 100644
index 599dbf8..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_matrix.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_matrix ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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]
-) ;
-
-SuiteSparse_long umfpack_dl_report_matrix
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ],
-    SuiteSparse_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]
-) ;
-
-SuiteSparse_long umfpack_zl_report_matrix
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ], const double Az [ ],
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_numeric.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_numeric.h
deleted file mode 100644
index db3ad30..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_numeric.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_numeric =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_report_numeric
-(
-    void *Numeric,
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-SuiteSparse_long umfpack_dl_report_numeric
-(
-    void *Numeric,
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-int umfpack_zi_report_numeric
-(
-    void *Numeric,
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    double Control [UMFPACK_CONTROL] ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    double Control [UMFPACK_CONTROL] ;
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_perm.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_perm.h
deleted file mode 100644
index e1abfc0..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_perm.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_perm ================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_report_perm
-(
-    int np,
-    const int Perm [ ],
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-SuiteSparse_long umfpack_dl_report_perm
-(
-    SuiteSparse_long np,
-    const SuiteSparse_long Perm [ ],
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-int umfpack_zi_report_perm
-(
-    int np,
-    const int Perm [ ],
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-SuiteSparse_long umfpack_zl_report_perm
-(
-    SuiteSparse_long np,
-    const SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_status.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_status.h
deleted file mode 100644
index 58d82d4..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_status.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_status ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-void umfpack_di_report_status
-(
-    const double Control [UMFPACK_CONTROL],
-    int status
-) ;
-
-void umfpack_dl_report_status
-(
-    const double Control [UMFPACK_CONTROL],
-    SuiteSparse_long status
-) ;
-
-void umfpack_zi_report_status
-(
-    const double Control [UMFPACK_CONTROL],
-    int status
-) ;
-
-void umfpack_zl_report_status
-(
-    const double Control [UMFPACK_CONTROL],
-    SuiteSparse_long status
-) ;
-
-/*
-double int Syntax:
-
-    #include "umfpack.h"
-    double Control [UMFPACK_CONTROL] ;
-    int status ;
-    umfpack_di_report_status (Control, status) ;
-
-double SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    double Control [UMFPACK_CONTROL] ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    double Control [UMFPACK_CONTROL] ;
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_symbolic.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_symbolic.h
deleted file mode 100644
index 6415ff5..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_symbolic.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_symbolic ============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_report_symbolic
-(
-    void *Symbolic,
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-SuiteSparse_long umfpack_dl_report_symbolic
-(
-    void *Symbolic,
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-int umfpack_zi_report_symbolic
-(
-    void *Symbolic,
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Symbolic ;
-    double Control [UMFPACK_CONTROL] ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Symbolic ;
-    double Control [UMFPACK_CONTROL] ;
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_triplet.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_triplet.h
deleted file mode 100644
index 01b3680..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_triplet.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_triplet =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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]
-) ;
-
-SuiteSparse_long umfpack_dl_report_triplet
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    SuiteSparse_long nz,
-    const SuiteSparse_long Ti [ ],
-    const SuiteSparse_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]
-) ;
-
-SuiteSparse_long umfpack_zl_report_triplet
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    SuiteSparse_long nz,
-    const SuiteSparse_long Ti [ ],
-    const SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_vector.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_vector.h
deleted file mode 100644
index 4663107..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_report_vector.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_report_vector ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_report_vector
-(
-    int n,
-    const double X [ ],
-    const double Control [UMFPACK_CONTROL]
-) ;
-
-SuiteSparse_long umfpack_dl_report_vector
-(
-    SuiteSparse_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]
-) ;
-
-SuiteSparse_long umfpack_zl_report_vector
-(
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 and later 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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_save_numeric.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_save_numeric.h
deleted file mode 100644
index af742db..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_save_numeric.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_save_numeric ================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_save_numeric
-(
-    void *Numeric,
-    char *filename
-) ;
-
-SuiteSparse_long umfpack_dl_save_numeric
-(
-    void *Numeric,
-    char *filename
-) ;
-
-int umfpack_zi_save_numeric
-(
-    void *Numeric,
-    char *filename
-) ;
-
-SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_save_symbolic.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_save_symbolic.h
deleted file mode 100644
index 79c08a1..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_save_symbolic.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_save_symbolic================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_save_symbolic
-(
-    void *Symbolic,
-    char *filename
-) ;
-
-SuiteSparse_long umfpack_dl_save_symbolic
-(
-    void *Symbolic,
-    char *filename
-) ;
-
-int umfpack_zi_save_symbolic
-(
-    void *Symbolic,
-    char *filename
-) ;
-
-SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_scale.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_scale.h
deleted file mode 100644
index 7cc163f..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_scale.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_scale ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-int umfpack_di_scale
-(
-    double X [ ],
-    const double B [ ],
-    void *Numeric
-) ;
-
-SuiteSparse_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
-) ;
-
-SuiteSparse_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 SuiteSparse_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 SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_solve.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_solve.h
deleted file mode 100644
index fe22b67..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_solve.h
+++ /dev/null
@@ -1,300 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_solve ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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]
-) ;
-
-SuiteSparse_long umfpack_dl_solve
-(
-    SuiteSparse_long sys,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_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]
-) ;
-
-SuiteSparse_long umfpack_zl_solve
-(
-    SuiteSparse_long sys,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_symbolic.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_symbolic.h
deleted file mode 100644
index 3cf8216..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_symbolic.h
+++ /dev/null
@@ -1,516 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_symbolic ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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]
-) ;
-
-SuiteSparse_long umfpack_dl_symbolic
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_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]
-) ;
-
-SuiteSparse_long umfpack_zl_symbolic
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Symbolic ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Symbolic ;
-    SuiteSparse_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, AMD or METIS) and a symbolic factorization.  This is required
-    before the matrix can be numerically factorized with umfpack_*_numeric.
-    If you wish to bypass the COLAMD/AMD/METIS pre-ordering and provide your own
-    ordering, use umfpack_*_qsymbolic instead.  If you wish to pass in a
-    pointer to a user-provided ordering function, use umfpack_*_fsymbolic.
-
-    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.  May be NULL.
-			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 for gathering statistics
-        about how many nonzeros are placed on the diagonal by the fill-reducing
-        ordering.
-
-    double Az [nz] ;	Optional input argument, not modified, for complex
-			versions.  May be NULL.
-
-	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 for statistics 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.
-
-	Control [UMFPACK_ORDERING]:  The ordering method to use:
-            UMFPACK_ORDERING_CHOLMOD    try AMD/COLAMD, then METIS if needed
-            UMFPACK_ORDERING_AMD        just AMD or COLAMD
-            UMFPACK_ORDERING_GIVEN      just Qinit (umfpack_*_qsymbolic only)
-            UMFPACK_ORDERING_NONE       no fill-reducing ordering
-            UMFPACK_ORDERING_METIS      just METIS(A+A') or METIS(A'A)
-            UMFPACK_ORDERING_BEST       try AMD/COLAMD, METIS, and NESDIS
-            UMFPACK_ORDERING_USER       just user function (*_fsymbolic only)
-
-        Control [UMFPACK_SINGLETONS]: If false (0), then singletons are
-            not removed prior to factorization.  Default: true (1).
-
-	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.
-	    Assuming the block size is large enough (8 or so), this parameter
-	    has a modest effect on performance.
-
-	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 (DrTimothyAldenDavis at gmail.com).
-
-	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 SuiteSparse_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 strategy is 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 or UMFPACK_STRATEGY_UNSYMMETRIC
-
-	Info [UMFPACK_ORDERING_USED]:  The ordering method used:
-            UMFPACK_ORDERING_AMD
-            UMFPACK_ORDERING_GIVEN
-            UMFPACK_ORDERING_NONE
-            UMFPACK_ORDERING_METIS
-            UMFPACK_ORDERING_USER
-
-	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
-	    strategy.
-
-	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.
-
-	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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_tictoc.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_tictoc.h
deleted file mode 100644
index b79f7c2..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_tictoc.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_tictoc ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 wall clock time.
-    umfpack_toc returns the 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 [0] contains the elapsed wall clock time in seconds between
-    umfpack_tic and umfpack_toc.
-
-Arguments:
-
-    double stats [2]:
-
-	stats [0]:  wall clock time, in seconds
-	stats [1]:  (same; was CPU time in prior versions)
-*/
diff --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_timer.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_timer.h
deleted file mode 100644
index 44e16df..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_timer.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_timer ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-double umfpack_timer ( void ) ;
-
-/*
-Syntax (for all versions: di, dl, zi, and zl):
-
-    #include "umfpack.h"
-    double t ;
-    t = umfpack_timer ( ) ;
-
-Purpose:
-
-    Returns the current wall clock time on POSIX C 1993 systems.
-
-Arguments:
-
-    None.
-*/
diff --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_transpose.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_transpose.h
deleted file mode 100644
index 3cdfd2e..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_transpose.h
+++ /dev/null
@@ -1,215 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_transpose ==================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 [ ]
-) ;
-
-SuiteSparse_long umfpack_dl_transpose
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ],
-    const SuiteSparse_long P [ ],
-    const SuiteSparse_long Q [ ],
-    SuiteSparse_long Rp [ ],
-    SuiteSparse_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
-) ;
-
-SuiteSparse_long umfpack_zl_transpose
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ], const double Az [ ],
-    const SuiteSparse_long P [ ],
-    const SuiteSparse_long Q [ ],
-    SuiteSparse_long Rp [ ],
-    SuiteSparse_long Ri [ ],
-    double Rx [ ], double Rz [ ],
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_triplet_to_col.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_triplet_to_col.h
deleted file mode 100644
index 308dc34..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_triplet_to_col.h
+++ /dev/null
@@ -1,262 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_triplet_to_col =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 [ ]
-) ;
-
-SuiteSparse_long umfpack_dl_triplet_to_col
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    SuiteSparse_long nz,
-    const SuiteSparse_long Ti [ ],
-    const SuiteSparse_long Tj [ ],
-    const double Tx [ ],
-    SuiteSparse_long Ap [ ],
-    SuiteSparse_long Ai [ ],
-    double Ax [ ],
-    SuiteSparse_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 [ ]
-) ;
-
-SuiteSparse_long umfpack_zl_triplet_to_col
-(
-    SuiteSparse_long n_row,
-    SuiteSparse_long n_col,
-    SuiteSparse_long nz,
-    const SuiteSparse_long Ti [ ],
-    const SuiteSparse_long Tj [ ],
-    const double Tx [ ], const double Tz [ ],
-    SuiteSparse_long Ap [ ],
-    SuiteSparse_long Ai [ ],
-    double Ax [ ], double Az [ ],
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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) ;
-
-SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Include/umfpack_wsolve.h b/src/C/SuiteSparse/UMFPACK/Include/umfpack_wsolve.h
deleted file mode 100644
index cc64101..0000000
--- a/src/C/SuiteSparse/UMFPACK/Include/umfpack_wsolve.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_wsolve ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 [ ]
-) ;
-
-SuiteSparse_long umfpack_dl_wsolve
-(
-    SuiteSparse_long sys,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_long Ai [ ],
-    const double Ax [ ],
-    double X [ ],
-    const double B [ ],
-    void *Numeric,
-    const double Control [UMFPACK_CONTROL],
-    double Info [UMFPACK_INFO],
-    SuiteSparse_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 [ ]
-) ;
-
-SuiteSparse_long umfpack_zl_wsolve
-(
-    SuiteSparse_long sys,
-    const SuiteSparse_long Ap [ ],
-    const SuiteSparse_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],
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_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 SuiteSparse_long Syntax:
-
-    #include "umfpack.h"
-    void *Numeric ;
-    SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Lib/GNUmakefile b/src/C/SuiteSparse/UMFPACK/Lib/GNUmakefile
deleted file mode 100644
index c5d7235..0000000
--- a/src/C/SuiteSparse/UMFPACK/Lib/GNUmakefile
+++ /dev/null
@@ -1,271 +0,0 @@
-#-------------------------------------------------------------------------------
-# UMFPACK Makefile for compiling on Unix systems (for GNU Make)
-#-------------------------------------------------------------------------------
-
-default: libumfpack.a
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-# UMFPACK can use CHOLMOD by default as an ordering option
-ifneq (,$(findstring -DNCHOLMOD, $(UMFPACK_CONFIG)))
-    I = -I../Include -I../Source -I../../AMD/Include -I../../SuiteSparse_config
-else
-    I = -I../Include -I../Source -I../../AMD/Include \
-        -I../../SuiteSparse_config -I../../CHOLMOD/Include
-endif
-
-C = $(CC) $(CF) $(UMFPACK_CONFIG) $(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_store_lu umf_scale
-
-# non-user-callable umf_*.[ch] files, int/SuiteSparse_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 umf_cholmod
-
-# non-user-callable, created from umf_ltsolve.c, umf_utsolve.c,
-# umf_triplet.c, and umf_assemble.c , with int/SuiteSparse_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/SuiteSparse_long and real/complex versions:
-UMF = $(UMF_CREATED) $(UMFCH)
-
-# user-callable umfpack_*.[ch] files (int/SuiteSparse_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/SuiteSparse_long and real/complex versions:
-UMFPACKW = umfpack_wsolve
-
-USER = $(UMFPACKW) $(UMFPACK)
-
-# user-callable, only one version for int/SuiteSparse_long,
-# real/complex, *.[ch] files:
-GENERIC = umfpack_timer umfpack_tictoc
-
-#-------------------------------------------------------------------------------
-# include files:
-#-------------------------------------------------------------------------------
-
-INC = ../Include/umfpack.h ../../SuiteSparse_config/SuiteSparse_config.h \
-	../Source/umf_config.h ../Source/umf_version.h \
-	../Source/umf_internal.h ../Source/umf_triplet.h \
-	$(addprefix ../Source/,  $(addsuffix .h,$(UMFCH))) \
-	$(addprefix ../Source/,  $(addsuffix .h,$(UMFINT))) \
-	$(addprefix ../Include/, $(addsuffix .h,$(USER))) \
-	$(addprefix ../Include/, $(addsuffix .h,$(GENERIC))) \
-	../../AMD/Include/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)))
-II = $(addsuffix .o, $(subst umf_,umf_i_,$(UMFINT)))
-LL = $(addsuffix .o, $(subst umf_,umf_l_,$(UMFINT)))
-GN = $(addsuffix .o, $(subst umfpack_,umfpack_gn_,$(GENERIC)))
-
-#-------------------------------------------------------------------------------
-# compile each int and SuiteSparse_long routine (with no real/complex version)
-#-------------------------------------------------------------------------------
-
-umf_i_%.o: ../Source/umf_%.c $(INC)
-	$(C) -DDINT -c $< -o $@
-
-umf_l_%.o: ../Source/umf_%.c $(INC)
-	$(C) -DDLONG -c $< -o $@
-
-#-------------------------------------------------------------------------------
-# compile each routine in the DI version
-#-------------------------------------------------------------------------------
-
-umf_di_%.o: ../Source/umf_%.c $(INC)
-	$(C) -DDINT -c $< -o $@
-
-umf_di_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
-	$(C) -DDINT -DCONJUGATE_SOLVE -c $< -o $@
-
-umf_di_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DDINT -DDO_MAP -DDO_VALUES -c $< -o $@
-
-umf_di_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DDINT -DDO_MAP -c $< -o $@
-
-umf_di_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DDINT -DDO_VALUES -c $< -o $@
-
-umf_di_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DDINT -c $< -o $@
-
-umf_di_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
-	$(C) -DDINT -DFIXQ -c $< -o $@
-
-umf_di_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
-	$(C) -DDINT -DDROP -c $< -o $@
-
-umfpack_di_wsolve.o: ../Source/umfpack_solve.c $(INC)
-	$(C) -DDINT -DWSOLVE -c $< -o $@
-
-umfpack_di_%.o: ../Source/umfpack_%.c $(INC)
-	$(C) -DDINT -c $< -o $@
-
-#-------------------------------------------------------------------------------
-# compile each routine in the DL version
-#-------------------------------------------------------------------------------
-
-umf_dl_%.o: ../Source/umf_%.c $(INC)
-	$(C) -DDLONG -c $< -o $@
-
-umf_dl_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
-	$(C) -DDLONG -DCONJUGATE_SOLVE -c $< -o $@
-
-umf_dl_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DDLONG -DDO_MAP -DDO_VALUES -c $< -o $@
-
-umf_dl_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DDLONG -DDO_MAP -c $< -o $@
-
-umf_dl_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DDLONG -DDO_VALUES -c $< -o $@
-
-umf_dl_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DDLONG -c $< -o $@
-
-umf_dl_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
-	$(C) -DDLONG -DFIXQ -c $< -o $@
-
-umf_dl_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
-	$(C) -DDLONG -DDROP -c $< -o $@
-
-umfpack_dl_wsolve.o: ../Source/umfpack_solve.c $(INC)
-	$(C) -DDLONG -DWSOLVE -c $< -o $@
-
-umfpack_dl_%.o: ../Source/umfpack_%.c $(INC)
-	$(C) -DDLONG -c $< -o $@
-
-#-------------------------------------------------------------------------------
-# compile each routine in the ZI version
-#-------------------------------------------------------------------------------
-
-umf_zi_%.o: ../Source/umf_%.c $(INC)
-	$(C) -DZINT -c $< -o $@
-
-umf_zi_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
-	$(C) -DZINT -DCONJUGATE_SOLVE -c $< -o $@
-
-umf_zi_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DZINT -DDO_MAP -DDO_VALUES -c $< -o $@
-
-umf_zi_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DZINT -DDO_MAP -c $< -o $@
-
-umf_zi_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DZINT -DDO_VALUES -c $< -o $@
-
-umf_zi_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DZINT -c $< -o $@
-
-umf_zi_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
-	$(C) -DZINT -DFIXQ -c $< -o $@
-
-umf_zi_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
-	$(C) -DZINT -DDROP -c $< -o $@
-
-umfpack_zi_wsolve.o: ../Source/umfpack_solve.c $(INC)
-	$(C) -DZINT -DWSOLVE -c $< -o $@
-
-umfpack_zi_%.o: ../Source/umfpack_%.c $(INC)
-	$(C) -DZINT -c $< -o $@
-
-#-------------------------------------------------------------------------------
-# compile each routine in the ZL version
-#-------------------------------------------------------------------------------
-
-umf_zl_%.o: ../Source/umf_%.c $(INC)
-	$(C) -DZLONG -c $< -o $@
-
-umf_zl_%hsolve.o: ../Source/umf_%tsolve.c $(INC)
-	$(C) -DZLONG -DCONJUGATE_SOLVE -c $< -o $@
-
-umf_zl_triplet_map_x.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DZLONG -DDO_MAP -DDO_VALUES -c $< -o $@
-
-umf_zl_triplet_map_nox.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DZLONG -DDO_MAP -c $< -o $@
-
-umf_zl_triplet_nomap_x.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DZLONG -DDO_VALUES -c $< -o $@
-
-umf_zl_triplet_nomap_nox.o: ../Source/umf_triplet.c $(INC)
-	$(C) -DZLONG -c $< -o $@
-
-umf_zl_assemble_fixq.o: ../Source/umf_assemble.c $(INC)
-	$(C) -DZLONG -DFIXQ -c $< -o $@
-
-umf_zl_store_lu_drop.o: ../Source/umf_store_lu.c $(INC)
-	$(C) -DZLONG -DDROP -c $< -o $@
-
-umfpack_zl_wsolve.o: ../Source/umfpack_solve.c $(INC)
-	$(C) -DZLONG -DWSOLVE -c $< -o $@
-
-umfpack_zl_%.o: ../Source/umfpack_%.c $(INC)
-	$(C) -DZLONG -c $< -o $@
-
-#-------------------------------------------------------------------------------
-# Create the generic routines (GN) using a generic rule
-#-------------------------------------------------------------------------------
-
-umfpack_gn_%.o: ../Source/umfpack_%.c $(INC)
-	$(C) -c $< -o $@
-
-#-------------------------------------------------------------------------------
-# Create the libumfpack.a library
-#-------------------------------------------------------------------------------
-
-libumfpack.a: $(II) $(LL) $(GN) $(DI) $(DL) $(ZI) $(ZL)
-	$(ARCHIVE)  libumfpack.a $^
-	- $(RANLIB) libumfpack.a
-
-so: $(II) $(LL) $(GN) $(DI) $(DL) $(ZI) $(ZL)
-	gcc -shared -Wl,-soname,libumfpack.so -o libumfpack.so $^
-
-#-------------------------------------------------------------------------------
-# Remove all but the files in the original distribution
-#-------------------------------------------------------------------------------
-
-purge: clean
-	- $(RM) libumfpack.a
-
-clean:
-	- $(RM) $(CLEAN)
diff --git a/src/C/SuiteSparse/UMFPACK/Lib/Makefile b/src/C/SuiteSparse/UMFPACK/Lib/Makefile
deleted file mode 100644
index f9cb0ea..0000000
--- a/src/C/SuiteSparse/UMFPACK/Lib/Makefile
+++ /dev/null
@@ -1,482 +0,0 @@
-#-------------------------------------------------------------------------------
-# 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.
-
-default: everything
-
-include ../../SuiteSparse_config/SuiteSparse_config.mk
-
-C = $(CC) $(CF) $(UMFPACK_CONFIG) \
-    -I../Include -I../Source -I../../AMD/Include -I../../SuiteSparse_config \
-    -I../../CHOLMOD/Include
-
-everything:
-	$(C) -DDINT -c ../Source/umf_analyze.c -o umf_i_analyze.o
-	$(C) -DDINT -c ../Source/umf_apply_order.c -o umf_i_apply_order.o
-	$(C) -DDINT -c ../Source/umf_colamd.c -o umf_i_colamd.o
-	$(C) -DDINT -c ../Source/umf_cholmod.c -o umf_i_cholmod.o
-	$(C) -DDINT -c ../Source/umf_free.c -o umf_i_free.o
-	$(C) -DDINT -c ../Source/umf_fsize.c -o umf_i_fsize.o
-	$(C) -DDINT -c ../Source/umf_is_permutation.c -o umf_i_is_permutation.o
-	$(C) -DDINT -c ../Source/umf_malloc.c -o umf_i_malloc.o
-	$(C) -DDINT -c ../Source/umf_realloc.c -o umf_i_realloc.o
-	$(C) -DDINT -c ../Source/umf_report_perm.c -o umf_i_report_perm.o
-	$(C) -DDINT -c ../Source/umf_singletons.c -o umf_i_singletons.o
-	$(C) -DDLONG -c ../Source/umf_analyze.c -o umf_l_analyze.o
-	$(C) -DDLONG -c ../Source/umf_apply_order.c -o umf_l_apply_order.o
-	$(C) -DDLONG -c ../Source/umf_colamd.c -o umf_l_colamd.o
-	$(C) -DDLONG -c ../Source/umf_cholmod.c -o umf_l_cholmod.o
-	$(C) -DDLONG -c ../Source/umf_free.c -o umf_l_free.o
-	$(C) -DDLONG -c ../Source/umf_fsize.c -o umf_l_fsize.o
-	$(C) -DDLONG -c ../Source/umf_is_permutation.c -o umf_l_is_permutation.o
-	$(C) -DDLONG -c ../Source/umf_malloc.c -o umf_l_malloc.o
-	$(C) -DDLONG -c ../Source/umf_realloc.c -o umf_l_realloc.o
-	$(C) -DDLONG -c ../Source/umf_report_perm.c -o umf_l_report_perm.o
-	$(C) -DDLONG -c ../Source/umf_singletons.c -o umf_l_singletons.o
-	$(C) -c ../Source/umfpack_timer.c -o umfpack_gn_timer.o
-	$(C) -c ../Source/umfpack_tictoc.c -o umfpack_gn_tictoc.o
-	$(C) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c -o umf_di_lhsolve.o
-	$(C) -DDINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c -o umf_di_uhsolve.o
-	$(C) -DDINT -DDO_MAP -c ../Source/umf_triplet.c -o umf_di_triplet_map_nox.o
-	$(C) -DDINT -DDO_VALUES -c ../Source/umf_triplet.c -o umf_di_triplet_nomap_x.o
-	$(C) -DDINT -c ../Source/umf_triplet.c -o umf_di_triplet_nomap_nox.o
-	$(C) -DDINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c -o umf_di_triplet_map_x.o
-	$(C) -DDINT -DFIXQ -c ../Source/umf_assemble.c -o umf_di_assemble_fixq.o
-	$(C) -DDINT -DDROP -c ../Source/umf_store_lu.c -o umf_di_store_lu_drop.o
-	$(C) -DDINT -c ../Source/umf_assemble.c -o umf_di_assemble.o
-	$(C) -DDINT -c ../Source/umf_blas3_update.c -o umf_di_blas3_update.o
-	$(C) -DDINT -c ../Source/umf_build_tuples.c -o umf_di_build_tuples.o
-	$(C) -DDINT -c ../Source/umf_create_element.c -o umf_di_create_element.o
-	$(C) -DDINT -c ../Source/umf_dump.c -o umf_di_dump.o
-	$(C) -DDINT -c ../Source/umf_extend_front.c -o umf_di_extend_front.o
-	$(C) -DDINT -c ../Source/umf_garbage_collection.c -o umf_di_garbage_collection.o
-	$(C) -DDINT -c ../Source/umf_get_memory.c -o umf_di_get_memory.o
-	$(C) -DDINT -c ../Source/umf_init_front.c -o umf_di_init_front.o
-	$(C) -DDINT -c ../Source/umf_kernel.c -o umf_di_kernel.o
-	$(C) -DDINT -c ../Source/umf_kernel_init.c -o umf_di_kernel_init.o
-	$(C) -DDINT -c ../Source/umf_kernel_wrapup.c -o umf_di_kernel_wrapup.o
-	$(C) -DDINT -c ../Source/umf_local_search.c -o umf_di_local_search.o
-	$(C) -DDINT -c ../Source/umf_lsolve.c -o umf_di_lsolve.o
-	$(C) -DDINT -c ../Source/umf_ltsolve.c -o umf_di_ltsolve.o
-	$(C) -DDINT -c ../Source/umf_mem_alloc_element.c -o umf_di_mem_alloc_element.o
-	$(C) -DDINT -c ../Source/umf_mem_alloc_head_block.c -o umf_di_mem_alloc_head_block.o
-	$(C) -DDINT -c ../Source/umf_mem_alloc_tail_block.c -o umf_di_mem_alloc_tail_block.o
-	$(C) -DDINT -c ../Source/umf_mem_free_tail_block.c -o umf_di_mem_free_tail_block.o
-	$(C) -DDINT -c ../Source/umf_mem_init_memoryspace.c -o umf_di_mem_init_memoryspace.o
-	$(C) -DDINT -c ../Source/umf_report_vector.c -o umf_di_report_vector.o
-	$(C) -DDINT -c ../Source/umf_row_search.c -o umf_di_row_search.o
-	$(C) -DDINT -c ../Source/umf_scale_column.c -o umf_di_scale_column.o
-	$(C) -DDINT -c ../Source/umf_set_stats.c -o umf_di_set_stats.o
-	$(C) -DDINT -c ../Source/umf_solve.c -o umf_di_solve.o
-	$(C) -DDINT -c ../Source/umf_symbolic_usage.c -o umf_di_symbolic_usage.o
-	$(C) -DDINT -c ../Source/umf_transpose.c -o umf_di_transpose.o
-	$(C) -DDINT -c ../Source/umf_tuple_lengths.c -o umf_di_tuple_lengths.o
-	$(C) -DDINT -c ../Source/umf_usolve.c -o umf_di_usolve.o
-	$(C) -DDINT -c ../Source/umf_utsolve.c -o umf_di_utsolve.o
-	$(C) -DDINT -c ../Source/umf_valid_numeric.c -o umf_di_valid_numeric.o
-	$(C) -DDINT -c ../Source/umf_valid_symbolic.c -o umf_di_valid_symbolic.o
-	$(C) -DDINT -c ../Source/umf_grow_front.c -o umf_di_grow_front.o
-	$(C) -DDINT -c ../Source/umf_start_front.c -o umf_di_start_front.o
-	$(C) -DDINT -c ../Source/umf_store_lu.c -o umf_di_store_lu.o
-	$(C) -DDINT -c ../Source/umf_scale.c -o umf_di_scale.o
-	$(C) -DDINT -DWSOLVE -c ../Source/umfpack_solve.c -o umfpack_di_wsolve.o
-	$(C) -DDINT -c ../Source/umfpack_col_to_triplet.c -o umfpack_di_col_to_triplet.o
-	$(C) -DDINT -c ../Source/umfpack_defaults.c -o umfpack_di_defaults.o
-	$(C) -DDINT -c ../Source/umfpack_free_numeric.c -o umfpack_di_free_numeric.o
-	$(C) -DDINT -c ../Source/umfpack_free_symbolic.c -o umfpack_di_free_symbolic.o
-	$(C) -DDINT -c ../Source/umfpack_get_numeric.c -o umfpack_di_get_numeric.o
-	$(C) -DDINT -c ../Source/umfpack_get_lunz.c -o umfpack_di_get_lunz.o
-	$(C) -DDINT -c ../Source/umfpack_get_symbolic.c -o umfpack_di_get_symbolic.o
-	$(C) -DDINT -c ../Source/umfpack_get_determinant.c -o umfpack_di_get_determinant.o
-	$(C) -DDINT -c ../Source/umfpack_numeric.c -o umfpack_di_numeric.o
-	$(C) -DDINT -c ../Source/umfpack_qsymbolic.c -o umfpack_di_qsymbolic.o
-	$(C) -DDINT -c ../Source/umfpack_report_control.c -o umfpack_di_report_control.o
-	$(C) -DDINT -c ../Source/umfpack_report_info.c -o umfpack_di_report_info.o
-	$(C) -DDINT -c ../Source/umfpack_report_matrix.c -o umfpack_di_report_matrix.o
-	$(C) -DDINT -c ../Source/umfpack_report_numeric.c -o umfpack_di_report_numeric.o
-	$(C) -DDINT -c ../Source/umfpack_report_perm.c -o umfpack_di_report_perm.o
-	$(C) -DDINT -c ../Source/umfpack_report_status.c -o umfpack_di_report_status.o
-	$(C) -DDINT -c ../Source/umfpack_report_symbolic.c -o umfpack_di_report_symbolic.o
-	$(C) -DDINT -c ../Source/umfpack_report_triplet.c -o umfpack_di_report_triplet.o
-	$(C) -DDINT -c ../Source/umfpack_report_vector.c -o umfpack_di_report_vector.o
-	$(C) -DDINT -c ../Source/umfpack_solve.c -o umfpack_di_solve.o
-	$(C) -DDINT -c ../Source/umfpack_symbolic.c -o umfpack_di_symbolic.o
-	$(C) -DDINT -c ../Source/umfpack_transpose.c -o umfpack_di_transpose.o
-	$(C) -DDINT -c ../Source/umfpack_triplet_to_col.c -o umfpack_di_triplet_to_col.o
-	$(C) -DDINT -c ../Source/umfpack_scale.c -o umfpack_di_scale.o
-	$(C) -DDINT -c ../Source/umfpack_load_numeric.c -o umfpack_di_load_numeric.o
-	$(C) -DDINT -c ../Source/umfpack_save_numeric.c -o umfpack_di_save_numeric.o
-	$(C) -DDINT -c ../Source/umfpack_load_symbolic.c -o umfpack_di_load_symbolic.o
-	$(C) -DDINT -c ../Source/umfpack_save_symbolic.c -o umfpack_di_save_symbolic.o
-	$(C) -DDLONG -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c -o umf_dl_lhsolve.o
-	$(C) -DDLONG -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c -o umf_dl_uhsolve.o
-	$(C) -DDLONG -DDO_MAP -c ../Source/umf_triplet.c -o umf_dl_triplet_map_nox.o
-	$(C) -DDLONG -DDO_VALUES -c ../Source/umf_triplet.c -o umf_dl_triplet_nomap_x.o
-	$(C) -DDLONG -c ../Source/umf_triplet.c -o umf_dl_triplet_nomap_nox.o
-	$(C) -DDLONG -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c -o umf_dl_triplet_map_x.o
-	$(C) -DDLONG -DFIXQ -c ../Source/umf_assemble.c -o umf_dl_assemble_fixq.o
-	$(C) -DDLONG -DDROP -c ../Source/umf_store_lu.c -o umf_dl_store_lu_drop.o
-	$(C) -DDLONG -c ../Source/umf_assemble.c -o umf_dl_assemble.o
-	$(C) -DDLONG -c ../Source/umf_blas3_update.c -o umf_dl_blas3_update.o
-	$(C) -DDLONG -c ../Source/umf_build_tuples.c -o umf_dl_build_tuples.o
-	$(C) -DDLONG -c ../Source/umf_create_element.c -o umf_dl_create_element.o
-	$(C) -DDLONG -c ../Source/umf_dump.c -o umf_dl_dump.o
-	$(C) -DDLONG -c ../Source/umf_extend_front.c -o umf_dl_extend_front.o
-	$(C) -DDLONG -c ../Source/umf_garbage_collection.c -o umf_dl_garbage_collection.o
-	$(C) -DDLONG -c ../Source/umf_get_memory.c -o umf_dl_get_memory.o
-	$(C) -DDLONG -c ../Source/umf_init_front.c -o umf_dl_init_front.o
-	$(C) -DDLONG -c ../Source/umf_kernel.c -o umf_dl_kernel.o
-	$(C) -DDLONG -c ../Source/umf_kernel_init.c -o umf_dl_kernel_init.o
-	$(C) -DDLONG -c ../Source/umf_kernel_wrapup.c -o umf_dl_kernel_wrapup.o
-	$(C) -DDLONG -c ../Source/umf_local_search.c -o umf_dl_local_search.o
-	$(C) -DDLONG -c ../Source/umf_lsolve.c -o umf_dl_lsolve.o
-	$(C) -DDLONG -c ../Source/umf_ltsolve.c -o umf_dl_ltsolve.o
-	$(C) -DDLONG -c ../Source/umf_mem_alloc_element.c -o umf_dl_mem_alloc_element.o
-	$(C) -DDLONG -c ../Source/umf_mem_alloc_head_block.c -o umf_dl_mem_alloc_head_block.o
-	$(C) -DDLONG -c ../Source/umf_mem_alloc_tail_block.c -o umf_dl_mem_alloc_tail_block.o
-	$(C) -DDLONG -c ../Source/umf_mem_free_tail_block.c -o umf_dl_mem_free_tail_block.o
-	$(C) -DDLONG -c ../Source/umf_mem_init_memoryspace.c -o umf_dl_mem_init_memoryspace.o
-	$(C) -DDLONG -c ../Source/umf_report_vector.c -o umf_dl_report_vector.o
-	$(C) -DDLONG -c ../Source/umf_row_search.c -o umf_dl_row_search.o
-	$(C) -DDLONG -c ../Source/umf_scale_column.c -o umf_dl_scale_column.o
-	$(C) -DDLONG -c ../Source/umf_set_stats.c -o umf_dl_set_stats.o
-	$(C) -DDLONG -c ../Source/umf_solve.c -o umf_dl_solve.o
-	$(C) -DDLONG -c ../Source/umf_symbolic_usage.c -o umf_dl_symbolic_usage.o
-	$(C) -DDLONG -c ../Source/umf_transpose.c -o umf_dl_transpose.o
-	$(C) -DDLONG -c ../Source/umf_tuple_lengths.c -o umf_dl_tuple_lengths.o
-	$(C) -DDLONG -c ../Source/umf_usolve.c -o umf_dl_usolve.o
-	$(C) -DDLONG -c ../Source/umf_utsolve.c -o umf_dl_utsolve.o
-	$(C) -DDLONG -c ../Source/umf_valid_numeric.c -o umf_dl_valid_numeric.o
-	$(C) -DDLONG -c ../Source/umf_valid_symbolic.c -o umf_dl_valid_symbolic.o
-	$(C) -DDLONG -c ../Source/umf_grow_front.c -o umf_dl_grow_front.o
-	$(C) -DDLONG -c ../Source/umf_start_front.c -o umf_dl_start_front.o
-	$(C) -DDLONG -c ../Source/umf_store_lu.c -o umf_dl_store_lu.o
-	$(C) -DDLONG -c ../Source/umf_scale.c -o umf_dl_scale.o
-	$(C) -DDLONG -DWSOLVE -c ../Source/umfpack_solve.c -o umfpack_dl_wsolve.o
-	$(C) -DDLONG -c ../Source/umfpack_col_to_triplet.c -o umfpack_dl_col_to_triplet.o
-	$(C) -DDLONG -c ../Source/umfpack_defaults.c -o umfpack_dl_defaults.o
-	$(C) -DDLONG -c ../Source/umfpack_free_numeric.c -o umfpack_dl_free_numeric.o
-	$(C) -DDLONG -c ../Source/umfpack_free_symbolic.c -o umfpack_dl_free_symbolic.o
-	$(C) -DDLONG -c ../Source/umfpack_get_numeric.c -o umfpack_dl_get_numeric.o
-	$(C) -DDLONG -c ../Source/umfpack_get_lunz.c -o umfpack_dl_get_lunz.o
-	$(C) -DDLONG -c ../Source/umfpack_get_symbolic.c -o umfpack_dl_get_symbolic.o
-	$(C) -DDLONG -c ../Source/umfpack_get_determinant.c -o umfpack_dl_get_determinant.o
-	$(C) -DDLONG -c ../Source/umfpack_numeric.c -o umfpack_dl_numeric.o
-	$(C) -DDLONG -c ../Source/umfpack_qsymbolic.c -o umfpack_dl_qsymbolic.o
-	$(C) -DDLONG -c ../Source/umfpack_report_control.c -o umfpack_dl_report_control.o
-	$(C) -DDLONG -c ../Source/umfpack_report_info.c -o umfpack_dl_report_info.o
-	$(C) -DDLONG -c ../Source/umfpack_report_matrix.c -o umfpack_dl_report_matrix.o
-	$(C) -DDLONG -c ../Source/umfpack_report_numeric.c -o umfpack_dl_report_numeric.o
-	$(C) -DDLONG -c ../Source/umfpack_report_perm.c -o umfpack_dl_report_perm.o
-	$(C) -DDLONG -c ../Source/umfpack_report_status.c -o umfpack_dl_report_status.o
-	$(C) -DDLONG -c ../Source/umfpack_report_symbolic.c -o umfpack_dl_report_symbolic.o
-	$(C) -DDLONG -c ../Source/umfpack_report_triplet.c -o umfpack_dl_report_triplet.o
-	$(C) -DDLONG -c ../Source/umfpack_report_vector.c -o umfpack_dl_report_vector.o
-	$(C) -DDLONG -c ../Source/umfpack_solve.c -o umfpack_dl_solve.o
-	$(C) -DDLONG -c ../Source/umfpack_symbolic.c -o umfpack_dl_symbolic.o
-	$(C) -DDLONG -c ../Source/umfpack_transpose.c -o umfpack_dl_transpose.o
-	$(C) -DDLONG -c ../Source/umfpack_triplet_to_col.c -o umfpack_dl_triplet_to_col.o
-	$(C) -DDLONG -c ../Source/umfpack_scale.c -o umfpack_dl_scale.o
-	$(C) -DDLONG -c ../Source/umfpack_load_numeric.c -o umfpack_dl_load_numeric.o
-	$(C) -DDLONG -c ../Source/umfpack_save_numeric.c -o umfpack_dl_save_numeric.o
-	$(C) -DDLONG -c ../Source/umfpack_load_symbolic.c -o umfpack_dl_load_symbolic.o
-	$(C) -DDLONG -c ../Source/umfpack_save_symbolic.c -o umfpack_dl_save_symbolic.o
-	$(C) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c -o umf_zi_lhsolve.o
-	$(C) -DZINT -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c -o umf_zi_uhsolve.o
-	$(C) -DZINT -DDO_MAP -c ../Source/umf_triplet.c -o umf_zi_triplet_map_nox.o
-	$(C) -DZINT -DDO_VALUES -c ../Source/umf_triplet.c -o umf_zi_triplet_nomap_x.o
-	$(C) -DZINT -c ../Source/umf_triplet.c -o umf_zi_triplet_nomap_nox.o
-	$(C) -DZINT -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c -o umf_zi_triplet_map_x.o
-	$(C) -DZINT -DFIXQ -c ../Source/umf_assemble.c -o umf_zi_assemble_fixq.o
-	$(C) -DZINT -DDROP -c ../Source/umf_store_lu.c -o umf_zi_store_lu_drop.o
-	$(C) -DZINT -c ../Source/umf_assemble.c -o umf_zi_assemble.o
-	$(C) -DZINT -c ../Source/umf_blas3_update.c -o umf_zi_blas3_update.o
-	$(C) -DZINT -c ../Source/umf_build_tuples.c -o umf_zi_build_tuples.o
-	$(C) -DZINT -c ../Source/umf_create_element.c -o umf_zi_create_element.o
-	$(C) -DZINT -c ../Source/umf_dump.c -o umf_zi_dump.o
-	$(C) -DZINT -c ../Source/umf_extend_front.c -o umf_zi_extend_front.o
-	$(C) -DZINT -c ../Source/umf_garbage_collection.c -o umf_zi_garbage_collection.o
-	$(C) -DZINT -c ../Source/umf_get_memory.c -o umf_zi_get_memory.o
-	$(C) -DZINT -c ../Source/umf_init_front.c -o umf_zi_init_front.o
-	$(C) -DZINT -c ../Source/umf_kernel.c -o umf_zi_kernel.o
-	$(C) -DZINT -c ../Source/umf_kernel_init.c -o umf_zi_kernel_init.o
-	$(C) -DZINT -c ../Source/umf_kernel_wrapup.c -o umf_zi_kernel_wrapup.o
-	$(C) -DZINT -c ../Source/umf_local_search.c -o umf_zi_local_search.o
-	$(C) -DZINT -c ../Source/umf_lsolve.c -o umf_zi_lsolve.o
-	$(C) -DZINT -c ../Source/umf_ltsolve.c -o umf_zi_ltsolve.o
-	$(C) -DZINT -c ../Source/umf_mem_alloc_element.c -o umf_zi_mem_alloc_element.o
-	$(C) -DZINT -c ../Source/umf_mem_alloc_head_block.c -o umf_zi_mem_alloc_head_block.o
-	$(C) -DZINT -c ../Source/umf_mem_alloc_tail_block.c -o umf_zi_mem_alloc_tail_block.o
-	$(C) -DZINT -c ../Source/umf_mem_free_tail_block.c -o umf_zi_mem_free_tail_block.o
-	$(C) -DZINT -c ../Source/umf_mem_init_memoryspace.c -o umf_zi_mem_init_memoryspace.o
-	$(C) -DZINT -c ../Source/umf_report_vector.c -o umf_zi_report_vector.o
-	$(C) -DZINT -c ../Source/umf_row_search.c -o umf_zi_row_search.o
-	$(C) -DZINT -c ../Source/umf_scale_column.c -o umf_zi_scale_column.o
-	$(C) -DZINT -c ../Source/umf_set_stats.c -o umf_zi_set_stats.o
-	$(C) -DZINT -c ../Source/umf_solve.c -o umf_zi_solve.o
-	$(C) -DZINT -c ../Source/umf_symbolic_usage.c -o umf_zi_symbolic_usage.o
-	$(C) -DZINT -c ../Source/umf_transpose.c -o umf_zi_transpose.o
-	$(C) -DZINT -c ../Source/umf_tuple_lengths.c -o umf_zi_tuple_lengths.o
-	$(C) -DZINT -c ../Source/umf_usolve.c -o umf_zi_usolve.o
-	$(C) -DZINT -c ../Source/umf_utsolve.c -o umf_zi_utsolve.o
-	$(C) -DZINT -c ../Source/umf_valid_numeric.c -o umf_zi_valid_numeric.o
-	$(C) -DZINT -c ../Source/umf_valid_symbolic.c -o umf_zi_valid_symbolic.o
-	$(C) -DZINT -c ../Source/umf_grow_front.c -o umf_zi_grow_front.o
-	$(C) -DZINT -c ../Source/umf_start_front.c -o umf_zi_start_front.o
-	$(C) -DZINT -c ../Source/umf_store_lu.c -o umf_zi_store_lu.o
-	$(C) -DZINT -c ../Source/umf_scale.c -o umf_zi_scale.o
-	$(C) -DZINT -DWSOLVE -c ../Source/umfpack_solve.c -o umfpack_zi_wsolve.o
-	$(C) -DZINT -c ../Source/umfpack_col_to_triplet.c -o umfpack_zi_col_to_triplet.o
-	$(C) -DZINT -c ../Source/umfpack_defaults.c -o umfpack_zi_defaults.o
-	$(C) -DZINT -c ../Source/umfpack_free_numeric.c -o umfpack_zi_free_numeric.o
-	$(C) -DZINT -c ../Source/umfpack_free_symbolic.c -o umfpack_zi_free_symbolic.o
-	$(C) -DZINT -c ../Source/umfpack_get_numeric.c -o umfpack_zi_get_numeric.o
-	$(C) -DZINT -c ../Source/umfpack_get_lunz.c -o umfpack_zi_get_lunz.o
-	$(C) -DZINT -c ../Source/umfpack_get_symbolic.c -o umfpack_zi_get_symbolic.o
-	$(C) -DZINT -c ../Source/umfpack_get_determinant.c -o umfpack_zi_get_determinant.o
-	$(C) -DZINT -c ../Source/umfpack_numeric.c -o umfpack_zi_numeric.o
-	$(C) -DZINT -c ../Source/umfpack_qsymbolic.c -o umfpack_zi_qsymbolic.o
-	$(C) -DZINT -c ../Source/umfpack_report_control.c -o umfpack_zi_report_control.o
-	$(C) -DZINT -c ../Source/umfpack_report_info.c -o umfpack_zi_report_info.o
-	$(C) -DZINT -c ../Source/umfpack_report_matrix.c -o umfpack_zi_report_matrix.o
-	$(C) -DZINT -c ../Source/umfpack_report_numeric.c -o umfpack_zi_report_numeric.o
-	$(C) -DZINT -c ../Source/umfpack_report_perm.c -o umfpack_zi_report_perm.o
-	$(C) -DZINT -c ../Source/umfpack_report_status.c -o umfpack_zi_report_status.o
-	$(C) -DZINT -c ../Source/umfpack_report_symbolic.c -o umfpack_zi_report_symbolic.o
-	$(C) -DZINT -c ../Source/umfpack_report_triplet.c -o umfpack_zi_report_triplet.o
-	$(C) -DZINT -c ../Source/umfpack_report_vector.c -o umfpack_zi_report_vector.o
-	$(C) -DZINT -c ../Source/umfpack_solve.c -o umfpack_zi_solve.o
-	$(C) -DZINT -c ../Source/umfpack_symbolic.c -o umfpack_zi_symbolic.o
-	$(C) -DZINT -c ../Source/umfpack_transpose.c -o umfpack_zi_transpose.o
-	$(C) -DZINT -c ../Source/umfpack_triplet_to_col.c -o umfpack_zi_triplet_to_col.o
-	$(C) -DZINT -c ../Source/umfpack_scale.c -o umfpack_zi_scale.o
-	$(C) -DZINT -c ../Source/umfpack_load_numeric.c -o umfpack_zi_load_numeric.o
-	$(C) -DZINT -c ../Source/umfpack_save_numeric.c -o umfpack_zi_save_numeric.o
-	$(C) -DZINT -c ../Source/umfpack_load_symbolic.c -o umfpack_zi_load_symbolic.o
-	$(C) -DZINT -c ../Source/umfpack_save_symbolic.c -o umfpack_zi_save_symbolic.o
-	$(C) -DZLONG -DCONJUGATE_SOLVE -c ../Source/umf_ltsolve.c -o umf_zl_lhsolve.o
-	$(C) -DZLONG -DCONJUGATE_SOLVE -c ../Source/umf_utsolve.c -o umf_zl_uhsolve.o
-	$(C) -DZLONG -DDO_MAP -c ../Source/umf_triplet.c -o umf_zl_triplet_map_nox.o
-	$(C) -DZLONG -DDO_VALUES -c ../Source/umf_triplet.c -o umf_zl_triplet_nomap_x.o
-	$(C) -DZLONG -c ../Source/umf_triplet.c -o umf_zl_triplet_nomap_nox.o
-	$(C) -DZLONG -DDO_MAP -DDO_VALUES -c ../Source/umf_triplet.c -o umf_zl_triplet_map_x.o
-	$(C) -DZLONG -DFIXQ -c ../Source/umf_assemble.c -o umf_zl_assemble_fixq.o
-	$(C) -DZLONG -DDROP -c ../Source/umf_store_lu.c -o umf_zl_store_lu_drop.o
-	$(C) -DZLONG -c ../Source/umf_assemble.c -o umf_zl_assemble.o
-	$(C) -DZLONG -c ../Source/umf_blas3_update.c -o umf_zl_blas3_update.o
-	$(C) -DZLONG -c ../Source/umf_build_tuples.c -o umf_zl_build_tuples.o
-	$(C) -DZLONG -c ../Source/umf_create_element.c -o umf_zl_create_element.o
-	$(C) -DZLONG -c ../Source/umf_dump.c -o umf_zl_dump.o
-	$(C) -DZLONG -c ../Source/umf_extend_front.c -o umf_zl_extend_front.o
-	$(C) -DZLONG -c ../Source/umf_garbage_collection.c -o umf_zl_garbage_collection.o
-	$(C) -DZLONG -c ../Source/umf_get_memory.c -o umf_zl_get_memory.o
-	$(C) -DZLONG -c ../Source/umf_init_front.c -o umf_zl_init_front.o
-	$(C) -DZLONG -c ../Source/umf_kernel.c -o umf_zl_kernel.o
-	$(C) -DZLONG -c ../Source/umf_kernel_init.c -o umf_zl_kernel_init.o
-	$(C) -DZLONG -c ../Source/umf_kernel_wrapup.c -o umf_zl_kernel_wrapup.o
-	$(C) -DZLONG -c ../Source/umf_local_search.c -o umf_zl_local_search.o
-	$(C) -DZLONG -c ../Source/umf_lsolve.c -o umf_zl_lsolve.o
-	$(C) -DZLONG -c ../Source/umf_ltsolve.c -o umf_zl_ltsolve.o
-	$(C) -DZLONG -c ../Source/umf_mem_alloc_element.c -o umf_zl_mem_alloc_element.o
-	$(C) -DZLONG -c ../Source/umf_mem_alloc_head_block.c -o umf_zl_mem_alloc_head_block.o
-	$(C) -DZLONG -c ../Source/umf_mem_alloc_tail_block.c -o umf_zl_mem_alloc_tail_block.o
-	$(C) -DZLONG -c ../Source/umf_mem_free_tail_block.c -o umf_zl_mem_free_tail_block.o
-	$(C) -DZLONG -c ../Source/umf_mem_init_memoryspace.c -o umf_zl_mem_init_memoryspace.o
-	$(C) -DZLONG -c ../Source/umf_report_vector.c -o umf_zl_report_vector.o
-	$(C) -DZLONG -c ../Source/umf_row_search.c -o umf_zl_row_search.o
-	$(C) -DZLONG -c ../Source/umf_scale_column.c -o umf_zl_scale_column.o
-	$(C) -DZLONG -c ../Source/umf_set_stats.c -o umf_zl_set_stats.o
-	$(C) -DZLONG -c ../Source/umf_solve.c -o umf_zl_solve.o
-	$(C) -DZLONG -c ../Source/umf_symbolic_usage.c -o umf_zl_symbolic_usage.o
-	$(C) -DZLONG -c ../Source/umf_transpose.c -o umf_zl_transpose.o
-	$(C) -DZLONG -c ../Source/umf_tuple_lengths.c -o umf_zl_tuple_lengths.o
-	$(C) -DZLONG -c ../Source/umf_usolve.c -o umf_zl_usolve.o
-	$(C) -DZLONG -c ../Source/umf_utsolve.c -o umf_zl_utsolve.o
-	$(C) -DZLONG -c ../Source/umf_valid_numeric.c -o umf_zl_valid_numeric.o
-	$(C) -DZLONG -c ../Source/umf_valid_symbolic.c -o umf_zl_valid_symbolic.o
-	$(C) -DZLONG -c ../Source/umf_grow_front.c -o umf_zl_grow_front.o
-	$(C) -DZLONG -c ../Source/umf_start_front.c -o umf_zl_start_front.o
-	$(C) -DZLONG -c ../Source/umf_store_lu.c -o umf_zl_store_lu.o
-	$(C) -DZLONG -c ../Source/umf_scale.c -o umf_zl_scale.o
-	$(C) -DZLONG -DWSOLVE -c ../Source/umfpack_solve.c -o umfpack_zl_wsolve.o
-	$(C) -DZLONG -c ../Source/umfpack_col_to_triplet.c -o umfpack_zl_col_to_triplet.o
-	$(C) -DZLONG -c ../Source/umfpack_defaults.c -o umfpack_zl_defaults.o
-	$(C) -DZLONG -c ../Source/umfpack_free_numeric.c -o umfpack_zl_free_numeric.o
-	$(C) -DZLONG -c ../Source/umfpack_free_symbolic.c -o umfpack_zl_free_symbolic.o
-	$(C) -DZLONG -c ../Source/umfpack_get_numeric.c -o umfpack_zl_get_numeric.o
-	$(C) -DZLONG -c ../Source/umfpack_get_lunz.c -o umfpack_zl_get_lunz.o
-	$(C) -DZLONG -c ../Source/umfpack_get_symbolic.c -o umfpack_zl_get_symbolic.o
-	$(C) -DZLONG -c ../Source/umfpack_get_determinant.c -o umfpack_zl_get_determinant.o
-	$(C) -DZLONG -c ../Source/umfpack_numeric.c -o umfpack_zl_numeric.o
-	$(C) -DZLONG -c ../Source/umfpack_qsymbolic.c -o umfpack_zl_qsymbolic.o
-	$(C) -DZLONG -c ../Source/umfpack_report_control.c -o umfpack_zl_report_control.o
-	$(C) -DZLONG -c ../Source/umfpack_report_info.c -o umfpack_zl_report_info.o
-	$(C) -DZLONG -c ../Source/umfpack_report_matrix.c -o umfpack_zl_report_matrix.o
-	$(C) -DZLONG -c ../Source/umfpack_report_numeric.c -o umfpack_zl_report_numeric.o
-	$(C) -DZLONG -c ../Source/umfpack_report_perm.c -o umfpack_zl_report_perm.o
-	$(C) -DZLONG -c ../Source/umfpack_report_status.c -o umfpack_zl_report_status.o
-	$(C) -DZLONG -c ../Source/umfpack_report_symbolic.c -o umfpack_zl_report_symbolic.o
-	$(C) -DZLONG -c ../Source/umfpack_report_triplet.c -o umfpack_zl_report_triplet.o
-	$(C) -DZLONG -c ../Source/umfpack_report_vector.c -o umfpack_zl_report_vector.o
-	$(C) -DZLONG -c ../Source/umfpack_solve.c -o umfpack_zl_solve.o
-	$(C) -DZLONG -c ../Source/umfpack_symbolic.c -o umfpack_zl_symbolic.o
-	$(C) -DZLONG -c ../Source/umfpack_transpose.c -o umfpack_zl_transpose.o
-	$(C) -DZLONG -c ../Source/umfpack_triplet_to_col.c -o umfpack_zl_triplet_to_col.o
-	$(C) -DZLONG -c ../Source/umfpack_scale.c -o umfpack_zl_scale.o
-	$(C) -DZLONG -c ../Source/umfpack_load_numeric.c -o umfpack_zl_load_numeric.o
-	$(C) -DZLONG -c ../Source/umfpack_save_numeric.c -o umfpack_zl_save_numeric.o
-	$(C) -DZLONG -c ../Source/umfpack_load_symbolic.c -o umfpack_zl_load_symbolic.o
-	$(C) -DZLONG -c ../Source/umfpack_save_symbolic.c -o umfpack_zl_save_symbolic.o
-	$(ARCHIVE)  ../Lib/libumfpack.a \
-	    umf_i_analyze.o umf_i_apply_order.o umf_i_colamd.o umf_i_free.o \
-            umf_i_cholmod.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_cholmod.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_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_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_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_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
-
-clean:
-	- $(RM) $(CLEAN)
diff --git a/src/C/SuiteSparse/UMFPACK/Lib/libumfpack.def b/src/C/SuiteSparse/UMFPACK/Lib/libumfpack.def
deleted file mode 100644
index 4ddc471..0000000
--- a/src/C/SuiteSparse/UMFPACK/Lib/libumfpack.def
+++ /dev/null
@@ -1,109 +0,0 @@
-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_fsymbolic
-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_fsymbolic
-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_fsymbolic
-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_fsymbolic
-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 --git a/src/C/SuiteSparse/UMFPACK/Makefile b/src/C/SuiteSparse/UMFPACK/Makefile
deleted file mode 100644
index 606654e..0000000
--- a/src/C/SuiteSparse/UMFPACK/Makefile
+++ /dev/null
@@ -1,80 +0,0 @@
-#-------------------------------------------------------------------------------
-# UMFPACK Makefile
-#-------------------------------------------------------------------------------
-
-VERSION = 5.7.1
-
-# UMFPACK requires the AMD package to be in ../AMD
-
-default: all
-
-include ../SuiteSparse_config/SuiteSparse_config.mk
-
-# compile all C code (except hb, fortran, and fortran64), incl. AMD and demos
-all:
-	( cd Lib    ; $(MAKE) )
-	( cd Demo   ; $(MAKE) )
-
-# compile just the C-callable UMFPACK library
-library:
-	( cd Lib    ; $(MAKE) )
-
-# 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 )
-
-# remove object files, but keep the compiled programs and library archives
-clean:
-	( cd Lib    ; $(MAKE) clean )
-	( cd Demo   ; $(MAKE) clean )
-	( cd Doc    ; $(MAKE) clean )
-	( cd MATLAB ; $(RM) $(CLEAN) rename.h )
-
-# clean, and then remove compiled programs and library archives
-purge:
-	( cd Lib    ; $(MAKE) purge )
-	( cd Demo   ; $(MAKE) purge )
-	( cd Doc    ; $(MAKE) purge )
-	( cd Tcov   ; $(MAKE) purge )
-	( cd MATLAB ; $(RM) $(CLEAN) rename.h *.mex* )
-
-# create PDF documents for the original distribution
-docs:
-	( cd Doc    ; $(MAKE) )
-
-# get ready for distribution
-dist: purge
-	( cd Demo   ; $(MAKE) dist )
-	( cd Doc    ; $(MAKE) )
-
-distclean: purge
-
-ccode: library
-
-lib: library
-
-# statement coverage (requires Linux; takes a lot of time and disk space)
-cov: purge
-	( cd Tcov ; ./DO.all )
-
-# install UMFPACK
-install:
-	$(CP) Lib/libumfpack.a $(INSTALL_LIB)/libumfpack.$(VERSION).a
-	( cd $(INSTALL_LIB) ; ln -sf libumfpack.$(VERSION).a libumfpack.a )
-	$(CP) Include/*.h $(INSTALL_INCLUDE)
-	chmod 644 $(INSTALL_LIB)/libumfpack*.a
-	chmod 644 $(INSTALL_INCLUDE)/umfpack*.h
-
-# uninstall UMFPACK
-uninstall:
-	$(RM) $(INSTALL_LIB)/libumfpack*.a
-	$(RM) $(INSTALL_INCLUDE)/umfpack*.h
-
diff --git a/src/C/SuiteSparse/UMFPACK/README.txt b/src/C/SuiteSparse/UMFPACK/README.txt
deleted file mode 100644
index 4cdd79e..0000000
--- a/src/C/SuiteSparse/UMFPACK/README.txt
+++ /dev/null
@@ -1,411 +0,0 @@
-UMFPACK, Copyright (c) 1995-2013 by Timothy A. Davis,
-http://www.suitesparse.com
-
-UMFPACK :  a set of routines solving sparse linear systems via LU
-    factorization.  Requires three other packages:  the BLAS (dense matrix
-    operations), AMD (sparse matrix minimum degree ordering), and
-    SuiteSparse_config.
-
-    Includes a C-callable and MATLAB interface, and a basic FORTRAN 77
-    interface to a subset of the C-callable routines.  Requires AMD Version
-    2.0 or later.
-
-    Unless you compile with -DNCHOLMOD, addtional packages are required:
-    CHOLMOD, CAMD, CCOLAMD, COLAMD, and metis-4.0.
-
-The AMD, SuiteSparse_config, and UMFPACK directories must all reside in the
-same parent directory.  If the -DNCHOLMOD is not used, the CHOLMOD, CAMD,
-CCOLAMD, COLAMD, and metis-4.0 also also exist in the same parent.
-
-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 the
-    SuiteSparse_config/SuiteSparse_config.mk file (otherwise, you may get
-    warnings that the BLAS (dgemm, etc) are not found).  You may use
-    UMFPACK_CONFIG = -DNBLAS in the SuiteSparse_config/SuiteSparse_config.mk
-    file, to avoid using the BLAS, but UMFPACK will be slow.  Next, cd to this
-    directory (UMFPACK) and type "make".  To compile and run a FORTRAN 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 ../SuiteSparse_config/SuiteSparse_config.mk for
-    more details (including options for compiling in 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.
-
---------------------------------------------------------------------------------
-
-UMFPACK is available under alternate licences; contact T. Davis for details.
-
-UMFPACK License:
-
-    Your use or distribution of UMFPACK or any modified version of
-    UMFPACK 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 General Public
-    License as published by the Free Software Foundation; either
-    version 2 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
-    General Public License for more details.
-
-    You should have received a copy of the GNU General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
-    USA
-
-    Permission is hereby granted to use or copy this program under the
-    terms of the GNU GPL, 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
-
-    UMFPACK (including versions 2.2.1 and earlier, in FORTRAN) is available at
-    http://www.suitesparse.com.  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.suitesparse.com.  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.5 cannot use AMD v1.1 or earlier.  UMFPACK 5.x
-requires AMD v2.0 or later.
-
---------------------------------------------------------------------------------
-
-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 2.0.
-
-Authors:
-
-    Timothy A. Davis (DrTimothyAldenDavis at gmail.com)
-
-    Includes a modified version of COLAMD V2.0, by Stefan I. Larimore and
-    Timothy A. Davis.  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.suitesparse.com, 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
-    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)
-
-    ----------------------------------------------------------------------------
-    Source directory:
-    ----------------------------------------------------------------------------
-
-    cholmod_blas.h		an exact copy of CHOLMOD/Include/cholmod_blas.h
-
-    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_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_cholmod.[ch]		interface to CHOLMOD
-    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
-    umfpack_dl_demo.out		umfpack_dl_demo output
-    umfpack_zi_demo.out		umfpack_zi_demo output
-    umfpack_zl_demo.out		umfpack_zl_demo output
-
-    umf4.c			a demo (real/int) for Harwell/Boeing matrices
-    umf4.out			output of "make hb"
-    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 UFget
-    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
-    ----------------------------------------------------------------------------
-
-    GNUmakefile			a nice Makefile, for GNU make
-    Makefile			an ugly Unix Makefile (for older make's)
-    libumfpack.def		UMPFACK definitions for Windows
diff --git a/src/C/SuiteSparse/UMFPACK/Source/cholmod_blas.h b/src/C/SuiteSparse/UMFPACK/Source/cholmod_blas.h
deleted file mode 100644
index 2cc47e3..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/cholmod_blas.h
+++ /dev/null
@@ -1,447 +0,0 @@
-/* ========================================================================== */
-/* === Include/cholmod_blas.h =============================================== */
-/* ========================================================================== */
-
-/* This does not need to be included in the user's program. */
-
-#ifndef CHOLMOD_BLAS_H
-#define CHOLMOD_BLAS_H
-
-/* ========================================================================== */
-/* === Architecture ========================================================= */
-/* ========================================================================== */
-
-#if defined (__sun) || defined (MSOL2) || defined (ARCH_SOL2)
-#define CHOLMOD_SOL2
-#define CHOLMOD_ARCHITECTURE "Sun Solaris"
-
-#elif defined (__sgi) || defined (MSGI) || defined (ARCH_SGI)
-#define CHOLMOD_SGI
-#define CHOLMOD_ARCHITECTURE "SGI Irix"
-
-#elif defined (__linux) || defined (MGLNX86) || defined (ARCH_GLNX86)
-#define CHOLMOD_LINUX
-#define CHOLMOD_ARCHITECTURE "Linux"
-
-#elif defined (__APPLE__)
-#define CHOLMOD_MAC
-#define CHOLMOD_ARCHITECTURE "Mac"
-
-#elif defined (_AIX) || defined (MIBM_RS) || defined (ARCH_IBM_RS)
-#define CHOLMOD_AIX
-#define CHOLMOD_ARCHITECTURE "IBM AIX"
-/* recent reports from IBM AIX seem to indicate that this is not needed: */
-/* #define BLAS_NO_UNDERSCORE */
-
-#elif defined (__alpha) || defined (MALPHA) || defined (ARCH_ALPHA)
-#define CHOLMOD_ALPHA
-#define CHOLMOD_ARCHITECTURE "Compaq Alpha"
-
-#elif defined (_WIN32) || defined (WIN32) || defined (_WIN64) || defined (WIN64)
-#if defined (__MINGW32__) || defined (__MINGW32__)
-#define CHOLMOD_MINGW
-#elif defined (__CYGWIN32__) || defined (__CYGWIN32__)
-#define CHOLMOD_CYGWIN
-#else
-#define CHOLMOD_WINDOWS
-#define BLAS_NO_UNDERSCORE
-#endif
-#define CHOLMOD_ARCHITECTURE "Microsoft Windows"
-
-#elif defined (__hppa) || defined (__hpux) || defined (MHPUX) || defined (ARCH_HPUX)
-#define CHOLMOD_HP
-#define CHOLMOD_ARCHITECTURE "HP Unix"
-#define BLAS_NO_UNDERSCORE
-
-#elif defined (__hp700) || defined (MHP700) || defined (ARCH_HP700)
-#define CHOLMOD_HP
-#define CHOLMOD_ARCHITECTURE "HP 700 Unix"
-#define BLAS_NO_UNDERSCORE
-
-#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 CHOLMOD_ARCHITECTURE "unknown"
-#endif
-
-/* ========================================================================== */
-/* === BLAS and LAPACK names ================================================ */
-/* ========================================================================== */
-
-/* Prototypes for the various versions of the BLAS.  */
-
-/* Determine if the 64-bit Sun Performance BLAS is to be used */
-#if defined(CHOLMOD_SOL2) && !defined(NSUNPERF) && defined(BLAS64)
-#define SUN64
-#endif
-
-#ifdef SUN64
-
-#define BLAS_DTRSV dtrsv_64_
-#define BLAS_DGEMV dgemv_64_
-#define BLAS_DTRSM dtrsm_64_
-#define BLAS_DGEMM dgemm_64_
-#define BLAS_DSYRK dsyrk_64_
-#define BLAS_DGER  dger_64_
-#define BLAS_DSCAL dscal_64_
-#define LAPACK_DPOTRF dpotrf_64_
-
-#define BLAS_ZTRSV ztrsv_64_
-#define BLAS_ZGEMV zgemv_64_
-#define BLAS_ZTRSM ztrsm_64_
-#define BLAS_ZGEMM zgemm_64_
-#define BLAS_ZHERK zherk_64_
-#define BLAS_ZGER  zgeru_64_
-#define BLAS_ZSCAL zscal_64_
-#define LAPACK_ZPOTRF zpotrf_64_
-
-#elif defined (BLAS_NO_UNDERSCORE)
-
-#define BLAS_DTRSV dtrsv
-#define BLAS_DGEMV dgemv
-#define BLAS_DTRSM dtrsm
-#define BLAS_DGEMM dgemm
-#define BLAS_DSYRK dsyrk
-#define BLAS_DGER  dger
-#define BLAS_DSCAL dscal
-#define LAPACK_DPOTRF dpotrf
-
-#define BLAS_ZTRSV ztrsv
-#define BLAS_ZGEMV zgemv
-#define BLAS_ZTRSM ztrsm
-#define BLAS_ZGEMM zgemm
-#define BLAS_ZHERK zherk
-#define BLAS_ZGER  zgeru
-#define BLAS_ZSCAL zscal
-#define LAPACK_ZPOTRF zpotrf
-
-#else
-
-#define BLAS_DTRSV dtrsv_
-#define BLAS_DGEMV dgemv_
-#define BLAS_DTRSM dtrsm_
-#define BLAS_DGEMM dgemm_
-#define BLAS_DSYRK dsyrk_
-#define BLAS_DGER  dger_
-#define BLAS_DSCAL dscal_
-#define LAPACK_DPOTRF dpotrf_
-
-#define BLAS_ZTRSV ztrsv_
-#define BLAS_ZGEMV zgemv_
-#define BLAS_ZTRSM ztrsm_
-#define BLAS_ZGEMM zgemm_
-#define BLAS_ZHERK zherk_
-#define BLAS_ZGER  zgeru_
-#define BLAS_ZSCAL zscal_
-#define LAPACK_ZPOTRF zpotrf_
-
-#endif
-
-/* ========================================================================== */
-/* === BLAS and LAPACK integer arguments ==================================== */
-/* ========================================================================== */
-
-/* Compile CHOLMOD, UMFPACK, and SPQR with -DBLAS64 if you have a BLAS that
- * uses 64-bit integers */
-
-#if defined (LONGBLAS) || defined (BLAS64)
-#define BLAS_INT SuiteSparse_long
-#else
-#define BLAS_INT int
-#endif
-
-/* If the BLAS integer is smaller than the basic CHOLMOD integer, then we need
- * to check for integer overflow when converting from Int to BLAS_INT.  If
- * any integer overflows, the externally-defined BLAS_OK variable is
- * set to FALSE.  BLAS_OK should be set to TRUE before calling any
- * BLAS_* macro.
- */
-
-#define CHECK_BLAS_INT (sizeof (BLAS_INT) < sizeof (Int))
-#define EQ(K,k) (((BLAS_INT) K) == ((Int) k))
-
-/* ========================================================================== */
-/* === BLAS and LAPACK prototypes and macros ================================ */
-/* ========================================================================== */
-
-void BLAS_DGEMV (char *trans, BLAS_INT *m, BLAS_INT *n, double *alpha,
-	double *A, BLAS_INT *lda, double *X, BLAS_INT *incx, double *beta,
-	double *Y, BLAS_INT *incy) ;
-
-#define BLAS_dgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, INCX = incx, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-        EQ (INCX,incx) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DGEMV (trans, &M, &N, alpha, A, &LDA, X, &INCX, beta, Y, &INCY) ; \
-    } \
-}
-
-void BLAS_ZGEMV (char *trans, BLAS_INT *m, BLAS_INT *n, double *alpha,
-	double *A, BLAS_INT *lda, double *X, BLAS_INT *incx, double *beta,
-	double *Y, BLAS_INT *incy) ;
-
-#define BLAS_zgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, INCX = incx, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-        EQ (INCX,incx) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZGEMV (trans, &M, &N, alpha, A, &LDA, X, &INCX, beta, Y, &INCY) ; \
-    } \
-}
-
-void BLAS_DTRSV (char *uplo, char *trans, char *diag, BLAS_INT *n, double *A,
-	BLAS_INT *lda, double *X, BLAS_INT *incx) ;
-
-#define BLAS_dtrsv(uplo,trans,diag,n,A,lda,X,incx) \
-{ \
-    BLAS_INT N = n, LDA = lda, INCX = incx ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (LDA,lda) && EQ (INCX,incx))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DTRSV (uplo, trans, diag, &N, A, &LDA, X, &INCX) ; \
-    } \
-}
-
-void BLAS_ZTRSV (char *uplo, char *trans, char *diag, BLAS_INT *n, double *A,
-	BLAS_INT *lda, double *X, BLAS_INT *incx) ;
-
-#define BLAS_ztrsv(uplo,trans,diag,n,A,lda,X,incx) \
-{ \
-    BLAS_INT N = n, LDA = lda, INCX = incx ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (LDA,lda) && EQ (INCX,incx))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZTRSV (uplo, trans, diag, &N, A, &LDA, X, &INCX) ; \
-    } \
-}
-
-void BLAS_DTRSM (char *side, char *uplo, char *transa, char *diag, BLAS_INT *m,
-	BLAS_INT *n, double *alpha, double *A, BLAS_INT *lda, double *B,
-	BLAS_INT *ldb) ;
-
-#define BLAS_dtrsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, LDB = ldb ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-        EQ (LDB,ldb))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DTRSM (side, uplo, transa, diag, &M, &N, alpha, A, &LDA, B, &LDB);\
-    } \
-}
-
-void BLAS_ZTRSM (char *side, char *uplo, char *transa, char *diag, BLAS_INT *m,
-	BLAS_INT *n, double *alpha, double *A, BLAS_INT *lda, double *B,
-	BLAS_INT *ldb) ;
-
-#define BLAS_ztrsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, LDB = ldb ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-        EQ (LDB,ldb))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZTRSM (side, uplo, transa, diag, &M, &N, alpha, A, &LDA, B, &LDB);\
-    } \
-}
-
-void BLAS_DGEMM (char *transa, char *transb, BLAS_INT *m, BLAS_INT *n,
-	BLAS_INT *k, double *alpha, double *A, BLAS_INT *lda, double *B,
-	BLAS_INT *ldb, double *beta, double *C, BLAS_INT *ldc) ;
-
-#define BLAS_dgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc) \
-{ \
-    BLAS_INT M = m, N = n, K = k, LDA = lda, LDB = ldb, LDC = ldc ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (K,k) && \
-        EQ (LDA,lda) && EQ (LDB,ldb) && EQ (LDC,ldc))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DGEMM (transa, transb, &M, &N, &K, alpha, A, &LDA, B, &LDB, beta, \
-	    C, &LDC) ; \
-    } \
-}
-
-void BLAS_ZGEMM (char *transa, char *transb, BLAS_INT *m, BLAS_INT *n,
-	BLAS_INT *k, double *alpha, double *A, BLAS_INT *lda, double *B,
-	BLAS_INT *ldb, double *beta, double *C, BLAS_INT *ldc) ;
-
-#define BLAS_zgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta,C,ldc) \
-{ \
-    BLAS_INT M = m, N = n, K = k, LDA = lda, LDB = ldb, LDC = ldc ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (K,k) && \
-        EQ (LDA,lda) && EQ (LDB,ldb) && EQ (LDC,ldc))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZGEMM (transa, transb, &M, &N, &K, alpha, A, &LDA, B, &LDB, beta, \
-	    C, &LDC) ; \
-    } \
-}
-
-void BLAS_DSYRK (char *uplo, char *trans, BLAS_INT *n, BLAS_INT *k,
-	double *alpha, double *A, BLAS_INT *lda, double *beta, double *C,
-	BLAS_INT *ldc) ;
-
-#define BLAS_dsyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc) \
-{ \
-    BLAS_INT N = n, K = k, LDA = lda, LDC = ldc ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (K,k) && EQ (LDA,lda) && \
-        EQ (LDC,ldc))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DSYRK (uplo, trans, &N, &K, alpha, A, &LDA, beta, C, &LDC) ; \
-    } \
-} \
-
-void BLAS_ZHERK (char *uplo, char *trans, BLAS_INT *n, BLAS_INT *k,
-	double *alpha, double *A, BLAS_INT *lda, double *beta, double *C,
-	BLAS_INT *ldc) ;
-
-#define BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc) \
-{ \
-    BLAS_INT N = n, K = k, LDA = lda, LDC = ldc ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (K,k) && EQ (LDA,lda) && \
-        EQ (LDC,ldc))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZHERK (uplo, trans, &N, &K, alpha, A, &LDA, beta, C, &LDC) ; \
-    } \
-} \
-
-void LAPACK_DPOTRF (char *uplo, BLAS_INT *n, double *A, BLAS_INT *lda,
-	BLAS_INT *info) ;
-
-#define LAPACK_dpotrf(uplo,n,A,lda,info) \
-{ \
-    BLAS_INT N = n, LDA = lda, INFO = 1 ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (LDA,lda))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	LAPACK_DPOTRF (uplo, &N, A, &LDA, &INFO) ; \
-    } \
-    info = INFO ; \
-}
-
-void LAPACK_ZPOTRF (char *uplo, BLAS_INT *n, double *A, BLAS_INT *lda,
-	BLAS_INT *info) ;
-
-#define LAPACK_zpotrf(uplo,n,A,lda,info) \
-{ \
-    BLAS_INT N = n, LDA = lda, INFO = 1 ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (LDA,lda))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	LAPACK_ZPOTRF (uplo, &N, A, &LDA, &INFO) ; \
-    } \
-    info = INFO ; \
-}
-
-/* ========================================================================== */
-
-void BLAS_DSCAL (BLAS_INT *n, double *alpha, double *Y, BLAS_INT *incy) ;
-
-#define BLAS_dscal(n,alpha,Y,incy) \
-{ \
-    BLAS_INT N = n, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DSCAL (&N, alpha, Y, &INCY) ; \
-    } \
-}
-
-void BLAS_ZSCAL (BLAS_INT *n, double *alpha, double *Y, BLAS_INT *incy) ;
-
-#define BLAS_zscal(n,alpha,Y,incy) \
-{ \
-    BLAS_INT N = n, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (N,n) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZSCAL (&N, alpha, Y, &INCY) ; \
-    } \
-}
-
-void BLAS_DGER (BLAS_INT *m, BLAS_INT *n, double *alpha,
-	double *X, BLAS_INT *incx, double *Y, BLAS_INT *incy,
-	double *A, BLAS_INT *lda) ;
-
-#define BLAS_dger(m,n,alpha,X,incx,Y,incy,A,lda) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, INCX = incx, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-          EQ (INCX,incx) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_DGER (&M, &N, alpha, X, &INCX, Y, &INCY, A, &LDA) ; \
-    } \
-}
-
-void BLAS_ZGER (BLAS_INT *m, BLAS_INT *n, double *alpha,
-	double *X, BLAS_INT *incx, double *Y, BLAS_INT *incy,
-	double *A, BLAS_INT *lda) ;
-
-#define BLAS_zgeru(m,n,alpha,X,incx,Y,incy,A,lda) \
-{ \
-    BLAS_INT M = m, N = n, LDA = lda, INCX = incx, INCY = incy ; \
-    if (CHECK_BLAS_INT && !(EQ (M,m) && EQ (N,n) && EQ (LDA,lda) && \
-          EQ (INCX,incx) && EQ (INCY,incy))) \
-    { \
-	BLAS_OK = FALSE ; \
-    } \
-    if (!CHECK_BLAS_INT || BLAS_OK) \
-    { \
-	BLAS_ZGER (&M, &N, alpha, X, &INCX, Y, &INCY, A, &LDA) ; \
-    } \
-}
-
-#endif
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_analyze.c b/src/C/SuiteSparse/UMFPACK/Source/umf_analyze.c
deleted file mode 100644
index 7af0b4a..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_analyze.c
+++ /dev/null
@@ -1,704 +0,0 @@
-/* ========================================================================== */
-/* === UMF_analyze ========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 nonzero column.
-    The matrix is assumed to be valid.
-
-    Empty rows and columns have already been removed.
-
-*/
-
-#include "umf_internal.h"
-#include "umf_analyze.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 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 of j */
-	/* (or are empty) */
-
-	/* row knext has first column 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_analyze.h b/src/C/SuiteSparse/UMFPACK/Source/umf_analyze.h
deleted file mode 100644
index ed05574..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_analyze.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_apply_order.c b/src/C/SuiteSparse/UMFPACK/Source/umf_apply_order.c
deleted file mode 100644
index a438655..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_apply_order.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* ========================================================================== */
-/* === UMF_apply_order ====================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    Apply post-ordering of supernodal elimination tree.
-*/
-
-#include "umf_internal.h"
-#include "umf_apply_order.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_apply_order.h b/src/C/SuiteSparse/UMFPACK/Source/umf_apply_order.h
deleted file mode 100644
index 59e050a..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_apply_order.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_apply_order
-(
-    Int Front [ ],
-    const Int Order [ ],
-    Int Temp [ ],
-    Int n_col,
-    Int nfr
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_assemble.c b/src/C/SuiteSparse/UMFPACK/Source/umf_assemble.c
deleted file mode 100644
index 5ec6eb6..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_assemble.c
+++ /dev/null
@@ -1,1215 +0,0 @@
-/* ========================================================================== */
-/* === UMF_assemble ========================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*  Degree update and numerical assembly.  This is compiled twice (with and
- *  without FIXQ) for each real/complex int/SuiteSparse_long version, for a
- *  total of 8 versions.*/
-
-#include "umf_internal.h"
-#include "umf_assemble.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_assemble.h b/src/C/SuiteSparse/UMFPACK/Source/umf_assemble.h
deleted file mode 100644
index d5faa4b..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_assemble.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_assemble
-(
-    NumericType *Numeric,
-    WorkType *Work
-) ;
-
-GLOBAL void UMF_assemble_fixq
-(
-    NumericType *Numeric,
-    WorkType *Work
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_blas3_update.c b/src/C/SuiteSparse/UMFPACK/Source/umf_blas3_update.c
deleted file mode 100644
index fa206dc..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_blas3_update.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/* ========================================================================== */
-/* === UMF_blas3_update ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-#include "umf_internal.h"
-#include "umf_blas3_update.h"
-
-GLOBAL void UMF_blas3_update
-(
-    WorkType *Work
-)
-{
-    /* ---------------------------------------------------------------------- */
-    /* local variables */
-    /* ---------------------------------------------------------------------- */
-
-    Entry *L, *U, *C, *LU ;
-    Int i, j, s, k, m, n, d, nb, dc ;
-    
-#ifndef NBLAS
-    Int blas_ok = TRUE ;
-#else
-#define blas_ok FALSE
-#endif
-
-    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)
-    {
-
-#ifndef NBLAS
-	BLAS_GER (m, n, L, U, C, d) ;
-#endif
-
-	if (!blas_ok)
-	{
-	    /* 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
-    {
-
-	/* triangular solve to update the U block */
-
-#ifndef NBLAS
-	BLAS_TRSM_RIGHT (n, k, LU, nb, U, dc) ;
-#endif
-
-	if (!blas_ok)
-	{
-	    /* use plain C code if no BLAS at compile time, or if integer
-	     * overflow has occurred */
-	    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) */
-
-#ifndef NBLAS
-	BLAS_GEMM (m, n, k, L, U, dc, C, d) ;
-#endif
-
-	if (!blas_ok)
-	{
-	    /* use plain C code if no BLAS at compile time, or if integer
-	     * overflow has occurred */
-
-	    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++ ;
-			}
-		    }
-		}
-	    }
-	}
-    }
-
-#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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_blas3_update.h b/src/C/SuiteSparse/UMFPACK/Source/umf_blas3_update.h
deleted file mode 100644
index f7c29f5..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_blas3_update.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_blas3_update
-(
-    WorkType *Work
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_build_tuples.c b/src/C/SuiteSparse/UMFPACK/Source/umf_build_tuples.c
deleted file mode 100644
index 7b243dd..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_build_tuples.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* ========================================================================== */
-/* === UMF_build_tuples ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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_build_tuples.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_build_tuples.h b/src/C/SuiteSparse/UMFPACK/Source/umf_build_tuples.h
deleted file mode 100644
index c0251cf..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_build_tuples.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_build_tuples
-(
-    NumericType *Numeric,
-    WorkType *Work
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_cholmod.c b/src/C/SuiteSparse/UMFPACK/Source/umf_cholmod.c
deleted file mode 100644
index 96481b8..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_cholmod.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/* ========================================================================== */
-/* === umf_cholmod ========================================================== */
-/* ========================================================================== */
-
-/* umfpack_cholmod: user-defined ordering function to interface UMFPACK
- * to CHOLMOD.
- *
- * This routine is an example of a user-provided ordering function for UMFPACK.
- *
- * This function can be passed to umfpack_*_fsymbolic as the
- * user_ordering function pointer.
- */
-
-#include "umf_internal.h"
-#include "umf_cholmod.h"
-
-#ifndef NCHOLMOD
-#include "cholmod.h"
-#endif
-
-#if defined (DINT) || defined (ZINT)
-#define CHOLMOD_start       cholmod_start
-#define CHOLMOD_transpose   cholmod_transpose
-#define CHOLMOD_analyze     cholmod_analyze
-#define CHOLMOD_free_sparse cholmod_free_sparse
-#define CHOLMOD_free_factor cholmod_free_factor
-#define CHOLMOD_finish      cholmod_finish
-#define CHOLMOD_print_common      cholmod_print_common
-#else
-#define CHOLMOD_start       cholmod_l_start
-#define CHOLMOD_transpose   cholmod_l_transpose
-#define CHOLMOD_analyze     cholmod_l_analyze
-#define CHOLMOD_free_sparse cholmod_l_free_sparse
-#define CHOLMOD_free_factor cholmod_l_free_factor
-#define CHOLMOD_finish      cholmod_l_finish
-#define CHOLMOD_print_common      cholmod_l_print_common
-#endif
-
-int UMF_cholmod
-(
-    /* inputs */
-    Int nrow,               /* A is nrow-by-ncol */
-    Int ncol,               /* A is nrow-by-ncol */
-    Int symmetric,          /* if true and nrow=ncol do A+A', else do A'A */
-    Int Ap [ ],             /* column pointers, size ncol+1 */
-    Int Ai [ ],             /* row indices, size nz = Ap [ncol] */
-    /* output */
-    Int Perm [ ],           /* fill-reducing permutation, size ncol */
-    /* user-defined */
-    void *user_params,      /* Int array of size 3 */
-    double user_info [3]    /* [0]: max col count for L=chol(P(A+A')P')
-                               [1]: nnz (L)
-                               [2]: flop count for chol, if A real */
-)
-{
-#ifndef NCHOLMOD
-    double dmax, flops, c, lnz ;
-    cholmod_sparse Amatrix, *A, *AT, *S ;
-    cholmod_factor *L ;
-    cholmod_common cm ;
-    Int *P, *ColCount ;
-    Int k, ordering_option, print_level, *params ;
-
-    params = (Int *) user_params ;
-    ordering_option = params [0] ;
-    print_level = params [1] - 1 ;
-    params [2] = -1 ;
-
-    if (Ap == NULL || Ai == NULL || Perm == NULL || nrow < 0 || ncol < 0)
-    {
-        /* invalid inputs */
-        return (FALSE) ;
-    }
-    if (nrow != ncol)
-    {
-        /* force symmetric to be false */
-        symmetric = FALSE ;
-    }
-
-    /* start CHOLMOD */
-    CHOLMOD_start (&cm) ;
-    cm.supernodal = CHOLMOD_SIMPLICIAL ;
-    cm.print = print_level ;
-
-    /* adjust cm based on ordering_option */
-    switch (ordering_option)
-    {
-
-        default:
-        case UMFPACK_ORDERING_AMD:
-            /* AMD on A+A' if symmetric, COLAMD on A otherwise */
-            cm.nmethods = 1 ;
-            cm.method [0].ordering = symmetric ? CHOLMOD_AMD : CHOLMOD_COLAMD ;
-            cm.postorder = TRUE ;
-            break ;
-
-        case UMFPACK_ORDERING_METIS:
-            /* metis on A+A' if symmetric, A'A otherwise */
-            cm.nmethods = 1 ;
-            cm.method [0].ordering = CHOLMOD_METIS ;
-            cm.postorder = TRUE ;
-            break ;
-
-        case UMFPACK_ORDERING_NONE:
-        case UMFPACK_ORDERING_GIVEN:
-        case UMFPACK_ORDERING_USER:
-            /* no ordering.  No input permutation here, and no user
-               function, so all these are the same as "none". */
-            cm.nmethods = 1 ;
-            cm.method [0].ordering = CHOLMOD_NATURAL ;
-            cm.postorder = FALSE ;
-            break ;
-
-        case UMFPACK_ORDERING_BEST:
-            /* try AMD, METIS and NESDIS on A+A', or COLAMD(A), METIS(A'A),
-               and NESDIS (A'A) */
-            cm.nmethods = 3 ;
-            cm.method [0].ordering = symmetric ? CHOLMOD_AMD : CHOLMOD_COLAMD ;
-            cm.method [1].ordering = CHOLMOD_METIS ;
-            cm.method [2].ordering = CHOLMOD_NESDIS ;
-            cm.postorder = TRUE ;
-            break ;
-
-        case UMFPACK_ORDERING_CHOLMOD:
-            /* no change to CHOLMOD defaults:
-            Do not use given permutation, since it's not provided.
-            Try AMD.  If fill-in and flop count are low, use AMD.
-            Otherwise, try METIS and take the best of AMD and METIS.
-            cm.method [0].ordering = CHOLMOD_GIVEN
-            cm.method [1].ordering = CHOLMOD_AMD
-            cm.method [2].ordering = CHOLMOD_METIS
-            cm.nmethods = 2 if METIS installed, 3 otherwise ('given' is skipped)
-            */
-            break ;
-    }
-
-    /* construct a CHOLMOD version of the input matrix A */
-    A = &Amatrix ;
-    A->nrow = nrow ;                /* A is nrow-by-ncol */
-    A->ncol = ncol ;
-    A->nzmax = Ap [ncol] ;          /* with nzmax entries */
-    A->packed = TRUE ;              /* there is no A->nz array */
-    if (symmetric)
-    {
-        A->stype = 1 ;                  /* A is symmetric */
-    }
-    else
-    {
-        A->stype = 0 ;                  /* A is unsymmetric */
-    }
-    A->itype = CHOLMOD_INT ;
-    A->xtype = CHOLMOD_PATTERN ;
-    A->dtype = CHOLMOD_DOUBLE ;
-    A->nz = NULL ;
-    A->p = Ap ;                     /* column pointers */
-    A->i = Ai ;                     /* row indices */
-    A->x = NULL ;                   /* no numerical values */
-    A->z = NULL ;
-    A->sorted = FALSE ;             /* columns of A might not be sorted */
-
-    if (symmetric)
-    {
-        /* CHOLMOD with order the symmetric matrix A */
-        AT = NULL ;
-        S = A ;
-    }
-    else
-    {
-        /* S = A'.  CHOLMOD will order S*S', which is A'*A */
-        AT = CHOLMOD_transpose (A, 0, &cm) ;
-        S = AT ;
-    }
-
-    /* order and analyze S or S*S' */
-    L = CHOLMOD_analyze (S, &cm) ;
-    CHOLMOD_free_sparse (&AT, &cm) ;
-    if (L == NULL)
-    {
-        return (FALSE) ;
-    }
-
-    /* determine the ordering used */
-    switch (L->ordering)
-    {
-
-        case CHOLMOD_AMD:
-        case CHOLMOD_COLAMD:
-            params [2] = UMFPACK_ORDERING_AMD ;
-            break ;
-
-        case CHOLMOD_METIS:
-        case CHOLMOD_NESDIS:
-            params [2] = UMFPACK_ORDERING_METIS ;
-            break ;
-
-        case CHOLMOD_GIVEN:
-        case CHOLMOD_NATURAL:
-        default:
-            params [2] = UMFPACK_ORDERING_NONE ;
-            break ;
-    }
-
-    /* copy the permutation from L to the output and compute statistics */
-    P = L->Perm ;
-    ColCount = L->ColCount ;
-    dmax = 1 ;
-    lnz = 0 ;
-    flops = 0 ;
-    for (k = 0 ; k < ncol ; k++)
-    {
-        Perm [k] = P [k] ;
-        c = ColCount [k] ;
-        if (c > dmax) dmax = c ;
-        lnz += c ;
-        flops += c*c ;
-    }
-    user_info [0] = dmax ;
-    user_info [1] = lnz ;
-    user_info [2] = flops ;
-
-    CHOLMOD_free_factor (&L, &cm) ;
-    if (print_level > 0) 
-    {
-        CHOLMOD_print_common ("for UMFPACK", &cm) ;
-    }
-    CHOLMOD_finish (&cm) ;
-    return (TRUE) ;
-#else
-    /* CHOLMOD and its supporting packages (CAMD, CCOLAMD, COLAMD, metis-4.0)
-      not installed */
-    return (FALSE) ;
-#endif
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_cholmod.h b/src/C/SuiteSparse/UMFPACK/Source/umf_cholmod.h
deleted file mode 100644
index 8879deb..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_cholmod.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "umfpack.h"
-
-int umf_i_cholmod
-(
-    /* inputs */
-    int nrow,               /* A is nrow-by-ncol */
-    int ncol,               /* A is nrow-by-ncol */
-    int symmetric,          /* if true and nrow=ncol do A+A', else do A'A */
-    int Ap [ ],             /* column pointers, size ncol+1 */
-    int Ai [ ],             /* row indices, size nz = Ap [ncol] */
-    /* output */
-    int Perm [ ],           /* fill-reducing permutation, size ncol */
-    /* user-defined */
-    void *ignore,           /* not needed */
-    double user_info [3]    /* [0]: max col count for L=chol(P(A+A')P')
-                               [1]: nnz (L)
-                               [2]: flop count for chol, if A real */
-) ;
-
-
-int umf_l_cholmod
-(
-    /* inputs */
-    SuiteSparse_long nrow,      /* A is nrow-by-ncol */
-    SuiteSparse_long ncol,      /* A is nrow-by-ncol */
-    SuiteSparse_long symmetric, /* if true and nrow=ncol do A+A', else do A'A */
-    SuiteSparse_long Ap [ ],    /* column pointers, size ncol+1 */
-    SuiteSparse_long Ai [ ],    /* row indices, size nz = Ap [ncol] */
-    /* output */
-    SuiteSparse_long Perm [ ],  /* fill-reducing permutation, size ncol */
-    /* user-defined */
-    void *ignore,           /* not needed */
-    double user_info [3]    /* [0]: max col count for L=chol(P(A+A')P')
-                               [1]: nnz (L)
-                               [2]: flop count for chol, if A real */
-) ;
-
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_colamd.c b/src/C/SuiteSparse/UMFPACK/Source/umf_colamd.c
deleted file mode 100644
index 3efd0b1..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_colamd.c
+++ /dev/null
@@ -1,3136 +0,0 @@
-/* ========================================================================== */
-/* === UMF_colamd =========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-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.  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.suitesparse.com.
-
-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,
-	ACM Trans. Math. Softw., vol 3, no 3, 2004
-
-*/
-
-/* ========================================================================== */
-/* === 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 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_colamd.h b/src/C/SuiteSparse/UMFPACK/Source/umf_colamd.h
deleted file mode 100644
index 4eff029..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_colamd.h
+++ /dev/null
@@ -1,254 +0,0 @@
-/* ========================================================================== */
-/* === umf_colamd.h ========================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-
-Authors:
-
-    The authors of the COLAMD code itself are Stefan I. Larimore and Timothy A.
-    Davis.  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.suitesparse.com.
-
-*/
-
-#ifndef COLAMD_H
-#define COLAMD_H
-
-/* ========================================================================== */
-/* === Include files ======================================================== */
-/* ========================================================================== */
-
-#include <stdlib.h>
-
-/* ========================================================================== */
-/* === 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_config.h b/src/C/SuiteSparse/UMFPACK/Source/umf_config.h
deleted file mode 100644
index 0f6c2a3..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_config.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/* ========================================================================== */
-/* === umf_config.h ========================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    This file controls the compile-time configuration of UMFPACK.  Modify the
-    SuiteSparse_config/SuiteSparse_config.mk 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 -DNSUNPERF", for example).  These flags are
-    normally placed in your UMFPACK_CONFIG string, defined in the
-    SuiteSparse_config/SuiteSparse_config.mk file.
-
-    All of these options, except for the timer, are for accessing the BLAS.
-
-	-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.
-
-	-DLONGBLAS
-
-	-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.
-
-    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.  The -DNRECIPROCAL flag is forced on (more accurate,
-	    slightly slower).  The umfpack mexFunction always returns
-	    L*U = P*(R\A)*Q.
-
-	-DMATHWORKS
-
-	    This flag is turned on when compiling umfpack as a built-in routine
-	    in MATLAB.  The -DNRECIPROCAL flag is forced 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 ==================================================== */
-/* ========================================================================== */
-
-#define PRINTF(params) SUITESPARSE_PRINTF(params)
-
-/* ========================================================================== */
-/* === 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 ====================================== */
-/* ========================================================================== */
-
-#if defined (UMF_WINDOWS) || defined (UMF_MINGW)
-/* Windows isn't Unix.  Profound. */
-#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
-
-
-/* ========================================================================== */
-/* === BLAS ================================================================= */
-/* ========================================================================== */
-
-#define BLAS_OK blas_ok
-#include "cholmod_blas.h"
-
-
-/* -------------------------------------------------------------------------- */
-/* DGEMM */
-/* -------------------------------------------------------------------------- */
-
-/* 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 */
-#ifdef COMPLEX
-#define BLAS_GEMM(m,n,k,A,B,ldb,C,ldac) \
-{ \
-    double alpha [2] = {-1,0}, beta [2] = {1,0} ; \
-    BLAS_zgemm ("N", "T", m, n, k, alpha, (double *) A, ldac, \
-	(double *) B, ldb, beta, (double *) C, ldac) ; \
-}
-#else
-#define BLAS_GEMM(m,n,k,A,B,ldb,C,ldac) \
-{ \
-    double alpha = -1, beta = 1 ; \
-    BLAS_dgemm ("N", "T", m, n, k, &alpha, A, ldac, B, ldb, &beta, C, ldac) ; \
-}
-#endif
-
-
-/* -------------------------------------------------------------------------- */
-/* GER */
-/* -------------------------------------------------------------------------- */
-
-/* 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 */
-#ifdef COMPLEX
-#define BLAS_GER(m,n,x,y,A,d) \
-{ \
-    double alpha [2] = {-1,0} ; \
-    BLAS_zgeru (m, n, alpha, (double *) x, 1, (double *) y, 1, \
-	(double *) A, d) ; \
-}
-#else
-#define BLAS_GER(m,n,x,y,A,d) \
-{ \
-    double alpha = -1 ; \
-    BLAS_dger (m, n, &alpha, x, 1, y, 1, A, d) ; \
-}
-#endif
-
-
-/* -------------------------------------------------------------------------- */
-/* GEMV */
-/* -------------------------------------------------------------------------- */
-
-/* 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 */
-#ifdef COMPLEX
-#define BLAS_GEMV(m,n,A,x,y,d) \
-{ \
-    double alpha [2] = {-1,0}, beta [2] = {1,0} ; \
-    BLAS_zgemv ("N", m, n, alpha, (double *) A, d, (double *) x, 1, beta, \
-	(double *) y, 1) ; \
-}
-#else
-#define BLAS_GEMV(m,n,A,x,y,d) \
-{ \
-    double alpha = -1, beta = 1 ; \
-    BLAS_dgemv ("N", m, n, &alpha, A, d, x, 1, &beta, y, 1) ; \
-}
-#endif
-
-
-/* -------------------------------------------------------------------------- */
-/* TRSV */
-/* -------------------------------------------------------------------------- */
-
-/* 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 */
-#ifdef COMPLEX
-#define BLAS_TRSV(m,A,b,d) \
-{ \
-    BLAS_ztrsv ("L", "N", "U", m, (double *) A, d, (double *) b, 1) ; \
-}
-#else
-#define BLAS_TRSV(m,A,b,d) \
-{ \
-    BLAS_dtrsv ("L", "N", "U", m, A, d, b, 1) ; \
-}
-#endif
-
-
-/* -------------------------------------------------------------------------- */
-/* TRSM */
-/* -------------------------------------------------------------------------- */
-
-/* solve XL'=B where:
- * B is m-by-n with leading dimension ldb
- * A is n-by-n with leading dimension lda */
-#ifdef COMPLEX
-#define BLAS_TRSM_RIGHT(m,n,A,lda,B,ldb) \
-{ \
-    double alpha [2] = {1,0} ; \
-    BLAS_ztrsm ("R", "L", "T", "U", m, n, alpha, (double *) A, lda, \
-	(double *) B, ldb) ; \
-}
-#else
-#define BLAS_TRSM_RIGHT(m,n,A,lda,B,ldb) \
-{ \
-    double alpha = 1 ; \
-    BLAS_dtrsm ("R", "L", "T", "U", m, n, &alpha, A, lda, B, ldb) ; \
-}
-#endif
-
-
-/* -------------------------------------------------------------------------- */
-/* SCAL */
-/* -------------------------------------------------------------------------- */
-
-/* x = s*x, where x is a stride-1 vector of length n */
-#ifdef COMPLEX
-#define BLAS_SCAL(n,s,x) \
-{ \
-    double alpha [2] ; \
-    alpha [0] = REAL_COMPONENT (s) ; \
-    alpha [1] = IMAG_COMPONENT (s) ; \
-    BLAS_zscal (n, alpha, (double *) x, 1) ; \
-}
-#else
-#define BLAS_SCAL(n,s,x) \
-{ \
-    double alpha = REAL_COMPONENT (s) ; \
-    BLAS_dscal (n, &alpha, (double *) x, 1) ; \
-}
-#endif
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_create_element.c b/src/C/SuiteSparse/UMFPACK/Source/umf_create_element.c
deleted file mode 100644
index f7a97e0..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_create_element.c
+++ /dev/null
@@ -1,592 +0,0 @@
-/* ========================================================================== */
-/* === UMF_create_element =================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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_create_element.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) ;
-	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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_create_element.h b/src/C/SuiteSparse/UMFPACK/Source/umf_create_element.h
deleted file mode 100644
index 43e84b3..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_create_element.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_create_element
-(
-    NumericType *Numeric,
-    WorkType *Work,
-    SymbolicType *Symbolic
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_dump.c b/src/C/SuiteSparse/UMFPACK/Source/umf_dump.c
deleted file mode 100644
index b79aad0..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_dump.c
+++ /dev/null
@@ -1,1206 +0,0 @@
-/* ========================================================================== */
-/* === UMF_dump ============================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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, rowcol, 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++)
-		    {
-			rowcol = Pattern [j] ;
-			value =
-			    C [ (dumpwhich == 0) ? (f+nrows*j) : (j+nrows*f) ] ;
-			if (rowcol >= 0)
-			{
-			    DEBUG8 (("\t\t"ID":", rowcol)) ;
-			    EDEBUG8 (value) ;
-			    DEBUG8 (("\n")) ;
-			    if (dumpwhich == 0)
-			    {
-				/* col must be in the range 0..n_col-1 */
-				ASSERT (rowcol < n_col) ;
-			    }
-			    else
-			    {
-				/* row must be in the range 0..n_row-1 */
-				ASSERT (rowcol < n_row) ;
-			    }
-
-			    if (nn <= UMF_DBMAX)
-			    {
-				if (UMF_DBscatter [rowcol] != UMF_DBflag)
-				{
-				    UMF_DBpacked [deg++] = rowcol ;
-				    UMF_DBscatter [rowcol] = 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++)
-	    {
-		rowcol = UMF_DBpacked [j] ;
-		DEBUG8 ((ID" ", rowcol)) ;
-		if (j % 20 == 19) DEBUG8 (("\n ")) ;
-		ASSERT (UMF_DBscatter [rowcol] == 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 ((" MATLAB: ")) ;
-#ifdef MATLAB_MEX_FILE
-    DEBUG0 (("mexFunction.\n")) ;
-#else
-#ifdef MATHWORKS
-    DEBUG0 (("yes.\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 (SuiteSparse_long)       %u %u %u\n",
-    sizeof (SuiteSparse_long),
-    sizeof (SuiteSparse_long) / sizeof (SuiteSparse_long),
-    UNITS (SuiteSparse_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 nn
-)
-{
-    Int row, col ;
-    if (Diagonal_map != (Int *) NULL)
-    {
-	DEBUG2 (("\nDump the Diagonal_map: nn "ID"\n", nn)) ;
-	for (col = 0 ; col < nn ; 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_dump.h b/src/C/SuiteSparse/UMFPACK/Source/umf_dump.h
deleted file mode 100644
index 710baaa..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_dump.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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 nn
-) ;
-
-#define UMF_DBMAX 50000
-
-#ifndef EXTERN
-#define EXTERN extern
-#endif
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_extend_front.c b/src/C/SuiteSparse/UMFPACK/Source/umf_extend_front.c
deleted file mode 100644
index 98253e2..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_extend_front.c
+++ /dev/null
@@ -1,392 +0,0 @@
-/* ========================================================================== */
-/* === UMF_extend_front ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* Called by kernel. */
-
-#include "umf_internal.h"
-#include "umf_extend_front.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_extend_front.h b/src/C/SuiteSparse/UMFPACK/Source/umf_extend_front.h
deleted file mode 100644
index 1ee86ca..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_extend_front.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_extend_front
-(
-    NumericType *Numeric,
-    WorkType *Work
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_free.c b/src/C/SuiteSparse/UMFPACK/Source/umf_free.c
deleted file mode 100644
index ff72280..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_free.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* ========================================================================== */
-/* === UMF_free ============================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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"
-#include "umf_free.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)
-    {
-
-	SuiteSparse_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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_free.h b/src/C/SuiteSparse/UMFPACK/Source/umf_free.h
deleted file mode 100644
index 9c156df..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_free.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void *UMF_free
-(
-    void *p
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_fsize.c b/src/C/SuiteSparse/UMFPACK/Source/umf_fsize.c
deleted file mode 100644
index 48c88e8..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_fsize.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* ========================================================================== */
-/* === UMF_fsize ============================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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"
-#include "umf_fsize.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_fsize.h b/src/C/SuiteSparse/UMFPACK/Source/umf_fsize.h
deleted file mode 100644
index 66529d4..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_fsize.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_fsize
-(
-    Int nn,
-    Int MaxFsize [ ],
-    Int Fnrows [ ],
-    Int Fncols [ ],
-    Int Parent [ ],
-    Int Npiv [ ]
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_garbage_collection.c b/src/C/SuiteSparse/UMFPACK/Source/umf_garbage_collection.c
deleted file mode 100644
index c32b766..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_garbage_collection.c
+++ /dev/null
@@ -1,695 +0,0 @@
-/* ========================================================================== */
-/* === UMF_garbage_collection =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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"
-#include "umf_garbage_collection.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_garbage_collection.h b/src/C/SuiteSparse/UMFPACK/Source/umf_garbage_collection.h
deleted file mode 100644
index 3cacae9..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_garbage_collection.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_garbage_collection
-(
-    NumericType *Numeric,
-    WorkType *Work,
-    Int drnew,
-    Int dcnew,
-    Int do_Fcpos
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_get_memory.c b/src/C/SuiteSparse/UMFPACK/Source/umf_get_memory.c
deleted file mode 100644
index 217d327..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_get_memory.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/* ========================================================================== */
-/* === UMF_get_memory ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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_get_memory.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_get_memory.h b/src/C/SuiteSparse/UMFPACK/Source/umf_get_memory.h
deleted file mode 100644
index 98be54e..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_get_memory.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_get_memory
-(
-    NumericType *Numeric,
-    WorkType *Work,
-    Int needunits,
-    Int r2,
-    Int c2,
-    Int do_Fcpos
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_grow_front.c b/src/C/SuiteSparse/UMFPACK/Source/umf_grow_front.c
deleted file mode 100644
index c3e8154..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_grow_front.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/* ========================================================================== */
-/* === UMF_grow_front ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* Current frontal matrix is too small.  Make it bigger. */
-
-#include "umf_internal.h"
-#include "umf_grow_front.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_grow_front.h b/src/C/SuiteSparse/UMFPACK/Source/umf_grow_front.h
deleted file mode 100644
index 02be4fb..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_grow_front.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_grow_front
-(
-    NumericType *Numeric,
-    Int fnr2,
-    Int fnc2,
-    WorkType *Work,
-    Int do_what
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_init_front.c b/src/C/SuiteSparse/UMFPACK/Source/umf_init_front.c
deleted file mode 100644
index 1413b50..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_init_front.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* ========================================================================== */
-/* === UMF_init_front ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-#include "umf_internal.h"
-#include "umf_init_front.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, 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_init_front.h b/src/C/SuiteSparse/UMFPACK/Source/umf_init_front.h
deleted file mode 100644
index 8a613bd..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_init_front.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_init_front
-(
-    NumericType *Numeric,
-    WorkType *Work
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_internal.h b/src/C/SuiteSparse/UMFPACK/Source/umf_internal.h
deleted file mode 100644
index 1facfb6..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_internal.h
+++ /dev/null
@@ -1,729 +0,0 @@
-/* ========================================================================== */
-/* === umf_internal.h ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 <float.h>
-
-/* from string.h: strcmp */
-#include <string.h>
-
-/* 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 (__APPLE__)
-#define UMF_MAC
-#define UMFPACK_ARCHITECTURE "Mac"
-
-#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)
-#if defined (__MINGW32__)
-#define UMF_MINGW
-#elif defined (__CYGWIN32__)
-#define UMF_CYGWIN
-#else
-#define UMF_WINDOWS
-#endif
-#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 */
-#include "amd_internal.h"
-
-/* -------------------------------------------------------------------------- */
-/* MATLAB include files */
-/* -------------------------------------------------------------------------- */
-
-/* only used when compiling the UMFPACK mexFunction */
-#ifdef MATLAB_MEX_FILE
-#include "matrix.h"
-#include "mex.h"
-#endif
-
-/* -------------------------------------------------------------------------- */
-/* Real/complex and int/SuiteSparse_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 */
-/* -------------------------------------------------------------------------- */
-
-    /* see SuiteSparse_config */
-
-/* -------------------------------------------------------------------------- */
-/* 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 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" */
-	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
-
-#ifndef EXTERN
-#define EXTERN extern
-#endif
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_is_permutation.c b/src/C/SuiteSparse/UMFPACK/Source/umf_is_permutation.c
deleted file mode 100644
index 5971c83..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_is_permutation.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* ========================================================================== */
-/* === UMF_is_permutation =================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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"
-#include "umf_is_permutation.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_is_permutation.h b/src/C/SuiteSparse/UMFPACK/Source/umf_is_permutation.h
deleted file mode 100644
index 7bda1d1..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_is_permutation.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_is_permutation
-(
-    const Int P [ ],
-    Int W [ ],
-    Int n,
-    Int r
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel.c b/src/C/SuiteSparse/UMFPACK/Source/umf_kernel.c
deleted file mode 100644
index 2ca0de3..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/* ========================================================================== */
-/* === UMF_kernel =========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel.h b/src/C/SuiteSparse/UMFPACK/Source/umf_kernel.h
deleted file mode 100644
index 68c0778..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_init.c b/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_init.c
deleted file mode 100644
index ef1af77..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_init.c
+++ /dev/null
@@ -1,1065 +0,0 @@
-/* ========================================================================== */
-/* === UMF_kernel_init ====================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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_kernel_init.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) != AMD_OK)
-	{
-	    /* 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) ;
-
-#ifndef NDEBUG
-	for (i = 0 ; i < nn ; i++)
-	{
-	    Diagonal_map [i] = EMPTY ;
-	    Diagonal_imap [i] = EMPTY ;
-	}
-#endif
-
-	for (k = 0 ; k < nn ; k++)
-	{
-	    newrow = Symbolic->Diagonal_map [k] ;
-	    Diagonal_map [k] = newrow ;
-	    Diagonal_imap [newrow] = k ;
-	}
-
-#ifndef NDEBUG
-	for (i = 0 ; i < nn ; i++)
-	{
-	    ASSERT (Diagonal_map [i] != EMPTY) ;
-	    ASSERT (Diagonal_imap [i] != EMPTY) ;
-	}
-#endif
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* 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 lengthy) :: */
-		    DEBUGm4 (("bad U singleton row (too lengthy)\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 lengthy)\n")) ;
-		    return (FALSE) ;	/* pattern changed */
-		}
-		Li   [llen] = newrow ;
-		Lval [llen] = x ;
-		llen++ ;
-	    }
-	}
-
-	if (llen != lilen)
-	{
-	    /* :: pattern change (singleton column too lengthy) :: */
-	    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) ;
-
-	/* 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 lengthy)\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 lengthy)\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, nn) ;
-	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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_init.h b/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_init.h
deleted file mode 100644
index 21f8c30..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_init.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.c b/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.c
deleted file mode 100644
index 3066d26..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.c
+++ /dev/null
@@ -1,466 +0,0 @@
-/* ========================================================================== */
-/* === UMF_kernel_wrapup ==================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* The matrix is factorized.  Finish the LU data structure. */
-
-#include "umf_internal.h"
-#include "umf_kernel_wrapup.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.h b/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.h
deleted file mode 100644
index 923d513..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_kernel_wrapup
-(
-    NumericType *Numeric,
-    SymbolicType *Symbolic,
-    WorkType *Work
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_local_search.c b/src/C/SuiteSparse/UMFPACK/Source/umf_local_search.c
deleted file mode 100644
index 5d79dc8..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_local_search.c
+++ /dev/null
@@ -1,1954 +0,0 @@
-/* ========================================================================== */
-/* === UMF_local_search ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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_local_search.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 NBLAS
-    Int blas_ok = TRUE ;
-#else
-#define blas_ok FALSE
-#endif
-
-#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 */
-
-#ifndef NBLAS
-	    BLAS_TRSV (fnpiv, Flublock, Flu, nb) ;
-#endif
-	    if (!blas_ok)
-	    {
-		/* use plain C code if no BLAS, or on integer overflow */
-		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 ;
-		}
-	    }
-	}
-
-	/* ------------------------------------------------------------------ */
-	/* 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 NBLAS
-	/* 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)
-    {
-	Diagonal_map = Work->Diagonal_map ;
-	Diagonal_imap = Work->Diagonal_imap ;
-	ASSERT (Diagonal_map != (Int *) NULL) ;
-	ASSERT (Diagonal_imap != (Int *) NULL) ;
-
-#ifndef NDEBUG
-	UMF_dump_diagonal_map (Diagonal_map, Diagonal_imap, Symbolic->n_col) ;
-#endif
-
-	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->n_col) ;
-#endif
-    }
-
-    return (UMFPACK_OK) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_local_search.h b/src/C/SuiteSparse/UMFPACK/Source/umf_local_search.h
deleted file mode 100644
index 97aa6fd..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_local_search.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_local_search
-(
-    NumericType *Numeric,
-    WorkType *Work,
-    SymbolicType *Symbolic
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_lsolve.c b/src/C/SuiteSparse/UMFPACK/Source/umf_lsolve.c
deleted file mode 100644
index 3d0f46f..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_lsolve.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* ========================================================================== */
-/* === UMF_lsolve =========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*  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"
-#include "umf_lsolve.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_lsolve.h b/src/C/SuiteSparse/UMFPACK/Source/umf_lsolve.h
deleted file mode 100644
index 8501b13..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_lsolve.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL double UMF_lsolve
-(
-    NumericType *Numeric,
-    Entry X [ ],
-    Int Pattern [ ]
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_ltsolve.c b/src/C/SuiteSparse/UMFPACK/Source/umf_ltsolve.c
deleted file mode 100644
index 793e9b4..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_ltsolve.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/* ========================================================================== */
-/* === UMF_ltsolve ========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*  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"
-#include "umf_ltsolve.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_ltsolve.h b/src/C/SuiteSparse/UMFPACK/Source/umf_ltsolve.h
deleted file mode 100644
index 4787d68..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_ltsolve.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL double UMF_ltsolve
-(
-    NumericType *Numeric,
-    Entry X [ ],
-    Int Pattern [ ]
-) ;
-
-GLOBAL double UMF_lhsolve
-(
-    NumericType *Numeric,
-    Entry X [ ],
-    Int Pattern [ ]
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_malloc.c b/src/C/SuiteSparse/UMFPACK/Source/umf_malloc.c
deleted file mode 100644
index c597435..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_malloc.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* ========================================================================== */
-/* === UMF_malloc =========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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"
-#include "umf_malloc.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: ")) ;
-
-    p = SuiteSparse_malloc (n_objects, size_of_object) ;
-
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_malloc.h b/src/C/SuiteSparse/UMFPACK/Source/umf_malloc.h
deleted file mode 100644
index 7ebf243..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_malloc.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-#ifndef _UMF_MALLOC
-#define _UMF_MALLOC
-
-#if defined (UMF_MALLOC_COUNT) || !defined (NDEBUG)
-
-#ifndef EXTERN
-#define EXTERN extern
-#endif
-
-GLOBAL EXTERN Int UMF_malloc_count ;
-#endif
-
-GLOBAL void *UMF_malloc
-(
-    Int n_objects,
-    size_t size_of_object
-) ;
-
-#endif
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.c b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.c
deleted file mode 100644
index 633b371..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* ========================================================================== */
-/* === UMF_mem_alloc_element ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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_element.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.h b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.h
deleted file mode 100644
index f374f5c..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_mem_alloc_element
-(
-    NumericType *Numeric,
-    Int nrows,
-    Int ncols,
-    Int **Rows,
-    Int **Cols,
-    Entry **C,
-    Int *size,
-    Element **epout
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.c b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.c
deleted file mode 100644
index efbeb79..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ========================================================================== */
-/* === UMF_mem_alloc_head_block ============================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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"
-#include "umf_mem_alloc_head_block.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.h b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.h
deleted file mode 100644
index f2266a3..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_mem_alloc_head_block
-(
-    NumericType *Numeric,
-    Int nunits
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.c b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.c
deleted file mode 100644
index 7041252..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* ========================================================================== */
-/* === UMF_mem_alloc_tail_block ============================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* The UMF_mem_* routines manage the Numeric->Memory memory space. */
-
-#include "umf_internal.h"
-#include "umf_mem_alloc_tail_block.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.h b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.h
deleted file mode 100644
index 7d2e7c6..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_mem_alloc_tail_block
-(
-    NumericType *Numeric,
-    Int nunits
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.c b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.c
deleted file mode 100644
index 26ba206..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* ========================================================================== */
-/* === UMF_mem_free_tail_block ============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* The UMF_mem_* routines manage the Numeric->Memory memory space. */
-
-/* free a block from the tail of Numeric->memory */
-
-#include "umf_internal.h"
-#include "umf_mem_free_tail_block.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.h b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.h
deleted file mode 100644
index 7462cba..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_mem_free_tail_block
-(
-    NumericType *Numeric,
-    Int i
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.c b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.c
deleted file mode 100644
index 01f782f..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* ========================================================================== */
-/* === UMF_mem_init_memoryspace ============================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* The UMF_mem_* routines manage the Numeric->Memory memory space. */
-
-#include "umf_internal.h"
-#include "umf_mem_init_memoryspace.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.h b/src/C/SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.h
deleted file mode 100644
index b0903c5..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_mem_init_memoryspace
-(
-    NumericType *Numeric
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_multicompile.c b/src/C/SuiteSparse/UMFPACK/Source/umf_multicompile.c
deleted file mode 100644
index a075c91..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_multicompile.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* ========================================================================== */
-/* === UMF_multicompile ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_realloc.c b/src/C/SuiteSparse/UMFPACK/Source/umf_realloc.c
deleted file mode 100644
index 607e164..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_realloc.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* ========================================================================== */
-/* === UMF_realloc ========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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"
-#include "umf_realloc.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)) ;
-
-    p2 = SuiteSparse_config.realloc_func (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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_realloc.h b/src/C/SuiteSparse/UMFPACK/Source/umf_realloc.h
deleted file mode 100644
index b40eccf..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_realloc.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void *UMF_realloc
-(
-    void *p,
-    Int n_objects,
-    size_t size_of_object
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_report_perm.c b/src/C/SuiteSparse/UMFPACK/Source/umf_report_perm.c
deleted file mode 100644
index fc6aa76..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_report_perm.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* ========================================================================== */
-/* === UMF_report_perm ====================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-#include "umf_internal.h"
-#include "umf_report_perm.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_report_perm.h b/src/C/SuiteSparse/UMFPACK/Source/umf_report_perm.h
deleted file mode 100644
index a6233f6..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_report_perm.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_report_perm
-(
-    Int n,
-    const Int P [ ],
-    Int W [ ],
-    Int prl,
-    Int user
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_report_vector.c b/src/C/SuiteSparse/UMFPACK/Source/umf_report_vector.c
deleted file mode 100644
index e26daad..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_report_vector.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* ========================================================================== */
-/* === UMF_report_vector ==================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-#include "umf_internal.h"
-#include "umf_report_vector.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_report_vector.h b/src/C/SuiteSparse/UMFPACK/Source/umf_report_vector.h
deleted file mode 100644
index 82211b9..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_report_vector.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_report_vector
-(
-    Int n,
-    const double Xx [ ],
-    const double Xz [ ],
-    Int prl,
-    Int user,
-    Int scalar
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_row_search.c b/src/C/SuiteSparse/UMFPACK/Source/umf_row_search.c
deleted file mode 100644
index 505fe51..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_row_search.c
+++ /dev/null
@@ -1,836 +0,0 @@
-/* ========================================================================== */
-/* === UMF_row_search ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_row_search.h b/src/C/SuiteSparse/UMFPACK/Source/umf_row_search.h
deleted file mode 100644
index c105923..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_row_search.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_scale.c b/src/C/SuiteSparse/UMFPACK/Source/umf_scale.c
deleted file mode 100644
index 6ca8556..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_scale.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/* ========================================================================== */
-/* === UMF_scale ============================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* Divide a vector of stride 1 by the pivot value. */
-
-#include "umf_internal.h"
-#include "umf_scale.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 */
-	/* ------------------------------------------------------------------ */
-
-	/* The pivot is not tiny, and is not NaN.   Don't bother to check for
-	 * zeros in the pivot column, X.  This is slightly more accurate than
-	 * multiplying by 1/pivot (but slightly slower), particularly if the
-	 * pivot column consists of only IEEE subnormals. */
-
-	for (i = 0 ; i < n ; i++)
-	{
-	    /* X [i] /= pivot ; */
-	    x = X [i] ;
-	    DIV (X [i], x, pivot) ;
-	}
-    }
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_scale.h b/src/C/SuiteSparse/UMFPACK/Source/umf_scale.h
deleted file mode 100644
index b030afb..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_scale.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_scale
-(
-    Int n,
-    Entry alpha,
-    Entry X [ ]
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_scale_column.c b/src/C/SuiteSparse/UMFPACK/Source/umf_scale_column.c
deleted file mode 100644
index 74cb476..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_scale_column.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/* ========================================================================== */
-/* === UMF_scale_column ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    Scale the current pivot column, move the pivot row and column into place,
-    and log the permutation.
-*/
-
-#include "umf_internal.h"
-#include "umf_scale_column.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_scale_column.h b/src/C/SuiteSparse/UMFPACK/Source/umf_scale_column.h
deleted file mode 100644
index 25a93a8..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_scale_column.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL void UMF_scale_column
-(
-    NumericType *Numeric,
-    WorkType *Work
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_set_stats.c b/src/C/SuiteSparse/UMFPACK/Source/umf_set_stats.c
deleted file mode 100644
index 8eaf0f9..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_set_stats.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* ========================================================================== */
-/* === UMF_set_stats ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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_set_stats.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_set_stats.h b/src/C/SuiteSparse/UMFPACK/Source/umf_set_stats.h
deleted file mode 100644
index 29e1c00..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_set_stats.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_singletons.c b/src/C/SuiteSparse/UMFPACK/Source/umf_singletons.c
deleted file mode 100644
index 3e2ec1a..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_singletons.c
+++ /dev/null
@@ -1,934 +0,0 @@
-/* ========================================================================== */
-/* === UMF_singletons ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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
- *	. x x x x x x x x
- *	. . x x x x x x x
- *	. . . x . . . . .
- *	. . . x x . . . .
- *	. . . x x s s s s
- *	. . . x x s s s s
- *	. . . x x s s s s
- *	. . . 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, CSparse cs_dmperm,
- * and SuiteSparse/BTF).
- */
-
-#include "umf_internal.h"
-#include "umf_singletons.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 */
-    Int do_singletons,      /* if false, then do not look for singletons */
-
-    /* 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 (!do_singletons)
-    {
-        /* do not look for singletons at all */
-        n1 = 0 ;
-        n1r = 0 ;
-        n1c = 0 ;
-    }
-    else 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 */
-    /* ---------------------------------------------------------------------- */
-
-    /* The prior version of this code (with a "break" statement; UMFPACK 5.2)
-     * causes UMFPACK to fail when optimization is enabled with gcc version
-     * 4.2.4 in a 64-bit Linux environment.  The bug is a compiler bug, not a
-     * an UMFPACK bug.  It is fixed in gcc version 4.3.2.  However, as a
-     * workaround for the compiler, the code below has been "fixed". */
-
-    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 ; /* replaced the break with this test: */ is_sym &&
-            /* the remainder of this test is unchanged from v5.2.0: */
-            s < n_col - nempty_col ; s++)
-	{
-	    if (Cperm [s] != Rperm [s])
-	    {
-		is_sym = FALSE ;
-		/* removed a break statement here, which is OK but it tickles
-                 * the gcc 4.2.{3,4} compiler bug */
-	    }
-	}
-    }
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_singletons.h b/src/C/SuiteSparse/UMFPACK/Source/umf_singletons.h
deleted file mode 100644
index 4093188..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_singletons.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_singletons
-(
-    Int n_row,
-    Int n_col,
-    const Int Ap [ ],
-    const Int Ai [ ],
-    const Int Quser [ ],
-    Int strategy,
-    Int do_singletons,
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_solve.c b/src/C/SuiteSparse/UMFPACK/Source/umf_solve.c
deleted file mode 100644
index 71b8b54..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_solve.c
+++ /dev/null
@@ -1,1395 +0,0 @@
-/* ========================================================================== */
-/* === UMF_solve ============================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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).
-
-    Added on option that allows the complex A and X to be split differently
-    than B, Oct 10, 2005.  Contributed by David Bateman.
-*/
-
-#include "umf_internal.h"
-#include "umf_solve.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 <float.h> */
-    /* 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_solve.h b/src/C/SuiteSparse/UMFPACK/Source/umf_solve.h
deleted file mode 100644
index 9183c15..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_solve.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_start_front.c b/src/C/SuiteSparse/UMFPACK/Source/umf_start_front.c
deleted file mode 100644
index 902e258..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_start_front.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/* ========================================================================== */
-/* === UMF_start_front ====================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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_start_front.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_start_front.h b/src/C/SuiteSparse/UMFPACK/Source/umf_start_front.h
deleted file mode 100644
index f59c8d9..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_start_front.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_start_front
-(
-    Int chain,
-    NumericType *Numeric,
-    WorkType *Work,
-    SymbolicType *Symbolic
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_store_lu.c b/src/C/SuiteSparse/UMFPACK/Source/umf_store_lu.c
deleted file mode 100644
index 7b0f55c..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_store_lu.c
+++ /dev/null
@@ -1,1056 +0,0 @@
-/* ========================================================================== */
-/* === UMF_store_lu ========================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    Store the LU factors.  Called by the kernel.
-    Returns TRUE if successful, FALSE if out of memory.
-*/
-
-#include "umf_internal.h"
-#include "umf_store_lu.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_store_lu.h b/src/C/SuiteSparse/UMFPACK/Source/umf_store_lu.h
deleted file mode 100644
index 4379a11..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_store_lu.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_store_lu
-(
-    NumericType *Numeric,
-    WorkType *Work
-) ;
-
-GLOBAL Int UMF_store_lu_drop
-(
-    NumericType *Numeric,
-    WorkType *Work
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_symbolic_usage.c b/src/C/SuiteSparse/UMFPACK/Source/umf_symbolic_usage.c
deleted file mode 100644
index b16ce92..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_symbolic_usage.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ========================================================================== */
-/* === UMF_symbolic_usage =================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* Returns the final size of the Symbolic object, in Units */
-
-#include "umf_internal.h"
-#include "umf_symbolic_usage.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_symbolic_usage.h b/src/C/SuiteSparse/UMFPACK/Source/umf_symbolic_usage.h
deleted file mode 100644
index 1caeeca..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_symbolic_usage.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL double UMF_symbolic_usage
-(
-    Int n_row,
-    Int n_col,
-    Int nchains,
-    Int nfr,
-    Int esize,
-    Int prefer_diagonal
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_transpose.c b/src/C/SuiteSparse/UMFPACK/Source/umf_transpose.c
deleted file mode 100644
index 262fede..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_transpose.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/* ========================================================================== */
-/* === UMF_transpose ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*  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_transpose.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) != AMD_OK)
-	{
-	    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) == AMD_OK) ;
-#endif
-
-    return (UMFPACK_OK) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_transpose.h b/src/C/SuiteSparse/UMFPACK/Source/umf_transpose.h
deleted file mode 100644
index b6b93ff..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_transpose.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_triplet.c b/src/C/SuiteSparse/UMFPACK/Source/umf_triplet.c
deleted file mode 100644
index 13a43c0..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_triplet.c
+++ /dev/null
@@ -1,428 +0,0 @@
-/* ========================================================================== */
-/* === UMF_triplet ========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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"
-#include "umf_triplet.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_triplet.h b/src/C/SuiteSparse/UMFPACK/Source/umf_triplet.h
deleted file mode 100644
index e1b3b69..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_triplet.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_tuple_lengths.c b/src/C/SuiteSparse/UMFPACK/Source/umf_tuple_lengths.c
deleted file mode 100644
index 61da4af..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_tuple_lengths.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/* ========================================================================== */
-/* === UMF_tuple_lengths ==================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* 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"
-#include "umf_tuple_lengths.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_tuple_lengths.h b/src/C/SuiteSparse/UMFPACK/Source/umf_tuple_lengths.h
deleted file mode 100644
index 038bdd0..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_tuple_lengths.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_tuple_lengths
-(
-    NumericType *Numeric,
-    WorkType *Work,
-    double *dusage
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_usolve.c b/src/C/SuiteSparse/UMFPACK/Source/umf_usolve.c
deleted file mode 100644
index 4ea12ef..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_usolve.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* ========================================================================== */
-/* === UMF_usolve =========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*  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"
-#include "umf_usolve.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_usolve.h b/src/C/SuiteSparse/UMFPACK/Source/umf_usolve.h
deleted file mode 100644
index 55b6142..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_usolve.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL double UMF_usolve
-(
-    NumericType *Numeric,
-    Entry X [ ],
-    Int Pattern [ ]
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_utsolve.c b/src/C/SuiteSparse/UMFPACK/Source/umf_utsolve.c
deleted file mode 100644
index 708a04c..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_utsolve.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/* ========================================================================== */
-/* === UMF_utsolve ========================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*  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"
-#include "umf_utsolve.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_utsolve.h b/src/C/SuiteSparse/UMFPACK/Source/umf_utsolve.h
deleted file mode 100644
index 44f9485..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_utsolve.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL double UMF_utsolve
-(
-    NumericType *Numeric,
-    Entry X [ ],
-    Int Pattern [ ]
-) ;
-
-
-GLOBAL double UMF_uhsolve
-(
-    NumericType *Numeric,
-    Entry X [ ],
-    Int Pattern [ ]
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_valid_numeric.c b/src/C/SuiteSparse/UMFPACK/Source/umf_valid_numeric.c
deleted file mode 100644
index 48c0686..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_valid_numeric.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* ========================================================================== */
-/* === UMF_valid_numeric ==================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* Returns TRUE if the Numeric object is valid, FALSE otherwise. */
-/* Does not check everything.  UMFPACK_report_numeric checks more. */
-
-#include "umf_internal.h"
-#include "umf_valid_numeric.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_valid_numeric.h b/src/C/SuiteSparse/UMFPACK/Source/umf_valid_numeric.h
deleted file mode 100644
index 8ea1da4..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_valid_numeric.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_valid_numeric
-(
-    NumericType *Numeric
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_valid_symbolic.c b/src/C/SuiteSparse/UMFPACK/Source/umf_valid_symbolic.c
deleted file mode 100644
index d396839..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_valid_symbolic.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* ========================================================================== */
-/* === UMF_valid_symbolic =================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-#include "umf_internal.h"
-#include "umf_valid_symbolic.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 --git a/src/C/SuiteSparse/UMFPACK/Source/umf_valid_symbolic.h b/src/C/SuiteSparse/UMFPACK/Source/umf_valid_symbolic.h
deleted file mode 100644
index 299f0fd..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_valid_symbolic.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-GLOBAL Int UMF_valid_symbolic
-(
-    SymbolicType *Symbolic
-) ;
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umf_version.h b/src/C/SuiteSparse/UMFPACK/Source/umf_version.h
deleted file mode 100644
index 186078f..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umf_version.h
+++ /dev/null
@@ -1,879 +0,0 @@
-/* ========================================================================== */
-/* === umf_version.h ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-   Define routine names, depending on version being compiled.
-
-   DINT:	double precision, int's as integers
-   DLONG:	double precision, SuiteSparse_long's as integers
-   ZLONG:	complex double precision, SuiteSparse_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 SuiteSparse_long) 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 <math.h>, 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 (UMF_WINDOWS) && !defined (MATHWORKS)
-
-/* 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 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, using function pointer */
-#define DIV(c,a,b) \
-{ \
-    (void) SuiteSparse_config.divcomplex_func \
-        ((a).Real, (a).Imag, (b).Real, (b).Imag, \
-	&((c).Real), &((c).Imag)) ; \
-}
-
-/* -------------------------------------------------------------------------- */
-
-/* c = a/conjugate(b), using function pointer */
-#define DIV_CONJ(c,a,b) \
-{ \
-    (void) SuiteSparse_config.divcomplex_func \
-        ((a).Real, (a).Imag, (b).Real, (-(b).Imag), \
-	&((c).Real), &((c).Imag)) ; \
-}
-
-/* -------------------------------------------------------------------------- */
-
-/* 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 + a.imag^2) */
-#define ABS(s,a) \
-{ \
-    (s) = SuiteSparse_config.hypot_func ((a).Real, (a).Imag) ; \
-}
-
-/* -------------------------------------------------------------------------- */
-
-/* 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_cholmod		 umf_i_cholmod
-
-#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_fsymbolic	 umfpack_di_fsymbolic
-#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 SuiteSparse_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_cholmod		 umf_l_cholmod
-
-#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_fsymbolic	 umfpack_dl_fsymbolic
-#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_cholmod		 umf_i_cholmod
-
-#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_fsymbolic	 umfpack_zi_fsymbolic
-#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 SuiteSparse_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_cholmod		 umf_l_cholmod
-
-#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_fsymbolic	 umfpack_zl_fsymbolic
-#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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_col_to_triplet.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_col_to_triplet.c
deleted file mode 100644
index 9e157b6..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_col_to_triplet.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_col_to_triplet =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_defaults.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_defaults.c
deleted file mode 100644
index 8b242e8..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_defaults.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_defaults ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 ;
-
-    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_AGGRESSIVE] = UMFPACK_DEFAULT_AGGRESSIVE ;
-    Control [UMFPACK_SINGLETONS] = UMFPACK_DEFAULT_SINGLETONS ;
-    Control [UMFPACK_ORDERING] = UMFPACK_DEFAULT_ORDERING ;
-    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 NBLAS
-    /* 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
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_free_numeric.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_free_numeric.c
deleted file mode 100644
index b8fbe6b..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_free_numeric.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_free_numeric ================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*  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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_free_symbolic.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_free_symbolic.c
deleted file mode 100644
index 529b2a5..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_free_symbolic.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_free_symbolic ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_determinant.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_determinant.c
deleted file mode 100644
index c3ec011..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_determinant.c
+++ /dev/null
@@ -1,308 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_get_determinant ============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/* UMFPACK_get_determinant contributed by David Bateman, Motorola, Paris. */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_lunz.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_lunz.c
deleted file mode 100644
index 407899d..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_lunz.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_get_lunz ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_numeric.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_numeric.c
deleted file mode 100644
index 63faf0b..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_numeric.c
+++ /dev/null
@@ -1,1056 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_get_numeric ================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_symbolic.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_symbolic.c
deleted file mode 100644
index fec93bb..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_get_symbolic.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_get_symbolic ================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_global.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_global.c
deleted file mode 100644
index f57ee36..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_global.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_global ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-    /* moved to SuiteSparse_config */
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_load_numeric.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_load_numeric.c
deleted file mode 100644
index 4451376..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_load_numeric.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_load_numeric ================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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) != (size_t) 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_load_symbolic.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_load_symbolic.c
deleted file mode 100644
index 75b46d4..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_load_symbolic.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_load_symbolic ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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) != (size_t) 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_numeric.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_numeric.c
deleted file mode 100644
index a89bce6..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_numeric.c
+++ /dev/null
@@ -1,792 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_numeric ====================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 or other symmetric ordering */
-    if (/* Symbolic->ordering == UMFPACK_ORDERING_AMD */ alloc_init >= 0
-        && Symbolic->amd_lunz > 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_qsymbolic.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_qsymbolic.c
deleted file mode 100644
index 2063014..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_qsymbolic.c
+++ /dev/null
@@ -1,2752 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_qsymbolic ==================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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_singletons.h"
-#include "umf_cholmod.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 */
-
-} 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
-
-/* ========================================================================== */
-/* === inverse_permutation ================================================== */
-/* ========================================================================== */
-
-/* Check a permutation, and return its inverse */
-
-PRIVATE int inverse_permutation
-(
-    Int *P,     /* input, size n, P[k]=i means i is kth object in permutation */
-    Int *Pinv,  /* output, size n, Pinv[i]=k if P[k]=i */
-    Int n       /* input */
-)
-{
-    Int i, k ;
-    for (i = 0 ; i < n ; i++)
-    {
-        Pinv [i] = EMPTY ;
-    }
-    for (k = 0 ; k < n ; k++)
-    {
-        i = P [k] ;
-        if (i < 0 || i >= n || Pinv [i] != EMPTY)
-        {
-            /* invalid permutation */
-            return (FALSE) ;
-        }
-        Pinv [i] = k ;
-    }
-    return (TRUE) ;
-}
-
-
-/* ========================================================================== */
-/* === do_amd_1 ============================================================= */
-/* ========================================================================== */
-
-/* do_amd_1: Construct A+A' for a sparse matrix A and perform the AMD ordering
- * or user_ordering.  Modified from AMD/Source/amd_1.c
- *
- * 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 or the user_ordering.
- * No error checking is performed (this was done in AMD_valid).
- */
-
-PRIVATE int do_amd_1
-(
-    Int n,		/* n > 0 */
-    Int Ap [ ],	        /* input of size n+1, not modified */
-    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+1,
-			 * ideally slen = 1.2 * sum (Len) + 8n */
-    Int S [ ],		/* size slen workspace */
-    Int ordering_option,
-    Int print_level,
-
-    /* user-provided ordering function */
-    int (*user_ordering)    /* TRUE if OK, FALSE otherwise */
-    (
-        /* inputs, not modified on output */
-        Int,            /* nrow */
-        Int,            /* ncol */
-        Int,            /* sym: if TRUE and nrow==ncol do A+A', else do A'A */
-        Int *,          /* Ap, size ncol+1 */
-        Int *,          /* Ai, size nz */
-        /* output */
-        Int *,          /* size ncol, fill-reducing permutation */
-        /* input/output */
-        void *,         /* user_params (ignored by UMFPACK) */
-        double *        /* user_info[0..2], optional output for symmetric case.
-                           user_info[0]: max column count for L=chol(P(A+A')P')
-                           user_info[1]: nnz (L)
-                           user_info[2]: flop count for chol, if A real */
-    ),
-    void *user_params,  /* passed to user_ordering function */
-
-    Int *ordering_used,
-
-    double amd_Control [ ],	/* input array of size AMD_CONTROL */
-    double amd_Info [ ] 	/* output array of size AMD_INFO */
-)
-{
-    Int i, j, k, p, pfree, iwlen, pj, p1, p2, pj2, anz, *Iw, *Pe, *Nv, *Head,
-	*Elen, *Degree, *s, *W, *Sp, *Tp ;
-
-    /* --------------------------------------------------------------------- */
-    /* construct the matrix for AMD_2 or user_ordering */
-    /* --------------------------------------------------------------------- */
-
-    ASSERT (n > 0) ;
-#ifndef NDEBUG
-    for (p = 0 ; p < slen ; p++) S [p] = EMPTY ;
-#endif
-
-    s = S ;
-    Pe = s ;	    s += (n+1) ;    slen -= (n+1) ;
-    Nv = s ;	    s += n ;        slen -= n ;
-
-    if (user_ordering == NULL)
-    {
-        /* iwlen = slen - (3*n+1) ; */
-        Head = s ;      s += n ;    slen -= n ;
-        Elen = s ;      s += n ;    slen -= n ;
-        Degree = s ;    s += n ;    slen -= n ;
-    }
-    else
-    {
-        /* iwlen = slen - (6*n+1) ; */
-        Head = NULL ;
-        Elen = NULL ;
-        Degree = NULL ;
-    }
-
-    W = s ;	    s += n ;        slen -= n ;
-
-    iwlen = slen ;
-    Iw = s ;	    s += iwlen ;
-
-    ASSERT (AMD_valid (n, n, Ap, Ai) == AMD_OK) ;
-    anz = Ap [n] ;
-
-    /* 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] ;
-    }
-    Pe [n] = pfree ;
-
-#ifndef NDEBUG
-    if (user_ordering == NULL)
-    {
-        /* 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) ;
-    }
-    else
-    {
-        ASSERT (iwlen >= pfree) ;
-    }
-    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 ; j++) ASSERT (Sp [j] == Pe [j+1]) ;
-#endif
-
-    /* Tp and Sp no longer needed ] */
-
-    /* --------------------------------------------------------------------- */
-    /* order the matrix */
-    /* --------------------------------------------------------------------- */
-
-    if (ordering_option == UMFPACK_ORDERING_AMD)
-    {
-
-        /* use AMD as the symmetric ordering */
-        AMD_2 (n, Pe, Iw, Len, iwlen, pfree,
-            Nv, Pinv, P, Head, Elen, Degree, W, amd_Control, amd_Info) ;
-        *ordering_used = UMFPACK_ORDERING_AMD ;
-        return (TRUE) ;
-
-    }
-    else
-    {
-
-        /* use the user-provided symmetric ordering, or umf_cholmod */
-        double user_info [3], dmax, lnz, flops ;
-        int ok ;
-        user_info [0] = EMPTY ;
-        user_info [1] = EMPTY ;
-        user_info [2] = EMPTY ;
-
-        if (ordering_option == UMFPACK_ORDERING_USER)
-        {
-            ok = (*user_ordering) (n, n, TRUE, Pe, Iw, P,
-                user_params, user_info) ;
-            *ordering_used = UMFPACK_ORDERING_USER ;
-        }
-        else
-        /* if (ordering_option == UMFPACK_ORDERING_CHOLMOD
-            || ordering_option == UMFPACK_ORDERING_GIVEN
-            || ordering_option == UMFPACK_ORDERING_NONE
-            || ordering_option == UMFPACK_ORDERING_METIS
-            || ordering_option == UMFPACK_ORDERING_BEST) */
-        {
-            Int params [3] ;
-            params [0] = ordering_option ;
-            params [1] = print_level ;
-            ok = UMF_cholmod (n, n, TRUE, Pe, Iw, P, &params, user_info) ;
-            *ordering_used = params [2] ;
-        }
-
-        if (!ok)
-        {
-            /* user_ordering or UMF_cholmod failed */
-            amd_Info [AMD_STATUS] = AMD_INVALID ;
-            return (FALSE) ;
-        }
-
-        /* get the user ordering statistics, if computed */
-        dmax  = user_info [0] ;
-        lnz   = user_info [1] ;
-        flops = user_info [2] ;
-
-        /* construct amd_Info, as if AMD was called */
-        amd_Info [AMD_STATUS] = AMD_OK ;
-        amd_Info [AMD_N] = n ;
-        amd_Info [AMD_NZ] = anz ;
-        /* amd_Info [AMD_SYMMETRY] not computed ; */
-        /* amd_Info [AMD_NZDIAG] not computed ; */
-        amd_Info [AMD_NZ_A_PLUS_AT] = pfree ;
-        amd_Info [AMD_NDENSE] = 0 ;
-        /* amd_Info [AMD_MEMORY] not computed ; */
-        amd_Info [AMD_NCMPA] = 0 ;
-        amd_Info [AMD_LNZ] = lnz ;
-        amd_Info [AMD_NDIV] = lnz ;
-        if (flops >= 0)
-        {
-            amd_Info [AMD_NMULTSUBS_LDL] = (flops - n) / 2 ;
-            amd_Info [AMD_NMULTSUBS_LU]  = (flops - n) ;
-        }
-        else
-        {
-            amd_Info [AMD_NMULTSUBS_LDL] = EMPTY ;
-            amd_Info [AMD_NMULTSUBS_LU]  = EMPTY ;
-        }
-        amd_Info [AMD_DMAX] = dmax ;
-
-        /* construct the inverse permutation */
-        return (inverse_permutation (P, Pinv, n)) ;
-    }
-}
-
-
-/* ========================================================================== */
-/* === do_amd =============================================================== */
-/* ========================================================================== */
-
-PRIVATE int do_amd
-(
-    Int n,
-    Int Ap [ ],		        /* size n+1 */
-    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 Clen workspace */
-    double amd_Control [ ],	/* AMD control parameters */
-    double amd_Info [ ],	/* AMD info */
-    SymbolicType *Symbolic,	/* Symbolic object */
-    double Info [ ],		/* UMFPACK info */
-    Int ordering_option,
-    Int print_level,
-
-    /* user-provided ordering function */
-    int (*user_ordering)    /* TRUE if OK, FALSE otherwise */
-    (
-        /* inputs, not modified on output */
-        Int,            /* nrow */
-        Int,            /* ncol */
-        Int,            /* sym: if TRUE and nrow==ncol do A+A', else do A'A */
-        Int *,          /* Ap, size ncol+1 */
-        Int *,          /* Ai, size nz */
-        /* output */
-        Int *,          /* size ncol, fill-reducing permutation */
-        /* input/output */
-        void *,         /* user_params (ignored by UMFPACK) */
-        double *        /* user_info[0..2], optional output for symmetric case.
-                           user_info[0]: max column count for L=chol(P(A+A')P')
-                           user_info[1]: nnz (L)
-                           user_info[2]: flop count for chol, if A real */
-    ),
-    void *user_params,  /* passed to user_ordering function */
-    Int *ordering_used
-)
-{
-    int ok = TRUE ;
-    *ordering_used = UMFPACK_ORDERING_NONE ;
-
-    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
-    {
-	ok = do_amd_1 (n, Ap, Ai, Q, Qinv, Sdeg, Clen,
-            Ci, ordering_option, print_level, user_ordering, user_params,
-            ordering_used, amd_Control, amd_Info) ;
-
-        /* return estimates computed from AMD or user ordering P(A+A')P' */
-        if (ok)
-        {
-            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] ;
-        }
-    }
-    return (ok) ;
-}
-
-/* ========================================================================== */
-/* === 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
-
-}
-
-/* ========================================================================== */
-/* === symbolic_analysis ==================================================== */
-/* ========================================================================== */
-
-PRIVATE Int symbolic_analysis
-(
-    Int n_row,
-    Int n_col,
-    const Int Ap [ ],
-    const Int Ai [ ],
-    const double Ax [ ],
-#ifdef COMPLEX
-    const double Az [ ],
-#endif
-
-    /* user-provided ordering (may be NULL) */
-    const Int Quser [ ],
-
-    /* user-provided ordering function */
-    int (*user_ordering)    /* TRUE if OK, FALSE otherwise */
-    (
-        /* inputs, not modified on output */
-        Int,            /* nrow */
-        Int,            /* ncol */
-        Int,            /* sym: if TRUE and nrow==ncol do A+A', else do A'A */
-        Int *,          /* Ap, size ncol+1 */
-        Int *,          /* Ai, size nz */
-        /* output */
-        Int *,          /* size ncol, fill-reducing permutation */
-        /* input/output */
-        void *,         /* user_params (ignored by UMFPACK) */
-        double *        /* user_info[0..2], optional output for symmetric case.
-                           user_info[0]: max column count for L=chol(P(A+A')P')
-                           user_info[1]: nnz (L)
-                           user_info[2]: flop count for chol, if A real */
-    ),
-    void *user_params,  /* passed to user_ordering function */
-
-    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] ;
-    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, oldrow,
-	dense_row_threshold, tlen, aggressive, *Rp, *Ri ;
-    Int do_singletons, ordering_option, print_level ;
-    int ok ;
-
-    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) ;
-    force_fixQ = GET_CONTROL (UMFPACK_FIXQ, UMFPACK_DEFAULT_FIXQ) ;
-    do_singletons = GET_CONTROL (UMFPACK_SINGLETONS,UMFPACK_DEFAULT_SINGLETONS);
-    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 ;
-    print_level = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
-
-    /* get the ordering_option */
-    ordering_option = GET_CONTROL (UMFPACK_ORDERING, UMFPACK_DEFAULT_ORDERING) ;
-    if (ordering_option < 0 || ordering_option > UMFPACK_ORDERING_USER)
-    {
-        ordering_option = UMFPACK_DEFAULT_ORDERING ;
-    }
-    if (Quser == (Int *) NULL)
-    {
-        /* Quser is NULL, so ordering cannot be "given" */
-        /* user_ordering function not provided, so ordering cannot be "user" */
-        if (ordering_option == UMFPACK_ORDERING_GIVEN ||
-           (ordering_option == UMFPACK_ORDERING_USER && !user_ordering))
-        {
-            ordering_option = UMFPACK_ORDERING_NONE ;
-        }
-    }
-    else
-    {
-        /* if Quser is not NULL, then always use it */
-        ordering_option = UMFPACK_ORDERING_GIVEN ;
-    }
-
-    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)) ;
-
-    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 (SuiteSparse_long)) ;
-    Info [UMFPACK_SIZE_OF_POINTER] = (double) (sizeof (void *)) ;
-    Info [UMFPACK_SIZE_OF_ENTRY] = (double) (sizeof (Entry)) ;
-    Info [UMFPACK_SYMBOLIC_DEFRAG] = 0 ;
-    Info [UMFPACK_ORDERING_USED] = EMPTY ;
-
-    if (SymbolicHandle != NULL)
-    {
-        *SymbolicHandle = (void *) NULL ;
-    }
-
-    if (!Ai || !Ap || !SymbolicHandle)
-    {
-	Info [UMFPACK_STATUS] = UMFPACK_ERROR_argument_missing ;
-	return (UMFPACK_ERROR_argument_missing) ;
-    }
-
-    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
-     || strategy == UMFPACK_STRATEGY_OBSOLETE)
-    {
-	/* 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_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 + 1 ;
-
-    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 SuiteSparse_long 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 + 1 ;
-    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->ordering = EMPTY ;    /* not yet determined */
-    Symbolic->amd_lunz = EMPTY ;
-    Symbolic->max_nchains = EMPTY ;
-
-    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 ;
-    Cdeg [n_col] = EMPTY ;      /* unused space */
-    Rdeg [n_row] = EMPTY ;
-
-    /* ---------------------------------------------------------------------- */
-    /* 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 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 ;
-    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,
-        do_singletons, /* if false, then do not look for singletons */
-	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) == AMD_OK) ;
-
-    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), 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) == AMD_OK) ;
-
-	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.5 && nzdiag >= 0.9 * n2)
-        {
-            /* pattern is mostly symmetric (50% or more) and the diagonal is
-             * mostly zero-free (90% or more).  Use symmetric strategy. */
-	    strategy = UMFPACK_STRATEGY_SYMMETRIC ;
-	    DEBUG0 (("Strategy: select symmetric\n")) ;
-        }
-        else
-        {
-            /* otherwise use unsymmetric strategy */
-	    strategy = UMFPACK_STRATEGY_UNSYMMETRIC ;
-	    DEBUG0 (("Strategy: select unsymmetric\n")) ;
-        }
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* finalize the strategy, including fixQ and prefer_diagonal */
-    /* ---------------------------------------------------------------------- */
-
-    DEBUG0 (("strategy is now "ID"\n", strategy)) ;
-
-    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) ;
-	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")) ;
-	fixQ = FALSE ;
-	prefer_diagonal = FALSE ;
-    }
-
-    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", ordering_option)) ;
-    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_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 ordering_used ;
-	Int *Qinv = Fr_npivcol ;
-	ASSERT (n_row == n_col && nn == n_row) ;
-	ASSERT (Clen >= (nzaat + nzaat/5 + nn) + 7*nn + 1) ;
-        ok = do_amd (n2, Sp, Si, Wq, Qinv, Sdeg, Clen, Ci,
-                amd_Control, amd_Info, Symbolic, Info,
-                ordering_option, print_level, user_ordering, user_params,
-                &ordering_used) ;
-        if (!ok)
-        {
-            DEBUGm4 (("symmetric ordering failed\n")) ;
-            status = UMFPACK_ERROR_ordering_failed ;
-            Info [UMFPACK_STATUS] = status ;
-            error (&Symbolic, SW) ;
-            return (status) ;
-        }
-	/* combine the singleton ordering and the AMD ordering */
-        Symbolic->ordering = ordering_used ;
-	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] ;
-	}
-        Symbolic->ordering = UMFPACK_ORDERING_GIVEN ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* use COLAMD or user_ordering to order the matrix */
-    /* ---------------------------------------------------------------------- */
-
-    if (strategy == UMFPACK_STRATEGY_UNSYMMETRIC && Quser == (Int *) NULL)
-    {
-        Int nrow2, ncol2 ;
-
-	/* ------------------------------------------------------------------ */
-	/* 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
-	    ) ;
-
-        /* size of pruned matrix */
-        nrow2 = n_row - n1 - nempty_row ;
-        ncol2 = n_col - n1 - nempty_col ;
-
-        if ((ordering_option == UMFPACK_ORDERING_USER
-            || ordering_option == UMFPACK_ORDERING_NONE
-            || ordering_option == UMFPACK_ORDERING_METIS
-            || ordering_option == UMFPACK_ORDERING_CHOLMOD
-            || ordering_option == UMFPACK_ORDERING_BEST)
-            && nrow2 > 0 && ncol2 > 0)
-        {
-
-            /* -------------------------------------------------------------- */
-            /* use the user-provided column ordering */
-            /* -------------------------------------------------------------- */
-
-            double user_info [3] ;    /* not needed */
-            Int *Qinv = Fr_npivcol ;  /* use Fr_npivcol as workspace for Qinv */
-            Int *QQ = Fr_nrows ;      /* use Fr_nrows as workspace for QQ */
-
-            /* analyze the resulting ordering for UMFPACK */
-            do_UMF_analyze = TRUE ;
-
-            if (ordering_option == UMFPACK_ORDERING_USER)
-            {
-                ok = (*user_ordering) (
-                    /* inputs */
-                    nrow2,
-                    ncol2,
-                    FALSE,
-                    Cperm_init, /* column pointers, Cp [0 ... ncol] */
-                    Ci, /* row indices */
-                    /* outputs, contents not defined on input */
-                    QQ, /* size ncol, QQ [k] = j if col j is kth col of A*Q */
-                    /* parameters and info for user ordering */
-                    user_params,
-                    user_info) ;
-                Symbolic->ordering = UMFPACK_ORDERING_USER ;
-            }
-            else
-            {
-                Int params [3] ;
-                params [0] = ordering_option ;
-                params [1] = print_level ;
-                ok = UMF_cholmod (
-                    /* inputs */
-                    nrow2,
-                    ncol2,
-                    FALSE,
-                    Cperm_init, /* column pointers, Cp [0 ... ncol] */
-                    Ci, /* row indices */
-                    /* outputs, contents not defined on input */
-                    QQ, /* size ncol, QQ [k] = j if col j is kth col of A*Q */
-                    /* parameters and info for user ordering */
-                    &params,
-                    user_info) ;
-                Symbolic->ordering = params [2] ;
-            }
-
-            /* compute Qinv from QQ */
-            if (!ok || !inverse_permutation (QQ, Qinv, ncol2))
-            {
-                /* user ordering failed */
-                DEBUGm4 (("user ordering failed\n")) ;
-                status = UMFPACK_ERROR_ordering_failed ;
-                Info [UMFPACK_STATUS] = status ;
-                error (&Symbolic, SW) ;
-                return (status) ;
-            }
-
-            /* Combine the singleton and colamd ordering into Cperm_init */
-            /* Note that the user_unsymmetric_ordering function returns its
-             * inverse permutation in Qinv */
-            combine_ordering (n1, nempty_col, n_col, Cperm_init, Cperm1, Qinv) ;
-
-        }
-        else
-        {
-
-            /* -------------------------------------------------------------- */
-            /* 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) ;
-            Symbolic->ordering = UMFPACK_ORDERING_AMD ;
-
-            /* # 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 ;
-
-    }
-
-    /* ordering has been finalized */
-    Info [UMFPACK_ORDERING_USED] = Symbolic->ordering ;
-    DEBUG0 (("Final ordering used: "ID"\n", Symbolic->ordering)) ;
-
-    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, *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 */
-    /* ---------------------------------------------------------------------- */
-
-    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
-	+ (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)) ;
-	}
-    }
-#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 used to construct the Diagonal_map.
-     */
-
-    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 ;
-	}
-
-        for (newcol = 0 ; newcol < nn ; newcol++)
-        {
-            oldcol = Cperm_init [newcol] ;
-            oldrow = oldcol ;
-            newrow = Ci [oldrow] ;
-            ASSERT (newrow >= 0 && newrow < nn) ;
-            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 ;
-		CLEAR (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 ;
-	}
-    }
-
-    Chain_maxrows [nchains] = 0 ;
-    Chain_maxcols [nchains] = 0 ;
-
-    /* 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)  /* divide by pivot */
-		/* 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->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) ;
-}
-
-
-/* ========================================================================== */
-/* === 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]
-)
-{
-    return (symbolic_analysis (n_row, n_col, Ap, Ai, Ax,
-#ifdef COMPLEX
-        Az,
-#endif
-
-        /* user-provided ordering (ignored if NULL) */
-        Quser,
-
-        /* no user provided ordering function */
-        (void *) NULL,
-        (void *) NULL,
-
-        SymbolicHandle, Control, User_Info)) ;
-}
-
-
-/* ========================================================================== */
-/* === UMFPACK_fsymbolic ==================================================== */
-/* ========================================================================== */
-
-GLOBAL Int UMFPACK_fsymbolic
-(
-    Int n_row,
-    Int n_col,
-    const Int Ap [ ],
-    const Int Ai [ ],
-    const double Ax [ ],
-#ifdef COMPLEX
-    const double Az [ ],
-#endif
-
-    /* user-provided ordering function */
-    int (*user_ordering)    /* TRUE if OK, FALSE otherwise */
-    (
-        /* inputs, not modified on output */
-        Int,            /* nrow */
-        Int,            /* ncol */
-        Int,            /* sym: if TRUE and nrow==ncol do A+A', else do A'A */
-        Int *,          /* Ap, size ncol+1 */
-        Int *,          /* Ai, size nz */
-        /* output */
-        Int *,          /* size ncol, fill-reducing permutation */
-        /* input/output */
-        void *,         /* user_params (ignored by UMFPACK) */
-        double *        /* user_info[0..2], optional output for symmetric case.
-                           user_info[0]: max column count for L=chol(P(A+A')P')
-                           user_info[1]: nnz (L)
-                           user_info[2]: flop count for chol, if A real */
-    ),
-    void *user_params,  /* passed to user_ordering function */
-
-    void **SymbolicHandle,
-    const double Control [UMFPACK_CONTROL],
-    double User_Info [UMFPACK_INFO]
-)
-{
-    return (symbolic_analysis (n_row, n_col, Ap, Ai, Ax,
-#ifdef COMPLEX
-        Az,
-#endif
-
-        /* user ordering not provided */
-        (Int *) NULL,
-        /* user ordering functions used instead */
-        user_ordering,
-        user_params,
-
-        SymbolicHandle, Control, User_Info)) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_control.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_control.c
deleted file mode 100644
index 615788c..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_control.c
+++ /dev/null
@@ -1,370 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_control =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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,
-	force_fixQ, droptol, aggr ;
-    Int prl, nb, irstep, strategy, scale, s ;
-    Int do_singletons, ordering_option ;
-
-    prl = GET_CONTROL (UMFPACK_PRL, UMFPACK_DEFAULT_PRL) ;
-
-    if (prl < 2)
-    {
-	/* default is to print nothing */
-	return ;
-    }
-
-    PRINTF  (("UMFPACK V%d.%d.%d (%s), Control:\n", UMFPACK_MAIN_VERSION,
-	UMFPACK_SUB_VERSION, UMFPACK_SUBSUB_VERSION, UMFPACK_DATE)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* 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: SuiteSparse_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: SuiteSparse_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 /* auto strategy */
-    {
-	strategy = UMFPACK_STRATEGY_AUTO ;
-	PRINTF ((" (auto)\n")) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* ordering */
-    /* ---------------------------------------------------------------------- */
-
-    ordering_option = GET_CONTROL (UMFPACK_ORDERING, UMFPACK_DEFAULT_ORDERING) ;
-    if (ordering_option < 0 || ordering_option > UMFPACK_ORDERING_USER)
-    {
-        ordering_option = UMFPACK_DEFAULT_ORDERING ;
-    }
-    PRINTF (("    "ID": ordering: "ID,
-	(Int) INDEX (UMFPACK_ORDERING), ordering_option)) ;
-    if (ordering_option == UMFPACK_ORDERING_CHOLMOD)
-    {
-        PRINTF ((" CHOLMOD: AMD/COLAMD, then try METIS, and select best\n")) ;
-    }
-    else if (ordering_option == UMFPACK_ORDERING_AMD)
-    {
-        PRINTF ((" AMD/COLAMD\n")) ;
-    }
-    else if (ordering_option == UMFPACK_ORDERING_GIVEN)
-    {
-        PRINTF ((" user-provided permutation vector\n")) ;
-    }
-    else if (ordering_option == UMFPACK_ORDERING_NONE)
-    {
-        PRINTF ((" none\n")) ;
-    }
-    else if (ordering_option == UMFPACK_ORDERING_METIS)
-    {
-        PRINTF ((" METIS\n")) ;
-    }
-    else if (ordering_option == UMFPACK_ORDERING_BEST)
-    {
-        PRINTF ((" best effort. Try AMD/COLAMD and METIS, select best\n")) ;
-    }
-    else if (ordering_option == UMFPACK_ORDERING_USER)
-    {
-        PRINTF ((" user-provided ordering function\n")) ;
-    }
-
-    /* ---------------------------------------------------------------------- */
-    /* disable singletons (default is FALSE) */
-    /* ---------------------------------------------------------------------- */
-
-    do_singletons = GET_CONTROL (UMFPACK_SINGLETONS,UMFPACK_DEFAULT_SINGLETONS);
-    PRINTF (("    "ID": singleton filter:", (Int) INDEX (UMFPACK_SINGLETONS))) ;
-    if (do_singletons)
-    {
-	PRINTF ((" enabled\n")) ;
-    }
-    else
-    {
-	PRINTF ((" disabled\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)) ;
-
-    /* ---------------------------------------------------------------------- */
-    /* 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))) ;
-
-#ifdef NBLAS
-    PRINTF (("none.  UMFPACK will be slow.\n")) ;
-#else
-    PRINTF (("Fortran BLAS.  size of BLAS integer: "ID"\n",
-	(Int) (sizeof (BLAS_INT)))) ;
-#endif
-
-#ifdef MATLAB_MEX_FILE
-    PRINTF (("    compiled for MATLAB\n")) ;
-#else
-    PRINTF (("    compiled for ANSI C\n")) ;
-#endif
-
-#ifdef SUITESPARSE_TIMER_ENABLED
-    PRINTF (("    POSIX C clock_getttime.\n")) ;
-#else
-    PRINTF (("    no timer used.\n")) ;
-#endif
-
-    PRINTF (("    computer/operating system: %s\n", UMFPACK_ARCHITECTURE)) ;
-    PRINTF (("    size of int: %g SuiteSparse_long: %g Int: %g pointer: %g"
-	" double: %g Entry: %g (in bytes)\n\n", (double) sizeof (int),
-	(double) sizeof (SuiteSparse_long), (double) sizeof (Int),
-	(double) sizeof (void *), (double) sizeof (double),
-	(double) sizeof (Entry))) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_info.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_info.c
deleted file mode 100644
index 03aacfd..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_info.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_info ================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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, ftot, twsym, twnum, twsolve, twtot, n2 ;
-    Int n_row, n_col, n_inner, prl, is_sym, strategy ;
-
-    /* ---------------------------------------------------------------------- */
-    /* 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  (("UMFPACK V%d.%d.%d (%s), Info:\n", UMFPACK_MAIN_VERSION,
-	UMFPACK_SUB_VERSION, UMFPACK_SUBSUB_VERSION, UMFPACK_DATE)) ;
-
-#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: SuiteSparse_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: SuiteSparse_long\n")) ;
-#endif
-
-    /* ---------------------------------------------------------------------- */
-    /* print compile-time options */
-    /* ---------------------------------------------------------------------- */
-
-    PRINTF (("    BLAS library used: ")) ;
-
-#ifdef NBLAS
-    PRINTF (("none.  UMFPACK will be slow.\n")) ;
-#else
-    PRINTF (("Fortran BLAS.  size of BLAS integer: "ID"\n",
-	(Int) (sizeof (BLAS_INT)))) ;
-#endif
-
-    PRINTF (("    MATLAB:                           ")) ;
-#ifdef MATLAB_MEX_FILE
-    PRINTF (("yes.\n")) ;
-#else
-#ifdef MATHWORKS
-    PRINTF (("yes.\n")) ;
-#else
-    PRINTF (("no.\n")) ;
-#endif
-#endif
-
-    PRINTF (("    CPU timer:                        ")) ;
-#ifdef SUITESPARSE_TIMER_ENABLED
-    PRINTF (("POSIX C clock_getttime ( ) routine.\n")) ;
-#else
-    PRINTF (("none.\n")) ;
-#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 SuiteSparse_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 */
-    /* ---------------------------------------------------------------------- */
-
-    strategy = Info [UMFPACK_STRATEGY_USED] ;
-    if (strategy == UMFPACK_STRATEGY_SYMMETRIC)
-    {
-	PRINTF (("\n    strategy used:                    symmetric\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_GIVEN)
-        {
-            PRINTF (("    ordering used:                    user perm.\n")) ;
-        }
-        else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_USER)
-        {
-            PRINTF (("    ordering used:                    user function\n")) ;
-        }
-        else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_NONE)
-        {
-            PRINTF (("    ordering used:                    none\n")) ;
-        }
-        else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_METIS)
-        {
-            PRINTF (("    ordering used:                    metis on A+A'\n")) ;
-        }
-        else
-        {
-            PRINTF (("    ordering used:                    not computed\n")) ;
-        }
-    }
-    else
-    {
-	PRINTF (("\n    strategy used:                    unsymmetric\n")) ;
-        if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_AMD)
-        {
-            PRINTF (("    ordering used:                    colamd on A\n")) ;
-        }
-        else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_GIVEN)
-        {
-            PRINTF (("    ordering used:                    user perm.\n")) ;
-        }
-        else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_USER)
-        {
-            PRINTF (("    ordering used:                    user function\n")) ;
-        }
-        else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_NONE)
-        {
-            PRINTF (("    ordering used:                    none\n")) ;
-        }
-        else if (Info [UMFPACK_ORDERING_USED] == UMFPACK_ORDERING_METIS)
-        {
-            PRINTF (("    ordering used:                    metis on A'A\n")) ;
-        }
-        else
-        {
-            PRINTF (("    ordering used:                    not computed\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 AMD */
-    /* ---------------------------------------------------------------------- */
-
-    if (strategy == UMFPACK_STRATEGY_SYMMETRIC && 
-        Info [UMFPACK_ORDERING_USED] != UMFPACK_ORDERING_GIVEN)
-    {
-	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]) ;
-        if (dmax > 0)
-        {
-            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 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 wallclock time (sec):    %.2f\n",
-	twnum) ;
-
-#define TMIN 0.001
-
-    if (twnum > TMIN && fnum > 0)
-    {
-	PRINT_INFO (
-	   "    numeric factorization mflops (wallclock):      %.2f\n",
-	   1e-6 * fnum / twnum) ;
-    }
-
-    ftot = fnum ;
-
-    twtot = EMPTY ;
-    if (twsym >= TMIN && twnum >= TMIN)
-    {
-	twtot = twsym + twnum ;
-	PRINT_INFO ("    symbolic + numeric wall clock time (sec):      %.2f\n",
-	    twtot) ;
-	if (ftot > 0 && twtot > TMIN)
-	{
-	    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 wall clock time (sec):                   %.2f\n",
-	twsolve) ;
-    if (fsolve > 0 && twsolve > TMIN)
-    {
-	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 (twsolve >= TMIN)
-    {
-	if (twtot >= TMIN && ftot >= 0)
-	{
-	    twtot += tsolve ;
-	    PRINT_INFO (
-		"    total symbolic+numeric+solve wall clock time:  %.2f\n",
-		twtot) ;
-	    if (ftot > 0 && twtot > TMIN)
-	    {
-		PRINT_INFO (
-		"    total symbolic+numeric+solve mflops(wallclock) %.2f\n",
-		1e-6 * ftot / twtot) ;
-	    }
-	}
-    }
-    PRINTF (("\n")) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_matrix.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_matrix.c
deleted file mode 100644
index 68b478c..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_matrix.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_matrix ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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_kind, *index_kind ;
-#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_kind = "column" ;	/* column vectors */
-	index_kind = "row" ;		/* with row indices */
-	n = n_col ;
-	n_i = n_row ;
-    }
-    else
-    {
-	vector_kind = "row" ;	/* row vectors */
-	index_kind = "column" ;	/* with column indices */
-	n = n_row ;
-	n_i = n_col ;
-    }
-
-    PRINTF (("%s-form matrix, n_row "ID" n_col "ID", ",
-        vector_kind, 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_kind, 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_kind, INDEX (k), p1, p2-1, length)) ;
-	ilast = EMPTY ;
-	for (p = p1 ; p < p2 ; p++)
-	{
-	    i = Ai [p] ;
-	    PRINTF4 (("\t%s "ID" ", index_kind, 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_kind, INDEX (i), vector_kind, 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_kind, INDEX (i),
-                    vector_kind, 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_kind)) ;
-    PRINTF (("OK\n\n")) ;
-
-    return (UMFPACK_OK) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_numeric.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_numeric.c
deleted file mode 100644
index 21cb6c5..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_numeric.c
+++ /dev/null
@@ -1,662 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_numeric =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_perm.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_perm.c
deleted file mode 100644
index 9a3810b..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_perm.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_perm ================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_status.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_status.c
deleted file mode 100644
index dd923d1..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_status.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_status ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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  (("UMFPACK V%d.%d.%d (%s): ", UMFPACK_MAIN_VERSION,
-	UMFPACK_SUB_VERSION, UMFPACK_SUBSUB_VERSION, UMFPACK_DATE)) ;
-
-    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_ordering_failed:
-	    PRINTF (("ERROR: ordering failed\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\n"
-            "(DrTimothyAldenDavis at gmail.com).\n"
-	    )) ;
-	    break ;
-
-	default:
-	    PRINTF (("ERROR: Unrecognized error code: "ID"\n", status)) ;
-
-    }
-    PRINTF  (("\n")) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_symbolic.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_symbolic.c
deleted file mode 100644
index 4b96294..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_symbolic.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_symbolic ============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    User-callable.  Prints the Symbolic object. See umfpack_report_symbolic.h
-    for details.  Not all of the object is printed.
-
-    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\n")) ;
-            PRINTF (("    ordering used:                              ")) ;
-            if (Symbolic->ordering == UMFPACK_ORDERING_AMD)
-            {
-                PRINTF (("amd on A\n")) ;
-            }
-            else if (Symbolic->ordering == UMFPACK_ORDERING_GIVEN)
-            {
-                PRINTF (("user permutation")) ;
-            }
-            else if (Symbolic->ordering == UMFPACK_ORDERING_USER)
-            {
-                PRINTF (("user function")) ;
-            }
-            else if (Symbolic->ordering == UMFPACK_ORDERING_METIS)
-            {
-                PRINTF (("metis on A")) ;
-            }
-	}
-	else /* if (Symbolic->strategy == UMFPACK_STRATEGY_UNSYMMETRIC) */
-	{
-	    PRINTF (("unsymmetric\n")) ;
-            PRINTF (("    ordering used:                              ")) ;
-            if (Symbolic->ordering == UMFPACK_ORDERING_AMD)
-            {
-                PRINTF (("colamd on A\n")) ;
-            }
-            else if (Symbolic->ordering == UMFPACK_ORDERING_GIVEN)
-            {
-                PRINTF (("user permutation")) ;
-            }
-            else if (Symbolic->ordering == UMFPACK_ORDERING_USER)
-            {
-                PRINTF (("user function")) ;
-            }
-            else if (Symbolic->ordering == UMFPACK_ORDERING_METIS)
-            {
-                PRINTF (("metis on A'A")) ;
-            }
-	}
-	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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_triplet.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_triplet.c
deleted file mode 100644
index 3ee7f5e..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_triplet.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_triplet =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_vector.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_vector.c
deleted file mode 100644
index 7140352..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_report_vector.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_report_vector ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_save_numeric.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_save_numeric.c
deleted file mode 100644
index cc8a5aa..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_save_numeric.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_save_numeric ================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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) != (size_t) n) \
-    { \
-	fclose (f) ; \
-	return (UMFPACK_ERROR_file_IO) ; \
-    } \
-    fflush (f) ; \
-}
-
-/* ========================================================================== */
-/* === 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) ;
-    }
-    /* It is possible that some parts of Numeric->Memory are
-       unitialized and unused; this is OK, but it can generate
-       a valgrind warning. */
-    WRITE (Numeric->Memory, Unit, Numeric->size) ;
-
-    /* close the file */
-    fclose (f) ;
-
-    return (UMFPACK_OK) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_save_symbolic.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_save_symbolic.c
deleted file mode 100644
index 74a0d50..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_save_symbolic.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_save_symbolic ================================================ */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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) != (size_t) n) \
-    { \
-	fclose (f) ; \
-	return (UMFPACK_ERROR_file_IO) ; \
-    } \
-    fflush (f) ; \
-}
-
-/* ========================================================================== */
-/* === 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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_scale.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_scale.c
deleted file mode 100644
index 419b2af..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_scale.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_scale ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_solve.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_solve.c
deleted file mode 100644
index 604f26f..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_solve.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_solve ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_symbolic.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_symbolic.c
deleted file mode 100644
index 7f75e7d..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_symbolic.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_symbolic ===================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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]
-)
-{
-    return (UMFPACK_qsymbolic (n_row, n_col, Ap, Ai, Ax,
-#ifdef COMPLEX
-        Az,
-#endif
-        (Int *) NULL, SymbolicHandle, Control, Info)) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_tictoc.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_tictoc.c
deleted file mode 100644
index 188ba39..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_tictoc.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_tictoc ======================================================= */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    User-callable.  Returns 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.
-
-    In a prior version, two timings were returned: wall clock and cpu time.
-    In the current version, both times are set to the wall clock time.
-*/
-
-#include "umf_internal.h"
-
-void umfpack_tic (double stats [2])
-{
-    stats [0] = SuiteSparse_time ( ) ;
-    stats [1] = stats [0] ;
-}
-
-void umfpack_toc (double stats [2])
-{
-    stats [0] = SuiteSparse_time ( ) - stats [0] ;
-    stats [1] = stats [0] ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_timer.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_timer.c
deleted file mode 100644
index 3c53a35..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_timer.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* ========================================================================== */
-/* === umfpack_timer ======================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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.
-*/
-
-#include "umfpack_timer.h"
-#include "SuiteSparse_config.h"
-
-double umfpack_timer ( void )
-{
-    return (SuiteSparse_time ( )) ;
-}
diff --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_transpose.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_transpose.c
deleted file mode 100644
index a57c461..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_transpose.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_transpose ==================================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse/UMFPACK/Source/umfpack_triplet_to_col.c b/src/C/SuiteSparse/UMFPACK/Source/umfpack_triplet_to_col.c
deleted file mode 100644
index 5eb4aa6..0000000
--- a/src/C/SuiteSparse/UMFPACK/Source/umfpack_triplet_to_col.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/* ========================================================================== */
-/* === UMFPACK_triplet_to_col =============================================== */
-/* ========================================================================== */
-
-/* -------------------------------------------------------------------------- */
-/* Copyright (c) 2005-2012 by Timothy A. Davis, http://www.suitesparse.com.   */
-/* All Rights Reserved.  See ../Doc/License for License.                      */
-/* -------------------------------------------------------------------------- */
-
-/*
-    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 --git a/src/C/SuiteSparse_cvxopt_extra/README b/src/C/SuiteSparse_cvxopt_extra/README
deleted file mode 100644
index 952cf9e..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/README
+++ /dev/null
@@ -1,7 +0,0 @@
-This directory contains CVXOPT specific modifications to the libraries 
-in SuiteSparse necessary to build them with CVXOPT using distutils.
-
-The additions are very minor; the directory contains a number of
-files for different numerical types (int, long, single and double
-precision floating point etc.) that would normally be automatically
-generated by the C preprocessor.  
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_global.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_global.c
deleted file mode 100644
index e8c9e8e..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_global.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../SuiteSparse/AMD/Source/amd_global.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_1.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_1.c
deleted file mode 100644
index 4353630..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_1.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_1.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_2.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_2.c
deleted file mode 100644
index 75d8670..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_2.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_2.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_aat.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_aat.c
deleted file mode 100644
index 16042e2..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_aat.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_aat.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_defaults.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_defaults.c
deleted file mode 100644
index 9ec8227..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_defaults.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_defaults.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_dump.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_dump.c
deleted file mode 100644
index ba46149..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_dump.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_dump.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_order.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_order.c
deleted file mode 100644
index 9a396e5..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_order.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_order.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_post_tree.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_post_tree.c
deleted file mode 100644
index bfbf2ce..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_post_tree.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_post_tree.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_postorder.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_postorder.c
deleted file mode 100644
index 6f51bad..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_postorder.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_postorder.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_preprocess.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_preprocess.c
deleted file mode 100644
index b5fb2c3..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_preprocess.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_preprocess.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_valid.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_valid.c
deleted file mode 100644
index 18f02d9..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_i_valid.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/AMD/Source/amd_valid.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_1.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_1.c
deleted file mode 100644
index d5ecba0..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_1.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_1.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_2.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_2.c
deleted file mode 100644
index 5a18aca..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_2.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_2.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_aat.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_aat.c
deleted file mode 100644
index 77f7ac8..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_aat.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_aat.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_defaults.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_defaults.c
deleted file mode 100644
index 5c8c865..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_defaults.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_defaults.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_dump.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_dump.c
deleted file mode 100644
index c598601..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_dump.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_dump.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_order.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_order.c
deleted file mode 100644
index 4003f6d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_order.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_order.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_post_tree.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_post_tree.c
deleted file mode 100644
index cb4851c..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_post_tree.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_post_tree.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_postorder.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_postorder.c
deleted file mode 100644
index db6e9d7..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_postorder.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_postorder.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_preprocess.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_preprocess.c
deleted file mode 100644
index a7c9c30..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_preprocess.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_preprocess.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_valid.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_valid.c
deleted file mode 100644
index 3804def..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/amd_l_valid.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/AMD/Source/amd_valid.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_assemble.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_assemble.c
deleted file mode 100644
index 84212ac..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_assemble.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_assemble.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_assemble_fixq.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_assemble_fixq.c
deleted file mode 100644
index d5eeb60..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_assemble_fixq.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-#define FIXQ
-#include "../../SuiteSparse/UMFPACK/Source/umf_assemble.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_blas3_update.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_blas3_update.c
deleted file mode 100644
index f8dc40d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_blas3_update.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_blas3_update.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_build_tuples.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_build_tuples.c
deleted file mode 100644
index 1b7fcda..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_build_tuples.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_build_tuples.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_create_element.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_create_element.c
deleted file mode 100644
index 026507f..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_create_element.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_create_element.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_extend_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_extend_front.c
deleted file mode 100644
index 97583a0..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_extend_front.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_extend_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_garbage_collection.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_garbage_collection.c
deleted file mode 100644
index 5a8f268..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_garbage_collection.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_garbage_collection.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_get_memory.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_get_memory.c
deleted file mode 100644
index fedad1e..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_get_memory.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_get_memory.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_grow_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_grow_front.c
deleted file mode 100644
index c11fb7a..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_grow_front.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_grow_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_init_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_init_front.c
deleted file mode 100644
index 1952f39..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_init_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_init_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel.c
deleted file mode 100644
index f1837ba..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel_init.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel_init.c
deleted file mode 100644
index 46bf880..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel_init.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel_init.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel_wrapup.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel_wrapup.c
deleted file mode 100644
index a09a080..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_kernel_wrapup.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_lhsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_lhsolve.c
deleted file mode 100644
index 49c9547..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_lhsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-#define CONJUGATE_SOLVE
-#include "../../SuiteSparse/UMFPACK/Source/umf_ltsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_local_search.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_local_search.c
deleted file mode 100644
index fcbbdb8..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_local_search.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_local_search.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_lsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_lsolve.c
deleted file mode 100644
index b6c592f..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_lsolve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_lsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_ltsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_ltsolve.c
deleted file mode 100644
index a4b7882..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_ltsolve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_ltsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_element.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_element.c
deleted file mode 100644
index 044733d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_element.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_head_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_head_block.c
deleted file mode 100644
index 7ff901e..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_head_block.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_tail_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_tail_block.c
deleted file mode 100644
index 32afac8..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_alloc_tail_block.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_free_tail_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_free_tail_block.c
deleted file mode 100644
index e0ac11b..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_free_tail_block.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_init_memoryspace.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_init_memoryspace.c
deleted file mode 100644
index 2faaf74..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_mem_init_memoryspace.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_row_search.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_row_search.c
deleted file mode 100644
index 50e4cab..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_row_search.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_row_search.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_scale.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_scale.c
deleted file mode 100644
index a89fe95..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_scale.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_scale.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_scale_column.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_scale_column.c
deleted file mode 100644
index f86b9f8..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_scale_column.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_scale_column.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_set_stats.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_set_stats.c
deleted file mode 100644
index 339c537..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_set_stats.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_set_stats.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_solve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_solve.c
deleted file mode 100644
index 2a1f680..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_solve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_solve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_start_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_start_front.c
deleted file mode 100644
index 3f6ead3..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_start_front.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_start_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_store_lu.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_store_lu.c
deleted file mode 100644
index b38ea09..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_store_lu.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_store_lu.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_store_lu_drop.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_store_lu_drop.c
deleted file mode 100644
index 7cb0fce..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_store_lu_drop.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-#define DROP
-#include "../../SuiteSparse/UMFPACK/Source/umf_store_lu.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_symbolic_usage.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_symbolic_usage.c
deleted file mode 100644
index 3e72467..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_symbolic_usage.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_symbolic_usage.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_transpose.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_transpose.c
deleted file mode 100644
index 2401dfe..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_transpose.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_transpose.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_tuple_lengths.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_tuple_lengths.c
deleted file mode 100644
index 1f80970..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_tuple_lengths.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_tuple_lengths.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_uhsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_uhsolve.c
deleted file mode 100644
index 441f34f..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_uhsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DINT
-#define CONJUGATE_SOLVE
-#include "../../SuiteSparse/UMFPACK/Source/umf_utsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_usolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_usolve.c
deleted file mode 100644
index c0cd333..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_usolve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_usolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_utsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_utsolve.c
deleted file mode 100644
index 70de72b..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_utsolve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_utsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_valid_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_valid_numeric.c
deleted file mode 100644
index 81ade90..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_valid_numeric.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_valid_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_valid_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_valid_symbolic.c
deleted file mode 100644
index 4b5f446..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_di_valid_symbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_valid_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_assemble.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_assemble.c
deleted file mode 100644
index f49c736..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_assemble.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_assemble.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_assemble_fixq.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_assemble_fixq.c
deleted file mode 100644
index 1796089..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_assemble_fixq.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-#define FIXQ
-#include "../../SuiteSparse/UMFPACK/Source/umf_assemble.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_blas3_update.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_blas3_update.c
deleted file mode 100644
index b73b37d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_blas3_update.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_blas3_update.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_build_tuples.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_build_tuples.c
deleted file mode 100644
index dc8b4fc..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_build_tuples.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_build_tuples.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_create_elememt.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_create_elememt.c
deleted file mode 100644
index dcf93a3..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_create_elememt.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_create_element.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_extend_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_extend_front.c
deleted file mode 100644
index 25e91aa..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_extend_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_extend_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_garbage_collection.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_garbage_collection.c
deleted file mode 100644
index 3cf1c70..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_garbage_collection.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_garbage_collection.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_get_memory.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_get_memory.c
deleted file mode 100644
index 760a8e4..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_get_memory.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_get_memory.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_grow_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_grow_front.c
deleted file mode 100644
index e15ed69..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_grow_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_grow_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_init_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_init_front.c
deleted file mode 100644
index 5a13725..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_init_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_init_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel.c
deleted file mode 100644
index 83b565f..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel_init.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel_init.c
deleted file mode 100644
index a20b9c0..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel_init.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel_init.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel_wrapup.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel_wrapup.c
deleted file mode 100644
index ab63c41..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_kernel_wrapup.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_lhsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_lhsolve.c
deleted file mode 100644
index 135efdd..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_lhsolve.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#define DLONG
-
-#define CONJUGATE_SOLVE
-#include "../../SuiteSparse/UMFPACK/Source/umf_ltsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_local_search.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_local_search.c
deleted file mode 100644
index cd14206..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_local_search.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_local_search.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_lsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_lsolve.c
deleted file mode 100644
index a3a912c..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_lsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_lsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_ltsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_ltsolve.c
deleted file mode 100644
index 3a40f06..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_ltsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_ltsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_element.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_element.c
deleted file mode 100644
index 4557361..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_element.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_head_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_head_block.c
deleted file mode 100644
index 7553478..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_head_block.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_tail_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_tail_block.c
deleted file mode 100644
index 00e7617..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_alloc_tail_block.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_free_tail_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_free_tail_block.c
deleted file mode 100644
index cce27ae..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_free_tail_block.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_init_memoryspace.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_init_memoryspace.c
deleted file mode 100644
index db0ce68..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_mem_init_memoryspace.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_row_search.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_row_search.c
deleted file mode 100644
index ca116ac..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_row_search.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_row_search.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_scale.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_scale.c
deleted file mode 100644
index 3843545..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_scale.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_scale.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_scale_column.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_scale_column.c
deleted file mode 100644
index 3fc1fa7..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_scale_column.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_scale_column.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_set_stats.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_set_stats.c
deleted file mode 100644
index b79cd00..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_set_stats.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_set_stats.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_solve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_solve.c
deleted file mode 100644
index 58ec5e6..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_solve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_solve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_start_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_start_front.c
deleted file mode 100644
index 9724290..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_start_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_start_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_store_lu.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_store_lu.c
deleted file mode 100644
index cf7d91e..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_store_lu.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_store_lu.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_store_lu_drop.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_store_lu_drop.c
deleted file mode 100644
index de8fcfc..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_store_lu_drop.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-#define DROP
-#include "../../SuiteSparse/UMFPACK/Source/umf_store_lu.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_symbolic_usage.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_symbolic_usage.c
deleted file mode 100644
index e86dba6..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_symbolic_usage.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_symbolic_usage.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_transpose.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_transpose.c
deleted file mode 100644
index 4283da4..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_transpose.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_transpose.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_tuple_lengths.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_tuple_lengths.c
deleted file mode 100644
index 0c15b26..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_tuple_lengths.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_tuple_lengths.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_uhsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_uhsolve.c
deleted file mode 100644
index c966c08..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_uhsolve.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#define DLONG
-
-#define CONJUGATE_SOLVE
-#include "../../SuiteSparse/UMFPACK/Source/umf_utsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_usolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_usolve.c
deleted file mode 100644
index e17eb16..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_usolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_usolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_utsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_utsolve.c
deleted file mode 100644
index a9c3e99..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_utsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_utsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_valid_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_valid_numeric.c
deleted file mode 100644
index 55cc2f7..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_valid_numeric.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_valid_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_valid_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_valid_symbolic.c
deleted file mode 100644
index 0979643..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_dl_valid_symbolic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_valid_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_analyze.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_analyze.c
deleted file mode 100644
index 76e3f5d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_analyze.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_analyze.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_apply_order.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_apply_order.c
deleted file mode 100644
index 3d2ad76..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_apply_order.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_apply_order.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_cholmod.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_cholmod.c
deleted file mode 100644
index 3a95dc3..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_cholmod.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_cholmod.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_colamd.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_colamd.c
deleted file mode 100644
index aa018f1..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_colamd.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_colamd.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_free.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_free.c
deleted file mode 100644
index 0600fb5..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_free.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_free.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_fsize.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_fsize.c
deleted file mode 100644
index 27191c0..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_fsize.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_fsize.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_is_permutation.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_is_permutation.c
deleted file mode 100644
index c874291..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_is_permutation.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_is_permutation.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_malloc.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_malloc.c
deleted file mode 100644
index b9026e3..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_malloc.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_malloc.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_realloc.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_realloc.c
deleted file mode 100644
index 1f32b99..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_realloc.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_realloc.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_singletons.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_singletons.c
deleted file mode 100644
index 57c713d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_i_singletons.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_singletons.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_analyze.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_analyze.c
deleted file mode 100644
index df42f24..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_analyze.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_analyze.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_apply_order.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_apply_order.c
deleted file mode 100644
index 91a3027..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_apply_order.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DLONG
-#include "../../SuiteSparse/UMFPACK/Source/umf_apply_order.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_cholmod.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_cholmod.c
deleted file mode 100644
index e2cb0ec..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_cholmod.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_cholmod.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_colamd.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_colamd.c
deleted file mode 100644
index a974488..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_colamd.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_colamd.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_free.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_free.c
deleted file mode 100644
index 7ce0a3a..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_free.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_free.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_fsize.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_fsize.c
deleted file mode 100644
index 359c9b3..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_fsize.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_fsize.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_is_permutation.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_is_permutation.c
deleted file mode 100644
index bc2846c..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_is_permutation.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_is_permutation.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_malloc.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_malloc.c
deleted file mode 100644
index bfc2e26..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_malloc.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_malloc.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_realloc.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_realloc.c
deleted file mode 100644
index 410060f..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_realloc.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_realloc.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_singletons.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_singletons.c
deleted file mode 100644
index c991f08..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_l_singletons.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_singletons.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_assemble.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_assemble.c
deleted file mode 100644
index d1717bd..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_assemble.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_assemble.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_assemble_fixq.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_assemble_fixq.c
deleted file mode 100644
index 9eeccc1..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_assemble_fixq.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZINT
-#define FIXQ
-#include "../../SuiteSparse/UMFPACK/Source/umf_assemble.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_blas3_update.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_blas3_update.c
deleted file mode 100644
index 297ed18..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_blas3_update.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_blas3_update.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_build_tuples.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_build_tuples.c
deleted file mode 100644
index c22f9c6..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_build_tuples.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_build_tuples.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_create_element.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_create_element.c
deleted file mode 100644
index 12be344..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_create_element.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_create_element.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_extend_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_extend_front.c
deleted file mode 100644
index 92eb622..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_extend_front.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_extend_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_garbage_collection.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_garbage_collection.c
deleted file mode 100644
index 98f9cf7..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_garbage_collection.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_garbage_collection.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_get_memory.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_get_memory.c
deleted file mode 100644
index d3a35d9..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_get_memory.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_get_memory.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_grow_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_grow_front.c
deleted file mode 100644
index e5c10f2..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_grow_front.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_grow_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_init_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_init_front.c
deleted file mode 100644
index b90e7fe..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_init_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZINT
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_init_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel.c
deleted file mode 100644
index dbdfde4..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel_init.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel_init.c
deleted file mode 100644
index 3c55c35..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel_init.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel_init.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel_wrapup.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel_wrapup.c
deleted file mode 100644
index 0dae817..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_kernel_wrapup.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_lhsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_lhsolve.c
deleted file mode 100644
index 1cdbad9..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_lhsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZINT
-#define CONJUGATE_SOLVE
-#include "../../SuiteSparse/UMFPACK/Source/umf_ltsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_local_search.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_local_search.c
deleted file mode 100644
index 751cf5c..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_local_search.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_local_search.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_lsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_lsolve.c
deleted file mode 100644
index 9260f15..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_lsolve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_lsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_ltsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_ltsolve.c
deleted file mode 100644
index 6a19361..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_ltsolve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_ltsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_element.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_element.c
deleted file mode 100644
index b4e411f..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_element.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_head_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_head_block.c
deleted file mode 100644
index 180a21a..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_head_block.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_tail_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_tail_block.c
deleted file mode 100644
index b00850a..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_alloc_tail_block.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_free_tail_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_free_tail_block.c
deleted file mode 100644
index 1579e4e..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_free_tail_block.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_init_memoryspace.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_init_memoryspace.c
deleted file mode 100644
index 5b8cbbb..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_mem_init_memoryspace.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_row_search.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_row_search.c
deleted file mode 100644
index 82218a9..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_row_search.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_row_search.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_scale.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_scale.c
deleted file mode 100644
index 0f24eaa..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_scale.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_scale.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_scale_column.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_scale_column.c
deleted file mode 100644
index dd71747..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_scale_column.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_scale_column.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_set_stats.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_set_stats.c
deleted file mode 100644
index b2fccdd..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_set_stats.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_set_stats.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_solve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_solve.c
deleted file mode 100644
index 05774ed..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_solve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_solve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_start_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_start_front.c
deleted file mode 100644
index 578992d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_start_front.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_start_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_store_lu.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_store_lu.c
deleted file mode 100644
index 2d5f40d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_store_lu.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_store_lu.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_store_lu_drop.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_store_lu_drop.c
deleted file mode 100644
index 123ec11..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_store_lu_drop.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZINT
-#define DROP
-#include "../../SuiteSparse/UMFPACK/Source/umf_store_lu.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_symbolic_usage.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_symbolic_usage.c
deleted file mode 100644
index 3b7bc05..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_symbolic_usage.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_symbolic_usage.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_transpose.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_transpose.c
deleted file mode 100644
index 152e783..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_transpose.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_transpose.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_tuple_lengths.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_tuple_lengths.c
deleted file mode 100644
index 3a23016..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_tuple_lengths.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_tuple_lengths.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_uhsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_uhsolve.c
deleted file mode 100644
index e6d78d8..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_uhsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZINT
-#define CONJUGATE_SOLVE
-#include "../../SuiteSparse/UMFPACK/Source/umf_utsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_usolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_usolve.c
deleted file mode 100644
index 3aa1c43..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_usolve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_usolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_utsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_utsolve.c
deleted file mode 100644
index 56c47b5..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_utsolve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_utsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_valid_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_valid_numeric.c
deleted file mode 100644
index 206be5b..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_valid_numeric.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_valid_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_valid_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_valid_symbolic.c
deleted file mode 100644
index d3aa54d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zi_valid_symbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umf_valid_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_assemble.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_assemble.c
deleted file mode 100644
index c5f9f0f..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_assemble.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_assemble.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_assemble_fixq.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_assemble_fixq.c
deleted file mode 100644
index b94d2da..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_assemble_fixq.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-#define FIXQ
-#include "../../SuiteSparse/UMFPACK/Source/umf_assemble.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_blas3_update.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_blas3_update.c
deleted file mode 100644
index d7827ab..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_blas3_update.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_blas3_update.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_build_tuples.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_build_tuples.c
deleted file mode 100644
index 00845e4..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_build_tuples.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_build_tuples.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_create_elememt.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_create_elememt.c
deleted file mode 100644
index ffd7567..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_create_elememt.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_create_element.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_extend_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_extend_front.c
deleted file mode 100644
index b149b7d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_extend_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_extend_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_garbage_collection.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_garbage_collection.c
deleted file mode 100644
index b7edc57..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_garbage_collection.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_garbage_collection.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_get_memory.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_get_memory.c
deleted file mode 100644
index eff5a54..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_get_memory.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_get_memory.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_grow_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_grow_front.c
deleted file mode 100644
index 52a23f8..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_grow_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_grow_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_init_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_init_front.c
deleted file mode 100644
index 902f850..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_init_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_init_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel.c
deleted file mode 100644
index 3387f55..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel_init.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel_init.c
deleted file mode 100644
index eeee308..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel_init.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel_init.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel_wrapup.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel_wrapup.c
deleted file mode 100644
index 5a2cdd4..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_kernel_wrapup.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_kernel_wrapup.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_lhsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_lhsolve.c
deleted file mode 100644
index fa34f01..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_lhsolve.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#define ZLONG
-
-#define CONJUGATE_SOLVE
-#include "../../SuiteSparse/UMFPACK/Source/umf_ltsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_local_search.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_local_search.c
deleted file mode 100644
index 8f89985..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_local_search.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_local_search.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_lsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_lsolve.c
deleted file mode 100644
index 59ea2a8..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_lsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_lsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_ltsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_ltsolve.c
deleted file mode 100644
index 39a4a88..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_ltsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_ltsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_element.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_element.c
deleted file mode 100644
index 96c27a2..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_element.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_element.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_head_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_head_block.c
deleted file mode 100644
index 1683bb6..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_head_block.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_head_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_tail_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_tail_block.c
deleted file mode 100644
index d85c8a5..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_alloc_tail_block.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_alloc_tail_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_free_tail_block.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_free_tail_block.c
deleted file mode 100644
index 65fd652..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_free_tail_block.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_free_tail_block.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_init_memoryspace.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_init_memoryspace.c
deleted file mode 100644
index e535032..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_mem_init_memoryspace.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_mem_init_memoryspace.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_row_search.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_row_search.c
deleted file mode 100644
index ed44055..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_row_search.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_row_search.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_scale.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_scale.c
deleted file mode 100644
index af82c54..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_scale.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_scale.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_scale_column.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_scale_column.c
deleted file mode 100644
index a6097d1..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_scale_column.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_scale_column.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_set_stats.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_set_stats.c
deleted file mode 100644
index 80af787..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_set_stats.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_set_stats.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_solve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_solve.c
deleted file mode 100644
index 76a3c0f..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_solve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_solve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_start_front.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_start_front.c
deleted file mode 100644
index f0e4a41..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_start_front.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_start_front.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_store_lu.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_store_lu.c
deleted file mode 100644
index b5b9c27..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_store_lu.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_store_lu.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_store_lu_drop.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_store_lu_drop.c
deleted file mode 100644
index b817454..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_store_lu_drop.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-#define DROP
-#include "../../SuiteSparse/UMFPACK/Source/umf_store_lu.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_symbolic_usage.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_symbolic_usage.c
deleted file mode 100644
index fe745bb..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_symbolic_usage.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_symbolic_usage.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_transpose.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_transpose.c
deleted file mode 100644
index a8cf3ed..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_transpose.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_transpose.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_tuple_lengths.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_tuple_lengths.c
deleted file mode 100644
index 3c21f97..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_tuple_lengths.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_tuple_lengths.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_uhsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_uhsolve.c
deleted file mode 100644
index e5eb0ad..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_uhsolve.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#define ZLONG
-
-#define CONJUGATE_SOLVE
-#include "../../SuiteSparse/UMFPACK/Source/umf_utsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_usolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_usolve.c
deleted file mode 100644
index 2cca779..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_usolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_usolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_utsolve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_utsolve.c
deleted file mode 100644
index 4794601..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_utsolve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_utsolve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_valid_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_valid_numeric.c
deleted file mode 100644
index 5c220b0..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_valid_numeric.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_valid_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_valid_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_valid_symbolic.c
deleted file mode 100644
index d286f11..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umf_zl_valid_symbolic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umf_valid_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_free_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_free_numeric.c
deleted file mode 100644
index 7a28cf4..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_free_numeric.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_free_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_free_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_free_symbolic.c
deleted file mode 100644
index 207c715..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_free_symbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_free_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_numeric.c
deleted file mode 100644
index 63dcda5..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_numeric.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_qsymbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_qsymbolic.c
deleted file mode 100644
index 7039606..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_qsymbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_qsymbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_solve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_solve.c
deleted file mode 100644
index bb764dc..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_solve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_solve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_symbolic.c
deleted file mode 100644
index 3d947c0..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_di_symbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_free_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_free_numeric.c
deleted file mode 100644
index 20ed153..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_free_numeric.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_free_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_free_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_free_symbolic.c
deleted file mode 100644
index 0b108a1..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_free_symbolic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_free_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_numeric.c
deleted file mode 100644
index 0d1e3aa..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_numeric.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_qsymbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_qsymbolic.c
deleted file mode 100644
index 946c59e..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_qsymbolic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_qsymbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_solve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_solve.c
deleted file mode 100644
index 137d9f1..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_solve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define DLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_solve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_symbolic.c
deleted file mode 100644
index 464d39d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_dl_symbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DLONG
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_free_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_free_numeric.c
deleted file mode 100644
index bd507da..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_free_numeric.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_free_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_free_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_free_symbolic.c
deleted file mode 100644
index 9c4cdb5..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_free_symbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_free_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_numeric.c
deleted file mode 100644
index 364afe7..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_numeric.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_qsymbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_qsymbolic.c
deleted file mode 100644
index d748f9d..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_qsymbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_qsymbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_solve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_solve.c
deleted file mode 100644
index de050f7..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_solve.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_solve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_symbolic.c
deleted file mode 100644
index 559c7d1..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zi_symbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZINT
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_free_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_free_numeric.c
deleted file mode 100644
index 2c9bb10..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_free_numeric.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_free_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_free_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_free_symbolic.c
deleted file mode 100644
index 8f30367..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_free_symbolic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_free_symbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_numeric.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_numeric.c
deleted file mode 100644
index da89bc8..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_numeric.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_numeric.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_qsymbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_qsymbolic.c
deleted file mode 100644
index a630f6c..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_qsymbolic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_qsymbolic.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_solve.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_solve.c
deleted file mode 100644
index 1c23ab1..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_solve.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#define ZLONG
-
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_solve.c"
diff --git a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_symbolic.c b/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_symbolic.c
deleted file mode 100644
index 0f23a02..0000000
--- a/src/C/SuiteSparse_cvxopt_extra/umfpack/umfpack_zl_symbolic.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define ZLONG
-#include "../../SuiteSparse/UMFPACK/Source/umfpack_symbolic.c"

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/cvxopt.git



More information about the debian-science-commits mailing list