[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, ¶ms, 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 */
- ¶ms,
- 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