From 2598ca4666f9923e58c56ebbe5c505680c152d70 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 25 Mar 2024 10:42:46 -0500 Subject: [PATCH 1/2] SPEX 3.1.0; see also SuiteSparse 7.7.0 --- .gitattributes | 2 + .github/ISSUE_TEMPLATE/bug_report.md | 28 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/dependabot.yml | 8 + .github/pull_request_template.md | 1 + .github/workflows/build-arch-emu.yaml | 245 +++ .github/workflows/build.yaml | 520 ++++++ .github/workflows/codeql-analysis.yaml | 204 +++ .github/workflows/macos.yaml | 159 ++ .github/workflows/root-cmakelists.yaml | 570 ++++++ .gitignore | 4 + AMD/CMakeLists.txt | 259 ++- AMD/Config/AMD.pc.in | 17 + AMD/Config/AMDConfig.cmake.in | 152 ++ AMD/Config/amd.h.in | 24 +- AMD/Demo/amd_demo.c | 15 +- AMD/Demo/amd_demo.out | 6 +- AMD/Demo/amd_demo2.out | 4 +- AMD/Demo/amd_l_demo.c | 15 +- AMD/Demo/amd_l_demo.out | 6 +- AMD/Doc/AMD_UserGuide.pdf | Bin 237985 -> 238498 bytes AMD/Doc/AMD_UserGuide.tex | 18 +- AMD/Doc/ChangeLog | 26 + AMD/Doc/amd_version.tex | 2 +- AMD/Include/amd.h | 30 +- AMD/Include/amd_internal.h | 9 +- AMD/Makefile | 34 +- AMD/Source/amd_order.c | 17 +- AMD/Source/amd_version.c | 19 + AMD/cmake_modules/FindAMD.cmake | 129 -- CITATION.bib | 91 + COLAMD/CMakeLists.txt | 224 ++- COLAMD/Config/COLAMD.pc.in | 17 + COLAMD/Config/COLAMDConfig.cmake.in | 152 ++ COLAMD/Config/colamd.h.in | 27 +- COLAMD/Demo/colamd_example.c | 15 + COLAMD/Demo/colamd_example.out | 5 +- COLAMD/Demo/colamd_l_example.c | 15 + COLAMD/Demo/colamd_l_example.out | 5 +- COLAMD/Doc/ChangeLog | 29 + COLAMD/Include/colamd.h | 31 +- COLAMD/Makefile | 20 +- COLAMD/Source/colamd.c | 1 - COLAMD/Source/colamd_version.c | 19 + COLAMD/cmake_modules/FindCOLAMD.cmake | 129 -- CONTRIBUTING.md | 18 + CONTRIBUTOR-LICENSE.txt | 177 ++ LICENSE.txt | 113 ++ Makefile | 17 +- README.md | 174 +- SPEX/CMakeLists.txt | 582 ++++-- SPEX/Config/SPEX.h.in | 140 +- SPEX/Config/SPEX.pc.in | 18 + SPEX/Config/SPEXConfig.cmake.in | 190 ++ SPEX/Config/Tcov_Makefile.in | 69 +- SPEX/Config/spex_deps.m.in | 10 +- .../Demo/Utilities/spex_demo_check_solution.c | 88 +- .../Utilities/spex_demo_determine_error.c | 24 +- .../spex_demo_process_command_line.c | 4 +- SPEX/Demo/Utilities/spex_demo_read_dense.c | 4 +- SPEX/Demo/Utilities/spex_demo_tripread.c | 13 +- SPEX/Demo/spex_demo_backslash.c | 76 +- SPEX/Demo/spex_demo_cholesky_extended.c | 95 +- SPEX/Demo/spex_demo_cholesky_simple.c | 115 +- SPEX/Demo/spex_demo_lu_doub.c | 184 +- SPEX/Demo/spex_demo_lu_extended.c | 157 +- SPEX/Demo/spex_demo_lu_simple1.c | 69 +- SPEX/Demo/spex_demo_lu_simple2.c | 74 +- SPEX/Demo/spex_demo_threaded.c | 68 +- SPEX/Demo/spex_demos.h | 56 +- SPEX/Doc/ChangeLog | 16 + SPEX/Doc/Makefile | 4 +- SPEX/Doc/SPEX-3.0_UserGuide.pdf | Bin 416827 -> 0 bytes SPEX/Doc/SPEX-3.0_User_Guide.pdf | Bin 424711 -> 0 bytes SPEX/Doc/SPEX_UserGuide.pdf | Bin 0 -> 386707 bytes ...X-3.0_UserGuide.tex => SPEX_UserGuide.tex} | 96 +- SPEX/Doc/SPEX_version.tex | 2 +- SPEX/Include/SPEX.h | 534 ++---- SPEX/LICENSE.txt | 4 +- SPEX/MATLAB/Source/SPEX_mex.h | 4 +- SPEX/MATLAB/Source/spex_mex_check_for_inf.c | 4 +- SPEX/MATLAB/Source/spex_mex_error.c | 4 +- SPEX/MATLAB/Source/spex_mex_get_A_and_b.c | 4 +- .../Source/spex_mex_get_matlab_options.c | 4 +- SPEX/MATLAB/spex_backslash.m | 4 +- SPEX/MATLAB/spex_backslash_mex_soln.c | 4 +- SPEX/MATLAB/spex_cholesky_backslash.m | 4 +- SPEX/MATLAB/spex_cholesky_mex_soln.c | 4 +- SPEX/MATLAB/spex_lu_backslash.m | 4 +- SPEX/MATLAB/spex_lu_mex_soln.c | 4 +- SPEX/MATLAB/spex_mex_demo.m | 4 +- SPEX/MATLAB/spex_mex_install.m | 38 +- SPEX/MATLAB/spex_mex_test.m | 6 +- SPEX/Makefile | 21 +- SPEX/Python/SPEXpy/Options.py | 4 +- SPEX/Python/SPEXpy/SPEX_error.py | 4 +- .../SPEXpy/Source/spex_python_connect.c | 4 +- .../SPEXpy/Source/spex_python_connect.h | 4 +- SPEX/Python/SPEXpy/__init__.py | 4 +- SPEX/Python/SPEXpy/backslash.py | 4 +- SPEX/Python/SPEXpy/cholesky_backslash.py | 4 +- SPEX/Python/SPEXpy/lu_backslash.py | 4 +- SPEX/Python/SPEXpy/spex_connect.py | 4 +- SPEX/Python/SPEXpy/spex_matrix_from_file.py | 4 +- SPEX/Python/spex_python_demo.py | 4 +- SPEX/SPEX_Backslash/License/license.txt | 4 +- SPEX/SPEX_Backslash/Source/SPEX_backslash.c | 4 +- SPEX/SPEX_Cholesky/License/license.txt | 4 +- .../Source/SPEX_cholesky_analyze.c | 4 +- .../Source/SPEX_cholesky_backslash.c | 4 +- .../Source/SPEX_cholesky_factorize.c | 4 +- .../Source/SPEX_cholesky_solve.c | 4 +- .../Source/spex_cholesky_backward_sub.c | 4 +- .../Source/spex_cholesky_counts.c | 4 +- .../Source/spex_cholesky_ereach.c | 4 +- .../Source/spex_cholesky_etree.c | 4 +- .../Source/spex_cholesky_factor.c | 6 +- .../Source/spex_cholesky_forward_sub.c | 4 +- .../Source/spex_cholesky_internal.h | 4 +- .../SPEX_Cholesky/Source/spex_cholesky_leaf.c | 4 +- .../Source/spex_cholesky_left_factor.c | 4 +- .../spex_cholesky_left_triangular_solve.c | 12 +- .../Source/spex_cholesky_permute_A.c | 4 +- .../SPEX_Cholesky/Source/spex_cholesky_post.c | 4 +- .../Source/spex_cholesky_pre_left_factor.c | 4 +- .../Source/spex_cholesky_preorder.c | 4 +- .../Source/spex_cholesky_symbolic_analysis.c | 6 +- .../SPEX_Cholesky/Source/spex_cholesky_tdfs.c | 4 +- .../Source/spex_cholesky_up_factor.c | 8 +- .../spex_cholesky_up_triangular_solve.c | 38 +- SPEX/SPEX_LU/License/license.txt | 4 +- SPEX/SPEX_LU/Source/SPEX_lu_analyze.c | 4 +- SPEX/SPEX_LU/Source/SPEX_lu_backslash.c | 4 +- SPEX/SPEX_LU/Source/SPEX_lu_factorize.c | 4 +- SPEX/SPEX_LU/Source/SPEX_lu_solve.c | 4 +- SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c | 4 +- SPEX/SPEX_LU/Source/spex_left_lu_dfs.c | 4 +- .../SPEX_LU/Source/spex_left_lu_forward_sub.c | 4 +- .../Source/spex_left_lu_get_largest_pivot.c | 8 +- .../Source/spex_left_lu_get_nonzero_pivot.c | 4 +- SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c | 12 +- .../Source/spex_left_lu_get_smallest_pivot.c | 8 +- SPEX/SPEX_LU/Source/spex_left_lu_reach.c | 4 +- .../spex_left_lu_ref_triangular_solve.c | 10 +- SPEX/SPEX_LU/Source/spex_lu_internal.h | 4 +- SPEX/SPEX_Utilities/License/license.txt | 4 +- SPEX/SPEX_Utilities/Source/SPEX_calloc.c | 4 +- .../Source/SPEX_create_default_options.c | 4 +- .../Source/SPEX_determine_symmetry.c | 4 +- .../Source/SPEX_factorization_free.c | 6 +- SPEX/SPEX_Utilities/Source/SPEX_finalize.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_free.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 166 +- SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 13 +- .../Source/SPEX_initialize_expert.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_malloc.c | 4 +- .../Source/SPEX_matrix_allocate.c | 17 +- .../SPEX_Utilities/Source/SPEX_matrix_check.c | 22 +- SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 95 +- SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c | 6 +- SPEX/SPEX_Utilities/Source/SPEX_realloc.c | 4 +- .../Source/SPEX_symbolic_analysis_free.c | 4 +- .../Source/SPEX_thread_finalize.c | 4 +- .../Source/SPEX_thread_initialize.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_transpose.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_version.c | 4 +- SPEX/SPEX_Utilities/Source/spex_amd.c | 4 +- SPEX/SPEX_Utilities/Source/spex_cast_array.c | 11 +- SPEX/SPEX_Utilities/Source/spex_cast_matrix.c | 4 +- SPEX/SPEX_Utilities/Source/spex_colamd.c | 4 +- .../Source/spex_create_mpfr_array.c | 12 +- SPEX/SPEX_Utilities/Source/spex_create_mpq.c | 37 - .../Source/spex_create_mpq_array.c | 12 +- .../Source/spex_create_mpz_array.c | 17 +- SPEX/SPEX_Utilities/Source/spex_cumsum.c | 4 +- .../Source/spex_expand_double_array.c | 14 +- .../Source/spex_expand_mpfr_array.c | 32 +- .../Source/spex_expand_mpq_array.c | 8 +- .../Source/spex_free_mpfr_array.c | 50 + .../Source/spex_free_mpq_array.c | 50 + .../Source/spex_free_mpz_array.c | 50 + SPEX/SPEX_Utilities/Source/spex_gmp.h | 101 +- SPEX/SPEX_Utilities/Source/spex_matrix_mul.c | 4 +- .../Source/spex_permute_dense_matrix.c | 4 +- .../Source/spex_sparse_collapse.c | 4 +- .../Source/spex_sparse_realloc.c | 4 +- .../Source/spex_util_internal.h | 206 ++- SPEX/Tcov/.gitignore | 25 +- SPEX/Tcov/Mats4Tcov/SPEX_Update/.gitignore | 2 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat1.txt | 15 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat10.txt | 36 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat11.txt | 1336 -------------- SPEX/Tcov/Mats4Tcov/SPEX_Update/mat12.txt | 12 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat13.txt | 17 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat14.txt | 14 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat15.txt | 17 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat16.txt | 11 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat17.txt | 23 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat18.txt | 20 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat19.txt | 43 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat2.txt | 28 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat20.txt | 40 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat21.txt | 80 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat22.txt | 19 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat23.txt | 7 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat24.txt | 9 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat25.txt | 43 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat26.txt | 9 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat3.txt | 248 --- SPEX/Tcov/Mats4Tcov/SPEX_Update/mat4.txt | 9 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat5.txt | 7 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat6.txt | 15 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat7.txt | 11 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat8.txt | 15 - SPEX/Tcov/Mats4Tcov/SPEX_Update/mat9.txt | 27 - SPEX/Tcov/simple_rand.c | 4 +- SPEX/Tcov/simple_rand.h | 4 +- SPEX/Tcov/tcov_for_cholesky.c | 55 +- SPEX/Tcov/tcov_for_lu.c | 9 +- SPEX/Tcov/tcov_for_lu2.c | 29 +- SPEX/Tcov/tcov_for_other.c | 104 ++ SPEX/Tcov/tcov_utilities.c | 16 +- SPEX/Tcov/tcov_utilities.h | 4 +- SPEX/cmake_modules/FindGMP.cmake | 4 +- SPEX/cmake_modules/FindMPFR.cmake | 4 +- SPEX/cmake_modules/FindSPEX.cmake | 114 -- SuiteSparse_config/CMakeLists.txt | 302 +++- SuiteSparse_config/Config/README.md.in | 1574 +++++++++++------ .../Config/SuiteSparse_config.h.in | 1006 ++++++++++- .../Config/SuiteSparse_config.pc.in | 16 + .../Config/SuiteSparse_configConfig.cmake.in | 171 ++ SuiteSparse_config/Makefile | 14 +- SuiteSparse_config/README.txt | 2 +- SuiteSparse_config/SuiteSparse_config.c | 9 +- SuiteSparse_config/SuiteSparse_config.h | 1010 ++++++++++- .../FindSuiteSparse_config.cmake | 141 -- .../cmake_modules/SuiteSparseBLAS.cmake | 62 +- .../cmake_modules/SuiteSparseBLAS64.cmake | 6 +- .../cmake_modules/SuiteSparseLAPACK.cmake | 15 +- .../cmake_modules/SuiteSparsePolicy.cmake | 313 ++-- .../cmake_modules/SuiteSparseReport.cmake | 29 +- .../cmake_modules/SuiteSparse__thread.cmake | 8 +- .../cmake_modules/SuiteSparse_ssize_t.cmake | 32 - 244 files changed, 9499 insertions(+), 5616 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/dependabot.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/build-arch-emu.yaml create mode 100644 .github/workflows/build.yaml create mode 100644 .github/workflows/codeql-analysis.yaml create mode 100644 .github/workflows/macos.yaml create mode 100644 .github/workflows/root-cmakelists.yaml create mode 100644 AMD/Config/AMD.pc.in create mode 100644 AMD/Config/AMDConfig.cmake.in create mode 100644 AMD/Source/amd_version.c delete mode 100644 AMD/cmake_modules/FindAMD.cmake create mode 100644 CITATION.bib create mode 100644 COLAMD/Config/COLAMD.pc.in create mode 100644 COLAMD/Config/COLAMDConfig.cmake.in create mode 100644 COLAMD/Source/colamd_version.c delete mode 100644 COLAMD/cmake_modules/FindCOLAMD.cmake create mode 100644 CONTRIBUTING.md create mode 100644 CONTRIBUTOR-LICENSE.txt create mode 100644 LICENSE.txt create mode 100644 SPEX/Config/SPEX.pc.in create mode 100644 SPEX/Config/SPEXConfig.cmake.in delete mode 100644 SPEX/Doc/SPEX-3.0_UserGuide.pdf delete mode 100644 SPEX/Doc/SPEX-3.0_User_Guide.pdf create mode 100644 SPEX/Doc/SPEX_UserGuide.pdf rename SPEX/Doc/{SPEX-3.0_UserGuide.tex => SPEX_UserGuide.tex} (97%) delete mode 100644 SPEX/SPEX_Utilities/Source/spex_create_mpq.c create mode 100644 SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c create mode 100644 SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c create mode 100644 SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/.gitignore delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat1.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat10.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat11.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat12.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat13.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat14.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat15.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat16.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat17.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat18.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat19.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat2.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat20.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat21.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat22.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat23.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat24.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat25.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat26.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat3.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat4.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat5.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat6.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat7.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat8.txt delete mode 100644 SPEX/Tcov/Mats4Tcov/SPEX_Update/mat9.txt create mode 100644 SPEX/Tcov/tcov_for_other.c delete mode 100644 SPEX/cmake_modules/FindSPEX.cmake create mode 100644 SuiteSparse_config/Config/SuiteSparse_config.pc.in create mode 100644 SuiteSparse_config/Config/SuiteSparse_configConfig.cmake.in delete mode 100644 SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake delete mode 100644 SuiteSparse_config/cmake_modules/SuiteSparse_ssize_t.cmake diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..49e7a27f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# line endings in repository match line endings on disc +* -text diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dfde282e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,28 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - compiler [e.g. gcc 7.4, icc 19.0] + - BLAS and LAPACK library, if applicable + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..df4d15b3 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + # Check for updates to GitHub Actions every week + interval: "weekly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..94813bcc --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1 @@ +No pull request can be accepted unless you first sign the Contributor License Agreement [ CONTRIBUTOR-LICENSE.txt ]. Print it as a PDF and email me a signed PDF (digital signature OK). Submit all PRs to the dev2 branch only. diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml new file mode 100644 index 00000000..5ff0ec40 --- /dev/null +++ b/.github/workflows/build-arch-emu.yaml @@ -0,0 +1,245 @@ +name: arch-emu +on: + workflow_dispatch: + push: + branches-ignore: + - '**/dev2' + - '**/*dev2' + pull_request: + +concurrency: ci-arch-emu-${{ github.ref }} + +env: + # string with name of libraries to be built + BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + # string with name of libraries to be checked + CHECK_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + # string with name of libraries that are installed + INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + + +jobs: + + alpine: + runs-on: ubuntu-latest + + defaults: + run: + # Use emulated shell as default + shell: alpine.sh {0} + + strategy: + # Allow other runners in the matrix to continue if some fail + fail-fast: false + + matrix: + # For available CPU architectures, see: + # https://github.com/marketplace/actions/setup-alpine-linux-environment + arch: [x86, aarch64, armv7, ppc64le, s390x] + include: + - arch: x86 + ccache-max: 80M + - arch: aarch64 + ccache-max: 42M + - arch: armv7 + ccache-max: 42M + - arch: ppc64le + ccache-max: 45M + - arch: s390x + ccache-max: 42M + + name: alpine (${{ matrix.arch }}) + + steps: + - name: get CPU information (host) + shell: bash + run: lscpu + + - name: checkout repository + uses: actions/checkout@v4 + # shell: bash + + - name: install dependencies + uses: jirutka/setup-alpine@v1 + # shell: bash + with: + arch: ${{ matrix.arch }} + packages: > + build-base + ccache + cmake + gfortran + m4 + gmp-dev + mpfr-dev + lapack-dev + python3 + valgrind + util-linux-misc + autoconf + automake + libtool + + - name: get CPU information (emulated) + run: lscpu + + - name: prepare ccache + # create key with human readable timestamp + # used in action/cache/restore and action/cache/save steps + id: ccache-prepare + run: | + echo "key=ccache:alpine:${{ matrix.arch }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT + + - name: restore ccache + # setup the GitHub cache used to maintain the ccache from one job to the next + uses: actions/cache/restore@v4 + with: + # location of the ccache of the chroot in the root file system + path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache + key: ${{ steps.ccache-prepare.outputs.key }} + # Prefer caches from the same branch. Fall back to caches from the dev branch. + restore-keys: | + ccache:alpine:${{ matrix.arch }}:${{ github.ref }} + ccache:alpine:${{ matrix.arch }} + + - name: configure ccache + env: + CCACHE_MAX: ${{ matrix.ccache-max }} + run: | + test -d ~/.ccache || mkdir ~/.ccache + echo "max_size = $CCACHE_MAX" >> ~/.ccache/ccache.conf + echo "compression = true" >> ~/.ccache/ccache.conf + ccache -s + which ccache + # echo "/usr/lib/ccache" >> $GITHUB_PATH + + - name: build + run: | + echo "gcc --version" + gcc --version + echo "gcc -dumpmachine" + gcc -dumpmachine + IFS=: + BUILD_LIBS="${BUILD_LIBS}${{ matrix.extra-build-libs }}" + for lib in ${BUILD_LIBS}; do + printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" + echo "::group::Configure $lib" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ + -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ + -DBUILD_SHARED_LIBS=ON \ + -DBUILD_STATIC_LIBS=OFF \ + -DBLA_VENDOR="Generic" \ + -DGRAPHBLAS_COMPACT=ON \ + -DSUITESPARSE_DEMOS=OFF \ + -DBUILD_TESTING=OFF \ + .. + echo "::endgroup::" + echo "::group::Build $lib" + cmake --build . --config Release + echo "::endgroup::" + done + + - name: check + timeout-minutes: 60 + run: | + IFS=':' + CHECK_LIBS="${CHECK_LIBS}${{ matrix.extra-check-libs }}" + for lib in ${CHECK_LIBS}; do + printf "::group:: \033[0;32m==>\033[0m Checking library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/${lib} + make demos CMAKE_OPTIONS="-DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON" + echo "::endgroup::" + done + + - name: ccache status + continue-on-error: true + run: ccache -s + + - name: save ccache + # Save the cache after we are done (successfully) building + # This helps to retain the ccache even if the subsequent steps are failing. + uses: actions/cache/save@v4 + with: + path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache + key: ${{ steps.ccache-prepare.outputs.key }} + + - name: install + run: | + IFS=':' + BUILD_LIBS="${BUILD_LIBS}${{ matrix.extra-build-libs }}" + for lib in ${BUILD_LIBS}; do + printf "::group::\033[0;32m==>\033[0m Installing library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake --install . + echo "::endgroup::" + done + + - name: build example using CMake + run: | + cd ${GITHUB_WORKSPACE}/Example/build + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ + -DBLA_VENDOR="Generic" \ + .. + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + cmake --build . + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + printf "\033[1;35m C binary with shared libraries\033[0m\n" + ./my_demo + printf "\033[1;35m C++ binary with shared libraries\033[0m\n" + ./my_cxx_demo + echo "::endgroup::" + + - name: test Config + run: | + IFS=: + INSTALLED_LIBS="${INSTALLED_LIBS}${{ matrix.extra-build-libs }}" + for lib in ${INSTALLED_LIBS}; do + printf "::group:: \033[0;32m==>\033[0m Building with Config.cmake with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + cd build + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ + .. + cmake --build . --config Release + echo "::endgroup::" + done + + - name: build example using autotools + run: | + cd ${GITHUB_WORKSPACE}/Example + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + autoreconf -fi + mkdir build-autotools + cd build-autotools + PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ + ../configure --enable-shared --disable-static + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + make all + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + printf "\033[1;35m C binary\033[0m\n" + LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_demo + printf "\033[1;35m C++ binary\033[0m\n" + LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_cxx_demo + echo "::endgroup::" + IFS=: + INSTALLED_LIBS="${INSTALLED_LIBS}${{ matrix.extra-build-libs }}" + for lib in ${INSTALLED_LIBS}; do + printf "::group:: \033[0;32m==>\033[0m Building test with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + autoreconf -fi + mkdir build-autotools && cd build-autotools + PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ + ../configure --enable-shared --disable-static + make all + echo "::endgroup::" + done diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 00000000..07c9d397 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,520 @@ +name: build +on: + workflow_dispatch: + push: + branches-ignore: + - '**/dev2' + - '**/*dev2' + pull_request: + +concurrency: ci-${{ github.ref }} + +env: + # string with name of libraries to be built + BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + # string with name of libraries to be checked + CHECK_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + # string with name of libraries that are installed + INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + +jobs: + + ubuntu: + # For available GitHub-hosted runners, see: + # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners + runs-on: ubuntu-latest + + name: ubuntu (${{ matrix.compiler }} ${{ matrix.cuda }} CUDA ${{ matrix.openmp }} OpenMP, ${{ matrix.link }}) + + strategy: + # Allow other runners in the matrix to continue if some fail + fail-fast: false + + matrix: + compiler: [gcc, clang] + cuda: [with, without] + openmp: [with] + link: [both] + include: + - compiler: gcc + compiler-pkgs: "g++ gcc" + cc: "gcc" + cxx: "g++" + - compiler: clang + compiler-pkgs: "clang libomp-dev" + cc: "clang" + cxx: "clang++" + # Clang seems to generally require less cache size (smaller object files?). + - compiler: gcc + ccache-max: 600M + - compiler: clang + ccache-max: 500M + - cuda: with + cuda-pkgs: "nvidia-cuda-dev nvidia-cuda-toolkit" + cuda-cmake-flags: + -DSUITESPARSE_USE_CUDA=ON + -DSUITESPARSE_USE_STRICT=ON + -DCUDAToolkit_INCLUDE_DIRS="/usr/include" + -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" + - compiler: gcc + compiler-pkgs: "g++ gcc" + cc: "gcc" + cxx: "g++" + ccache-max: 600M + cuda: without + openmp: without + openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" + - compiler: gcc + compiler-pkgs: "g++ gcc" + cc: "gcc" + cxx: "g++" + ccache-max: 600M + cuda: with + cuda-pkgs: "nvidia-cuda-dev nvidia-cuda-toolkit" + cuda-cmake-flags: + -DSUITESPARSE_USE_CUDA=ON + -DSUITESPARSE_USE_STRICT=ON + -DCUDAToolkit_INCLUDE_DIRS="/usr/include" + -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" + openmp: with + link: static + # "Fake" a cross-compilation to exercise that build system path + link-cmake-flags: + -DBUILD_SHARED_LIBS=OFF + -DBUILD_STATIC_LIBS=ON + -DCMAKE_SYSTEM_NAME="Linux" + + env: + CC: ${{ matrix.cc }} + CXX: ${{ matrix.cxx }} + + steps: + - name: get CPU information + run: lscpu + + - name: checkout repository + uses: actions/checkout@v4 + + - name: install dependencies + env: + COMPILER_PKGS: ${{ matrix.compiler-pkgs }} + CUDA_PKGS: ${{ matrix.cuda-pkgs }} + run: | + sudo apt -qq update + sudo apt install -y ${COMPILER_PKGS} autoconf automake ccache cmake \ + dvipng gfortran libgmp-dev liblapack-dev libmpfr-dev valgrind \ + libopenblas-dev ${CUDA_PKGS} + + - name: prepare ccache + # create key with human readable timestamp + # used in action/cache/restore and action/cache/save steps + id: ccache-prepare + run: | + echo "key=ccache:ubuntu:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.openmp }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT + + - name: restore ccache + # setup the GitHub cache used to maintain the ccache from one job to the next + uses: actions/cache/restore@v4 + with: + path: ~/.ccache + key: ${{ steps.ccache-prepare.outputs.key }} + # Prefer caches from the same branch. Fall back to caches from the dev branch. + restore-keys: | + ccache:ubuntu:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.openmp }}:${{ matrix.link }}:${{ github.ref }} + ccache:ubuntu:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.openmp }}:${{ matrix.link }}: + + - name: create empty libraries + # This is to work around a bug in nvlink. + # See: https://forums.developer.nvidia.com/t/nvlink-fatal-could-not-open-input-file-when-linking-with-empty-static-library/208517 + if: matrix.cuda == 'with' + run: | + touch empty.c + gcc -fPIC -c empty.c -oempty.o + ar rcsv libdl.a empty.o + ar rcsv librt.a empty.o + ar rcsv libpthread.a empty.o + # overwrite system libraries with "valid" empty libraries + sudo mv ./libdl.a /usr/lib/x86_64-linux-gnu/libdl.a + sudo mv ./librt.a /usr/lib/x86_64-linux-gnu/librt.a + sudo mv ./libpthread.a /usr/lib/x86_64-linux-gnu/libpthread.a + + - name: configure ccache + env: + CCACHE_MAX: ${{ matrix.ccache-max }} + run: | + test -d ~/.ccache || mkdir ~/.ccache + echo "max_size = $CCACHE_MAX" >> ~/.ccache/ccache.conf + echo "compression = true" >> ~/.ccache/ccache.conf + ccache -s + echo "/usr/lib/ccache" >> $GITHUB_PATH + + - name: build + run: | + IFS=':' read -r -a libs <<< "${BUILD_LIBS}" + for lib in "${libs[@]}"; do + printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" + echo "::group::Configure $lib" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ + -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ + -DBLA_VENDOR="OpenBLAS" \ + -DSUITESPARSE_DEMOS=OFF \ + -DBUILD_TESTING=OFF \ + ${{ matrix.cuda-cmake-flags }} \ + ${{ matrix.openmp-cmake-flags }} \ + ${{ matrix.link-cmake-flags }} \ + .. + echo "::endgroup::" + echo "::group::Build $lib" + cmake --build . --config Release + echo "::endgroup::" + done + + - name: check + timeout-minutes: 20 + run: | + IFS=':' read -r -a libs <<< "${CHECK_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Checking library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/${lib} + make demos CMAKE_OPTIONS="-DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON" + echo "::endgroup::" + done + + - name: ccache status + continue-on-error: true + run: ccache -s + + - name: save ccache + # Save the cache after we are done (successfully) building + # This helps to retain the ccache even if the subsequent steps are failing. + uses: actions/cache/save@v4 + with: + path: ~/.ccache + key: ${{ steps.ccache-prepare.outputs.key }} + + - name: install + run: | + IFS=':' read -r -a libs <<< "${BUILD_LIBS}" + for lib in "${libs[@]}"; do + printf "::group::\033[0;32m==>\033[0m Installing library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake --install . + echo "::endgroup::" + done + + - name: build example using CMake + run: | + cd ${GITHUB_WORKSPACE}/Example/build + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ + -DBLA_VENDOR="OpenBLAS" \ + ${{ matrix.cuda-cmake-flags }} \ + ${{ matrix.link-cmake-flags }} \ + .. + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + cmake --build . + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + if [ -f ./my_demo -a -f ./my_cxx_demo ]; then + printf "\033[1;35m C binary with shared libraries\033[0m\n" + ./my_demo + printf "\033[1;35m C++ binary with shared libraries\033[0m\n" + ./my_cxx_demo + fi + printf "\033[1;35m C binary with statically linked libraries\033[0m\n" + ./my_demo_static + printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" + ./my_cxx_demo_static + echo "::endgroup::" + + - name: test Config + run: | + IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Building with Config.cmake with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + cd build + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ + .. + cmake --build . --config Release + echo "::endgroup::" + done + + - name: build example using autotools + run: | + cd ${GITHUB_WORKSPACE}/Example + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + autoreconf -fi + mkdir build-autotools + cd build-autotools + if [ "${{ matrix.link }}" = static ]; then + _extra_config_flags="--enable-static --disable-shared" + else + _extra_config_flags="--enable-shared --disable-static" + fi + PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ + ../configure ${_extra_config_flags} + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + make all + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + printf "\033[1;35m C binary\033[0m\n" + LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_demo + printf "\033[1;35m C++ binary\033[0m\n" + LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_cxx_demo + echo "::endgroup::" + IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Building test with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + autoreconf -fi + mkdir build-autotools && cd build-autotools + PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ + ../configure ${_extra_config_flags} + make all + echo "::endgroup::" + done + + mingw: + # For available GitHub-hosted runners, see: + # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners + runs-on: windows-latest + + defaults: + run: + # Use MSYS2 as default shell + shell: msys2 {0} + + strategy: + # Allow other runners in the matrix to continue if some fail + fail-fast: false + + # CLANG32 is broken, as of Mar 21, 2024. The stable branch CI also fails + # the same way, even though it succeeded on Mar 2, with the same + # SuiteSparse 7.6.1 and same workflow file. Between that time, clang and + # openmp were upgraded. clang-openmp went from 17.0.6-1 to 18.1.1-1, and + # clang itself went from 17.0.6-7 to 18.1.1-3. Nothing else changed, so + # it must be a problem with the github runner (changed from 2.313.0 to + # 2.314.1). So for now, CLANG32 is excluded from this CI test. + + matrix: +# CLANG32 disabled for now: +# msystem: [MINGW64, MINGW32, CLANG64, CLANG32] + msystem: [MINGW64, MINGW32, UCRT64, CLANG64] + include: + - msystem: MINGW64 + target-prefix: mingw-w64-x86_64 + f77-package: mingw-w64-x86_64-fc + - msystem: MINGW32 + target-prefix: mingw-w64-i686 + f77-package: mingw-w64-i686-fc + - msystem: UCRT64 + target-prefix: mingw-w64-ucrt-x86_64 + # Purposefully don't install a Fortran compiler to test that configuration + f77-package: mingw-w64-ucrt-x86_64-cc + - msystem: CLANG64 + target-prefix: mingw-w64-clang-x86_64 + f77-package: mingw-w64-clang-x86_64-fc +# CLANG32 disabled for now: +# - msystem: CLANG32 +# target-prefix: mingw-w64-clang-i686 +# # There's no Fortran compiler for this environment. +# f77-package: mingw-w64-clang-i686-cc + + env: + CHERE_INVOKING: 1 + + steps: + - name: get CPU name + shell: pwsh + run : | + Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name + + - name: install MSYS2 build environment + uses: msys2/setup-msys2@v2 + with: + update: true + + # Use pre-installed version to save disc space on partition with source. + release: false + + install: >- + base-devel + ${{ matrix.target-prefix }}-autotools + ${{ matrix.target-prefix }}-cmake + ${{ matrix.target-prefix }}-cc + ${{ matrix.f77-package }} + ${{ matrix.target-prefix }}-ccache + ${{ matrix.target-prefix }}-openblas + ${{ matrix.target-prefix }}-omp + ${{ matrix.target-prefix }}-python + ${{ matrix.target-prefix }}-gmp + ${{ matrix.target-prefix }}-mpfr + + msystem: ${{ matrix.msystem }} + + - name: checkout repository + uses: actions/checkout@v4 + + - name: prepare ccache + # create key with human readable timestamp + # used in action/cache/restore and action/cache/save steps + id: ccache-prepare + run: | + echo "ccachedir=$(cygpath -m $(ccache -k cache_dir))" >> $GITHUB_OUTPUT + echo "key=ccache:mingw:${{ matrix.msystem }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT + + - name: restore ccache + # Setup the GitHub cache used to maintain the ccache from one job to the next + uses: actions/cache/restore@v4 + with: + path: ${{ steps.ccache-prepare.outputs.ccachedir }} + key: ${{ steps.ccache-prepare.outputs.key }} + # Prefer caches from the same branch. Fall back to caches from the dev branch. + restore-keys: | + ccache:mingw:${{ matrix.msystem }}:${{ github.ref }} + ccache:mingw:${{ matrix.msystem }} + + - name: configure ccache + # Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota. + run: | + which ccache + test -d ${{ steps.ccache_cache_timestamp.outputs.ccachedir }} || mkdir -p ${{ steps.ccache_cache_timestamp.outputs.ccachedir }} + echo "max_size = 250M" > ${{ steps.ccache_cache_timestamp.outputs.ccachedir }}/ccache.conf + echo "compression = true" >> ${{ steps.ccache_cache_timestamp.outputs.ccachedir }}/ccache.conf + ccache -p + ccache -s + + - name: build + run: | + IFS=':' read -r -a libs <<< "${BUILD_LIBS}" + for lib in "${libs[@]}"; do + printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" + echo "::group::Configure $lib" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ + -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ + -DBLA_VENDOR="OpenBLAS" \ + -DPython_EXECUTABLE="$(which python)" \ + -DSUITESPARSE_DEMOS=OFF \ + -DBUILD_TESTING=OFF \ + .. + echo "::endgroup::" + echo "::group::Build $lib" + cmake --build . --config Release + echo "::endgroup::" + done + + - name: check + timeout-minutes: 20 + # Need to install the libraries for the tests + run: | + echo "::group::Install libraries" + make install + echo "::endgroup::" + IFS=':' read -r -a libs <<< "${CHECK_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Checking library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/${lib} + PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ + make demos CMAKE_OPTIONS="-DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON" + echo "::endgroup::" + done + + - name: ccache status + continue-on-error: true + run: ccache -s + + - name: save ccache + # Save the cache after we are done (successfully) building + # This helps to retain the ccache even if the subsequent steps are failing. + uses: actions/cache/save@v4 + with: + path: ${{ steps.ccache-prepare.outputs.ccachedir }} + key: ${{ steps.ccache-prepare.outputs.key }} + + - name: build example using CMake + run: | + cd ${GITHUB_WORKSPACE}/Example/build + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ + .. + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + cmake --build . + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + printf "\033[1;35m C binary with shared libraries\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ + ./my_demo + printf "\033[1;35m C++ binary with shared libraries\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ + ./my_cxx_demo + # We don't build a static version of GraphBLAS in CI. + # So we need to prepare the environment also for the following tests. + printf "\033[1;35m C binary with statically linked libraries\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ + ./my_demo_static + printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ + ./my_cxx_demo_static + echo "::endgroup::" + + - name: test Config + run: | + IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Building with Config.cmake with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + cd build + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ + .. + cmake --build . --config Release + echo "::endgroup::" + done + + - name: build example using autotools + run: | + cd ${GITHUB_WORKSPACE}/Example + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + autoreconf -fi + mkdir build-autotools + cd build-autotools + PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ + ../configure --enable-shared --disable-static + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + make all + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + printf "\033[1;35m C binary\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ + ./my_demo + printf "\033[1;35m C++ binary\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ + ./my_cxx_demo + echo "::endgroup::" + IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Building test with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + autoreconf -fi + mkdir build-autotools && cd build-autotools + PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ + ../configure --enable-shared --disable-static + make all + echo "::endgroup::" + done diff --git a/.github/workflows/codeql-analysis.yaml b/.github/workflows/codeql-analysis.yaml new file mode 100644 index 00000000..b098e21e --- /dev/null +++ b/.github/workflows/codeql-analysis.yaml @@ -0,0 +1,204 @@ +name: "CodeQL" + +on: + workflow_dispatch: + schedule: + # Run job every Saturday at 10:20 UTC + - cron: '20 10 * * 6' + +concurrency: codeql-${{ github.ref }} + +# # See: https://github.com/github/codeql-action/issues/1082 +# env: +# CODEQL_ACTION_EXTRA_OPTIONS: '{"database": {"run-queries": ["--off-heap-ram=0"]}}' + + +jobs: + + ubuntu: + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'] + language: ['c-cpp'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + group: [other] +# GraphBLAS and LAGraph disabled (the runners run out of memory or +# disk space) +# group: [other, graph] + include: + - group: other + build-libs: SuiteSparse_config:AMD:COLAMD:SPEX +# - group: graph +# build-libs: GraphBLAS:LAGraph + + name: CodeQL (Ubuntu, ${{ matrix.group }}) + + steps: + - name: checkout repository + uses: actions/checkout@v4 + + - name: install dependencies + run: | + sudo apt -qq update + sudo apt install -y g++ gcc autoconf automake cmake \ + dvipng gfortran libgmp-dev liblapack-dev libmpfr-dev \ + libopenblas-dev nvidia-cuda-dev nvidia-cuda-toolkit + + - name: create empty libraries + # This is to work around a bug in nvlink. + # See: https://forums.developer.nvidia.com/t/nvlink-fatal-could-not-open-input-file-when-linking-with-empty-static-library/208517 + run: | + touch empty.c + gcc -fPIC -c empty.c -oempty.o + ar rcsv libdl.a empty.o + ar rcsv librt.a empty.o + ar rcsv libpthread.a empty.o + # overwrite system libraries with "valid" empty libraries + sudo mv ./libdl.a /usr/lib/x86_64-linux-gnu/libdl.a + sudo mv ./librt.a /usr/lib/x86_64-linux-gnu/librt.a + sudo mv ./libpthread.a /usr/lib/x86_64-linux-gnu/libpthread.a + + - name: initialize CodeQL + # Initialize the CodeQL tools for scanning. + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + - name: build + # The analysis with factory kernels of the GraphBLAS library is too + # extensive for the free GitHub-hosted runners. Disable them to work + # around that. That means they aren't scanned. + run: | + IFS=':' + BUILD_LIBS="${{ matrix.build-libs }}" + for lib in ${BUILD_LIBS}; do + printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" + echo "::group::Configure $lib" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ + -DBLA_VENDOR="OpenBLAS" \ + -DNSTATIC=ON \ + -DCOMPACT=ON \ + -DSUITESPARSE_USE_CUDA=ON \ + -DCUDAToolkit_INCLUDE_DIRS="/usr/include" \ + .. + echo "::endgroup::" + echo "::group::Build $lib" + cmake --build . --config Release + echo "::endgroup::" + done + + - name: perform CodeQL analysis + uses: github/codeql-action/analyze@v3 + with: + category: ${{ matrix.group }}-64 + + + mingw32: + runs-on: windows-latest + + defaults: + run: + # Use MSYS2 as default shell + shell: msys2 {0} + + strategy: + # Allow other runners in the matrix to continue if some fail + fail-fast: false + + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'] + language: ['c-cpp'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + group: [other] +# group: [other, graph] + include: + - group: other + build-libs: SuiteSparse_config:AMD:COLAMD:SPEX +# - group: graph +# build-libs: GraphBLAS:LAGraph + + env: + CHERE_INVOKING: 1 + + name: CodeQL (mingw32, ${{ matrix.group }}) + + steps: + - name: get CPU name + shell: pwsh + run : | + Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name + + - name: install MSYS2 build environment + uses: msys2/setup-msys2@v2 + with: + update: true + + # Use pre-installed version to save disc space on partition with source. + release: false + + install: >- + base-devel + mingw-w64-i686-autotools + mingw-w64-i686-cmake + mingw-w64-i686-cc + mingw-w64-i686-fc + mingw-w64-i686-openblas + mingw-w64-i686-omp + mingw-w64-i686-gmp + mingw-w64-i686-mpfr + + msystem: MINGW32 + + - name: checkout repository + uses: actions/checkout@v4 + + - name: initialize CodeQL + # Initialize the CodeQL tools for scanning. + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + - name: build + # The analysis with factory kernels of the GraphBLAS library is too + # extensive for the free GitHub-hosted runners. Disable them to work + # around that. That means they aren't scanned. + run: | + BUILD_LIBS="${{ matrix.build-libs }}" + IFS=':' read -r -a libs <<< "${BUILD_LIBS}" + for lib in "${libs[@]}"; do + printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" + echo "::group::Configure $lib" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ + -DBLA_VENDOR="OpenBLAS" \ + -DNSTATIC=ON \ + -DCOMPACT=ON \ + .. + echo "::endgroup::" + echo "::group::Build $lib" + cmake --build . --config Release + echo "::endgroup::" + done + + - name: perform CodeQL analysis + uses: github/codeql-action/analyze@v3 + with: + category: ${{ matrix.group }}-32 diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml new file mode 100644 index 00000000..31ff9cff --- /dev/null +++ b/.github/workflows/macos.yaml @@ -0,0 +1,159 @@ +name: macos +on: + workflow_dispatch: +# push: +# branches-ignore: +# - '**/dev2' +# - '**/*dev2' +# pull_request: + +# This workflow hangs intermittently at random places, after building a demo +# program and just before running it. Something is broken but it's not +# SuiteSparse; it's github. Tests on an M1 Mac and Intel Mac have never shown +# this behavior outside of github. As a result, this workflow has been +# relegated to a "workflow_dispatch" only. It is not run on push or pull +# requests. The hang has nothing to do with parallelism; it can hang in +# check_AMD, which does not use OpenMP. + +concurrency: ci-macos-${{ github.ref }} + +env: + # string with name of libraries to be built + BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + +jobs: + + macos: + # For available GitHub-hosted runners, see: + # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners + runs-on: macos-latest + + steps: + - name: get runner hardware information + run: | + sysctl hw + sysctl machdep + + - name: checkout repository + uses: actions/checkout@v4 + + - name: install dependencies + # Homebrew's Python conflicts with the Python that comes pre-installed + # on the GitHub runners. Some of SuiteSparse's dependencies depend on + # different versions of Homebrew's Python. Enforce using the ones from + # Homebrew to avoid errors on updates. + # See: https://github.com/orgs/Homebrew/discussions/3928 + + # It looks like "gfortran" isn't working correctly unless "gcc" is + # re-installed. + run: | + brew update + brew install --overwrite python@3.10 python@3.11 python@3.12 + brew reinstall gcc + brew install autoconf automake ccache cmake gmp lapack libomp mpfr openblas + + - name: prepare ccache + # create key with human readable timestamp + # used in action/cache/restore and action/cache/save steps + id: ccache-prepare + run: | + echo "key=ccache:macos-latest:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT + + - name: restore ccache + # setup the GitHub cache used to maintain the ccache from one job to the next + uses: actions/cache/restore@v4 + with: + path: /Users/runner/Library/Caches/ccache + key: ${{ steps.ccache-prepare.outputs.key }} + # Prefer caches from the same branch. Fall back to caches from the dev branch. + restore-keys: | + ccache:macos-latest:${{ github.ref }} + ccache:macos-latest + + - name: configure ccache + # Limit the maximum size to avoid exceeding the total cache limits. + run: | + test -d /Users/runner/Library/Preferences/ccache || mkdir /Users/runner/Library/Preferences/ccache + echo "max_size = 300M" >> /Users/runner/Library/Preferences/ccache/ccache.conf + ccache -s + + - name: build + run: | + IFS=':' read -r -a libs <<< "${BUILD_LIBS}" + for lib in "${libs[@]}"; do + printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" + echo "::group::Configure $lib" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ + -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ + -DBLA_VENDOR="OpenBLAS" \ + -DCMAKE_PREFIX_PATH="/usr/local/opt/lapack;/usr/local/opt/openblas;/usr/local/opt/libomp" \ + .. + echo "::endgroup::" + echo "::group::Build $lib" + cmake --build . --config Release + echo "::endgroup::" + done + + - name: check_AMD + run: | + cd ${GITHUB_WORKSPACE}/AMD + make demos + + - name: check_COLAMD + run: | + cd ${GITHUB_WORKSPACE}/COLAMD + make demos + + - name: check_SPEX + run: | + cd ${GITHUB_WORKSPACE}/SPEX + make demos + + - name: ccache status + continue-on-error: true + run: ccache -s + + - name: save ccache + # Save the cache after we are done (successfully) building + # This helps to retain the ccache even if the subsequent steps are failing. + uses: actions/cache/save@v4 + with: + path: /Users/runner/Library/Caches/ccache + key: ${{ steps.ccache-prepare.outputs.key }} + + - name: install + run: | + IFS=':' read -r -a libs <<< "${BUILD_LIBS}" + for lib in "${libs[@]}"; do + printf "::group::\033[0;32m==>\033[0m Installing library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/${lib}/build + cmake --install . + echo "::endgroup::" + done + + - name: build example + run: | + cd ${GITHUB_WORKSPACE}/Example/build + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;/usr/local/opt/lapack;/usr/local/opt/openblas;/usr/local/opt/libomp" \ + .. + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + cmake --build . + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + printf "\033[1;35m C binary with shared libraries\033[0m\n" + ./my_demo + printf "\033[1;35m C++ binary with shared libraries\033[0m\n" + ./my_cxx_demo + printf "\033[1;35m C binary with statically linked libraries\033[0m\n" + ./my_demo_static + printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" + ./my_cxx_demo_static + echo "::endgroup::" + diff --git a/.github/workflows/root-cmakelists.yaml b/.github/workflows/root-cmakelists.yaml new file mode 100644 index 00000000..c9658ae1 --- /dev/null +++ b/.github/workflows/root-cmakelists.yaml @@ -0,0 +1,570 @@ +# Build SuiteSparse using the root CMakeLists.txt + +name: root-cmakelists + +on: + workflow_dispatch: + push: + branches-ignore: + - '**/dev2' + - '**/*dev2' + pull_request: + +concurrency: ci-root-cmakelists-${{ github.ref }} + +env: + # string with name of libraries that are installed + INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + +jobs: + + ubuntu: + # For available GitHub-hosted runners, see: + # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners + runs-on: ubuntu-latest + + name: ubuntu (${{ matrix.compiler }} ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) + + strategy: + # Allow other runners in the matrix to continue if some fail + fail-fast: false + + matrix: + compiler: [gcc, clang] + cuda: [with, without] + link: [both] + include: + - compiler: gcc + compiler-pkgs: "g++ gcc" + cc: "gcc" + cxx: "g++" + - compiler: clang + compiler-pkgs: "clang libomp-dev" + cc: "clang" + cxx: "clang++" + # Clang seems to generally require less cache size (smaller object files?). + - compiler: gcc + ccache-max: 600M + - compiler: clang + ccache-max: 500M + - cuda: with + cuda-pkgs: "nvidia-cuda-dev nvidia-cuda-toolkit" + cuda-cmake-flags: + -DSUITESPARSE_USE_CUDA=ON + -DSUITESPARSE_USE_STRICT=ON + -DCUDAToolkit_INCLUDE_DIRS="/usr/include" + -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" + - compiler: gcc + compiler-pkgs: "g++ gcc" + cc: "gcc" + cxx: "g++" + ccache-max: 600M + cuda: with + cuda-pkgs: "nvidia-cuda-dev nvidia-cuda-toolkit" + cuda-cmake-flags: + -DSUITESPARSE_USE_CUDA=ON + -DSUITESPARSE_USE_STRICT=ON + -DCUDAToolkit_INCLUDE_DIRS="/usr/include" + -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" + link: static + link-cmake-flags: + -DBUILD_SHARED_LIBS=OFF + -DBUILD_STATIC_LIBS=ON + + env: + CC: ${{ matrix.cc }} + CXX: ${{ matrix.cxx }} + + steps: + - name: get CPU information + run: lscpu + + - name: checkout repository + uses: actions/checkout@v4 + + - name: install dependencies + env: + COMPILER_PKGS: ${{ matrix.compiler-pkgs }} + CUDA_PKGS: ${{ matrix.cuda-pkgs }} + run: | + sudo apt -qq update + sudo apt install -y ${COMPILER_PKGS} autoconf automake ccache cmake \ + dvipng gfortran libgmp-dev liblapack-dev libmpfr-dev \ + libopenblas-dev ${CUDA_PKGS} + + - name: prepare ccache + # create key with human readable timestamp + # used in action/cache/restore and action/cache/save steps + id: ccache-prepare + run: | + echo "key=ccache:ubuntu:root:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT + + - name: restore ccache + # setup the GitHub cache used to maintain the ccache from one job to the next + uses: actions/cache/restore@v4 + with: + path: ~/.ccache + key: ${{ steps.ccache-prepare.outputs.key }} + # Prefer caches from the same branch. Fall back to caches from the dev branch. + restore-keys: | + ccache:ubuntu:root:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} + ccache:ubuntu:root:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.link }} + + - name: create empty libraries + # This is to work around a bug in nvlink. + # See: https://forums.developer.nvidia.com/t/nvlink-fatal-could-not-open-input-file-when-linking-with-empty-static-library/208517 + if: matrix.cuda == 'with' + run: | + touch empty.c + gcc -fPIC -c empty.c -oempty.o + ar rcsv libdl.a empty.o + ar rcsv librt.a empty.o + ar rcsv libpthread.a empty.o + # overwrite system libraries with "valid" empty libraries + sudo mv ./libdl.a /usr/lib/x86_64-linux-gnu/libdl.a + sudo mv ./librt.a /usr/lib/x86_64-linux-gnu/librt.a + sudo mv ./libpthread.a /usr/lib/x86_64-linux-gnu/libpthread.a + + - name: configure ccache + env: + CCACHE_MAX: ${{ matrix.ccache-max }} + run: | + test -d ~/.ccache || mkdir ~/.ccache + echo "max_size = $CCACHE_MAX" >> ~/.ccache/ccache.conf + echo "compression = true" >> ~/.ccache/ccache.conf + ccache -s + echo "/usr/lib/ccache" >> $GITHUB_PATH + + - name: check auto-dependency resolution + # no need to check this with all runners. One is enough. + if: ${{ matrix.cc == 'gcc' && matrix.cuda == 'without' }} + run: | + mkdir -p ${GITHUB_WORKSPACE}/build-dep && cd ${GITHUB_WORKSPACE}/build-dep + IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Configuring to build only \033[0;32m${lib}\033[0m\n" + cmake --fresh \ + -DCMAKE_BUILD_TYPE="Release" \ + -DBLA_VENDOR="OpenBLAS" \ + -DSUITESPARSE_ENABLE_PROJECTS="${lib,,}" \ + .. + echo "::endgroup::" + done + + - name: configure + run: | + mkdir -p ${GITHUB_WORKSPACE}/build && cd ${GITHUB_WORKSPACE}/build + cmake -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_INSTALL_PREFIX=".." \ + -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ + -DBLA_VENDOR="OpenBLAS" \ + -DSUITESPARSE_DEMOS=OFF \ + -DBUILD_TESTING=OFF \ + ${{ matrix.cuda-cmake-flags }} \ + ${{ matrix.link-cmake-flags }} \ + .. + + - name: build libraries + run: | + cd ${GITHUB_WORKSPACE}/build + cmake --build . + + - name: build demos + run: | + printf "::group:: \033[0;32m==>\033[0m Configuring for demos\n" + cd ${GITHUB_WORKSPACE}/build + cmake -DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON .. + echo "::endgroup::" + printf "::group:: \033[0;32m==>\033[0m Building demos\n" + cd ${GITHUB_WORKSPACE}/build + cmake --build . + echo "::endgroup::" + # FIXME: How to run the demos without Makefile? + + - name: ccache status + continue-on-error: true + run: ccache -s + + - name: save ccache + # Save the cache after we are done (successfully) building. + # This helps to retain the ccache even if the subsequent steps are failing. + uses: actions/cache/save@v4 + with: + path: ~/.ccache + key: ${{ steps.ccache-prepare.outputs.key }} + + - name: check + run: | + cd ${GITHUB_WORKSPACE}/build + ctest . || ctest . --rerun-failed --output-on-failure + + - name: install + run: | + printf "\033[0;32m==>\033[0m Installing libraries\n" + cd ${GITHUB_WORKSPACE}/build + cmake --install . + + - name: build example using CMake + run: | + cd ${GITHUB_WORKSPACE}/Example/build + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ + -DBLA_VENDOR="OpenBLAS" \ + ${{ matrix.cuda-cmake-flags }} \ + ${{ matrix.link-cmake-flags }} \ + .. + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + cmake --build . + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + if [ -f ./my_demo -a -f ./my_cxx_demo ]; then + printf "\033[1;35m C binary with shared libraries\033[0m\n" + LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_demo + printf "\033[1;35m C++ binary with shared libraries\033[0m\n" + LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_cxx_demo + fi + printf "\033[1;35m C binary with statically linked libraries\033[0m\n" + ./my_demo_static + printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" + ./my_cxx_demo_static + echo "::endgroup::" + + - name: test Config + run: | + IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Building Config.cmake with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + cd build + cmake \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ + .. + cmake --build . --config Release + echo "::endgroup::" + done + + - name: build example using autotools + run: | + cd ${GITHUB_WORKSPACE}/Example + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + autoreconf -fi + mkdir build-autotools + cd build-autotools + if [ "${{ matrix.link }}" = static ]; then + _extra_config_flags="--enable-static --disable-shared" + else + _extra_config_flags="--enable-shared --disable-static" + fi + PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ + ../configure ${_extra_config_flags} + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + make all + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + printf "\033[1;35m C binary\033[0m\n" + LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_demo + printf "\033[1;35m C++ binary\033[0m\n" + LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_cxx_demo + echo "::endgroup::" + IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Building test with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + autoreconf -fi + mkdir build-autotools && cd build-autotools + PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ + ../configure ${_extra_config_flags} + make all + echo "::endgroup::" + done + + + msvc: + # For available GitHub-hosted runners, see: + # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners + runs-on: windows-latest + + name: msvc (${{ matrix.cc }} ${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) + + defaults: + run: + # Use bash as default shell + shell: bash -el {0} + + strategy: + # Allow other runners in the matrix to continue if some fail + fail-fast: false + + matrix: + openmp: [with, without] + cuda: [without] + link: [both] + cc: [cl] + include: + - openmp: without + openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" + - openmp: with + cuda: with + cuda-cmake-flags: + -DSUITESPARSE_USE_CUDA=ON + -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" + link: both + cc: cl + - openmp: with + cuda: with + cuda-cmake-flags: + -DSUITESPARSE_USE_CUDA=ON + -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" + link: static + link-cmake-flags: + -DBUILD_SHARED_LIBS=OFF + -DBUILD_STATIC_LIBS=ON + cc: cl + - openmp: with + cuda: without + link: both + cc: clang-cl + + env: + CHERE_INVOKING: 1 + + steps: + - name: get CPU name + shell: pwsh + run : | + Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name + + - name: checkout repository + uses: actions/checkout@v4 + + - uses: conda-incubator/setup-miniconda@v3 + with: + auto-update-conda: true + + - name: cache conda packages + id: conda-cache + uses: actions/cache/restore@v4 + with: + path: C:/Miniconda/envs/test + key: conda:msvc + + - name: install packages with conda + if: ${{ steps.conda-cache.outputs.cache-hit != 'true' }} + run: | + echo ${{ steps.conda-cache.outputs.cache-hit }} + conda info + conda list + conda install -y -c intel mkl-devel + conda install -y -c conda-forge --override-channels ccache + + - name: save conda cache + if: ${{ steps.conda-cache.outputs.cache-hit != 'true' }} + uses: actions/cache/save@v4 + with: + path: C:/Miniconda/envs/test + key: ${{ steps.conda-cache.outputs.cache-primary-key }} + + - name: install libraries from MSYS2 + uses: msys2/setup-msys2@v2 + with: + update: true + + # Use pre-installed version to save disc space on partition with source. + release: false + + install: >- + mingw-w64-ucrt-x86_64-gmp + mingw-w64-ucrt-x86_64-mpfr + mingw-w64-ucrt-x86_64-python + + msystem: UCRT64 + + - uses: Jimver/cuda-toolkit@v0.2.14 + name: install CUDA toolkit + if: matrix.cuda == 'with' + id: cuda-toolkit + with: + cuda: '12.2.0' + #See https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#install-the-cuda-software + method: 'local' + # Do not cache the installer (~3 GiB). It doesn't speed up the + # installation significantly. And we need the space for ccache. + use-github-cache: 'false' + + - name: setup build environment + # get packages from MSYS2 + # Copy only relevant parts to avoid picking up headers and libraries + # that are thought for MinGW only. + run: | + mkdir -p ./dependencies/{bin,lib,include} + # GMP + cp C:/msys64/ucrt64/bin/libgmp*.dll ./dependencies/bin/ + cp C:/msys64/ucrt64/include/gmp.h ./dependencies/include/ + cp C:/msys64/ucrt64/lib/libgmp.dll.a ./dependencies/lib/gmp.lib + # MPFR + cp C:/msys64/ucrt64/bin/libmpfr*.dll ./dependencies/bin/ + cp C:/msys64/ucrt64/include/mpf2mpfr.h ./dependencies/include/ + cp C:/msys64/ucrt64/include/mpfr.h ./dependencies/include/ + cp C:/msys64/ucrt64/lib/libmpfr.dll.a ./dependencies/lib/mpfr.lib + # run-time dependencies + cp C:/msys64/ucrt64/bin/libgcc_s_seh*.dll ./dependencies/bin/ + cp C:/msys64/ucrt64/bin/libwinpthread*.dll ./dependencies/bin/ + # create environment variable for easier access + echo "CCACHE=C:/Miniconda/envs/test/Library/bin/ccache.exe" >> ${GITHUB_ENV} + + - name: prepare ccache + # create key with human readable timestamp + # used in action/cache/restore and action/cache/save steps + id: ccache-prepare + shell: msys2 {0} + run: | + echo "ccachedir=$(cygpath -m $(${CCACHE} -k cache_dir))" >> $GITHUB_OUTPUT + echo "key=ccache:msvc:root:${{ matrix.cc }}:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT + + - name: restore ccache + # Setup the GitHub cache used to maintain the ccache from one job to the next + uses: actions/cache/restore@v4 + with: + path: ${{ steps.ccache-prepare.outputs.ccachedir }} + key: ${{ steps.ccache-prepare.outputs.key }} + # Prefer caches from the same branch. Fall back to caches from the dev branch. + restore-keys: | + ccache:msvc:root:${{ matrix.cc }}:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} + ccache:msvc:root:${{ matrix.cc }}:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}: + + - name: configure ccache + # Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota. + run: | + test -d ${{ steps.ccache-prepare.outputs.ccachedir }} || mkdir -p ${{ steps.ccache-prepare.outputs.ccachedir }} + echo "max_size = 250M" > ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf + echo "compression = true" >> ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf + ${CCACHE} -p + ${CCACHE} -s + + - name: setup MSVC toolchain + uses: ilammy/msvc-dev-cmd@v1 + + - name: configure + run: | + declare -a _extra_config + if [ ${{ matrix.cuda }} = 'with' ]; then + _extra_config+=(-DCUDAToolkit_ROOT="$(cygpath -m "${{ steps.cuda-toolkit.outputs.CUDA_PATH }}")") + _extra_config+=(-DCMAKE_CUDA_COMPILER="$(cygpath -m "${{ steps.cuda-toolkit.outputs.CUDA_PATH }}")/bin/nvcc.exe") + fi + mkdir -p ${GITHUB_WORKSPACE}/build && cd ${GITHUB_WORKSPACE}/build + cmake -G"Ninja Multi-Config" \ + -DCMAKE_C_COMPILER=${{ matrix.cc }} \ + -DCMAKE_CXX_COMPILER=${{ matrix.cc }} \ + -DCMAKE_BUILD_TYPE="Release" \ + -DCMAKE_INSTALL_PREFIX=".." \ + -DCMAKE_PREFIX_PATH="C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ + -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ + -DSUITESPARSE_USE_FORTRAN=OFF \ + -DBLA_VENDOR="All" \ + -DPython_EXECUTABLE="C:/msys64/ucrt64/bin/python.exe" \ + -DSUITESPARSE_DEMOS=OFF \ + -DBUILD_TESTING=OFF \ + ${{ matrix.openmp-cmake-flags }} \ + ${{ matrix.cuda-cmake-flags }} \ + ${{ matrix.link-cmake-flags }} \ + "${_extra_config[@]}" \ + .. + + - name: build libraries + run: | + cd ${GITHUB_WORKSPACE}/build + cmake --build . --config Release + + - name: build demos + run: | + printf "::group:: \033[0;32m==>\033[0m Configuring for demos\n" + cd ${GITHUB_WORKSPACE}/build + cmake -DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON .. + echo "::endgroup::" + printf "::group:: \033[0;32m==>\033[0m Building demos\n" + cd ${GITHUB_WORKSPACE}/build + cmake --build . --config Release + echo "::endgroup::" + # FIXME: How to run the demos without Makefile? + + - name: ccache status + continue-on-error: true + run: ${CCACHE} -s + + - name: save ccache + # Save the cache after we are done (successfully) building + # This helps to retain the ccache even if the subsequent steps are failing. + uses: actions/cache/save@v4 + with: + path: ${{ steps.ccache-prepare.outputs.ccachedir }} + key: ${{ steps.ccache-prepare.outputs.key }} + + - name: check + run: | + cd ${GITHUB_WORKSPACE}/build + PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;C:/msys64/ucrt64/bin;${PATH}" \ + ctest -C Release . || ctest -C Release . --rerun-failed --output-on-failure + + - name: install + run: | + printf "\033[0;32m==>\033[0m Installing libraries\n" + cd ${GITHUB_WORKSPACE}/build + cmake --install . + + - name: build example + run: | + cd ${GITHUB_WORKSPACE}/Example/build + printf "::group::\033[0;32m==>\033[0m Configuring example\n" + cmake -G"Ninja Multi-Config" \ + -DCMAKE_C_COMPILER=${{ matrix.cc }} \ + -DCMAKE_CXX_COMPILER=${{ matrix.cc }} \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ + -DBLA_VENDOR="All" \ + ${{ matrix.openmp-cmake-flags }} \ + .. + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Building example\n" + cmake --build . --config Release + echo "::endgroup::" + printf "::group::\033[0;32m==>\033[0m Executing example\n" + if [ -f ./my_demo -a -f ./my_cxx_demo ]; then + printf "\033[1;35m C binary with shared libraries\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;${PATH}" \ + ./Release/my_demo + printf "\033[1;35m C++ binary with shared libraries\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;${PATH}" \ + ./Release/my_cxx_demo + fi + # We don't build a static version of GraphBLAS in CI. + # So we need to prepare the environment also for the following tests. + # Additionally, gmp, mpfr and BLAS are always shared libraries. + printf "\033[1;35m C binary with statically linked libraries\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;${PATH}" \ + ./Release/my_demo_static + printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" + PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;${PATH}" \ + ./Release/my_cxx_demo_static + echo "::endgroup::" + + - name: test Config + run: | + IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" + for lib in "${libs[@]}"; do + printf "::group:: \033[0;32m==>\033[0m Building with Config.cmake with library \033[0;32m${lib}\033[0m\n" + cd ${GITHUB_WORKSPACE}/TestConfig/${lib} + cd build + cmake -G"Ninja Multi-Config" \ + -DCMAKE_C_COMPILER=${{ matrix.cc }} \ + -DCMAKE_CXX_COMPILER=${{ matrix.cc }} \ + -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ + .. + cmake --build . --config Release + echo "::endgroup::" + done diff --git a/.gitignore b/.gitignore index d0d4223f..82b356ef 100644 --- a/.gitignore +++ b/.gitignore @@ -127,6 +127,7 @@ CSparse/Tcov/cov.sort CSparse/Tcov/cover.out CSparse/Tcov/covs.out CSparse/Tcov/cs_*.c +CSparse/Tcov/csparse_version.c CSparse/Tcov/cstcov_test CSparse/Tcov/*.out CSparse/Tcov/cs_demo1 @@ -138,6 +139,7 @@ CXSparse/Tcov/cov.sort CXSparse/Tcov/cover.out CXSparse/Tcov/covs.out CXSparse/Tcov/cs_*.c +CXSparse/Tcov/cxsparse_version.c CXSparse/Tcov/*.out CXSparse/Tcov/cs_demo1_ci CXSparse/Tcov/cs_demo1_cl @@ -168,7 +170,9 @@ SPQR/Tcov/gpu_results.txt SPQR/Tcov/gpuqrengine_demo SPQR/Tcov/qrdemo_gpu SPQR/Tcov/qrtest +SPQR/Tcov/qrtest32 SPQR/Tcov/qrtest_out.txt +SPQR/Tcov/qrtest_out32.txt SPQR/Tcov/troll.m SPQR/Tcov/cov.out diff --git a/AMD/CMakeLists.txt b/AMD/CMakeLists.txt index 4fdf6149..372e60e6 100644 --- a/AMD/CMakeLists.txt +++ b/AMD/CMakeLists.txt @@ -2,7 +2,7 @@ # SuiteSparse/AMD/CMakeLists.txt: cmake for AMD #------------------------------------------------------------------------------- -# Copyright (c) 1996-2022, Timothy A. Davis, Patrick Amestoy, Iain Duff. +# Copyright (c) 1996-2023, Timothy A. Davis, Patrick Amestoy, Iain Duff. # All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause @@ -10,12 +10,12 @@ # get the version #------------------------------------------------------------------------------- -cmake_minimum_required ( VERSION 3.19 ) +cmake_minimum_required ( VERSION 3.22 ) -set ( AMD_DATE "Jan 17, 2023" ) -set ( AMD_VERSION_MAJOR 3 ) -set ( AMD_VERSION_MINOR 0 ) -set ( AMD_VERSION_SUB 3 ) +set ( AMD_DATE "Mar 22, 2024" ) +set ( AMD_VERSION_MAJOR 3 CACHE STRING "" FORCE ) +set ( AMD_VERSION_MINOR 3 CACHE STRING "" FORCE ) +set ( AMD_VERSION_SUB 2 CACHE STRING "" FORCE ) message ( STATUS "Building AMD version: v" ${AMD_VERSION_MAJOR}. @@ -23,41 +23,38 @@ message ( STATUS "Building AMD version: v" ${AMD_VERSION_SUB} " (" ${AMD_DATE} ")" ) #------------------------------------------------------------------------------- -# SuiteSparse policies +# define the project #------------------------------------------------------------------------------- -set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${CMAKE_SOURCE_DIR}/cmake_modules - ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) - -include ( SuiteSparsePolicy ) +project ( AMD + VERSION "${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB}" + LANGUAGES C ) #------------------------------------------------------------------------------- -# define the project +# SuiteSparse policies #------------------------------------------------------------------------------- -if ( WIN32 ) - # disable Fortran in AMD when compiling on Windows - set ( NFORTRAN true ) -endif ( ) +set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} + ${PROJECT_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) + +include ( SuiteSparsePolicy ) -if ( NOT NFORTRAN ) +if ( SUITESPARSE_HAS_FORTRAN ) # Fortan is available and enabled - project ( amd - VERSION "${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB}" - LANGUAGES C Fortran ) -else ( ) - # no Fortran compiler available; do not compile Source/*.f or Demo/*.f - project ( amd - VERSION "${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB}" - LANGUAGES C ) + enable_language ( Fortran ) endif ( ) #------------------------------------------------------------------------------- # find library dependencies #------------------------------------------------------------------------------- -find_package ( SuiteSparse_config 7.0.0 REQUIRED ) +if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) + find_package ( SuiteSparse_config 7.7.0 + PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) + endif ( ) +endif ( ) #------------------------------------------------------------------------------- # configure files @@ -72,59 +69,91 @@ configure_file ( "Config/amd_version.tex.in" "${PROJECT_SOURCE_DIR}/Doc/amd_vers # include directories #------------------------------------------------------------------------------- -include_directories ( Source Include ${SUITESPARSE_CONFIG_INCLUDE_DIR} ) +include_directories ( Source Include ) #------------------------------------------------------------------------------- # dynamic amd library properties #------------------------------------------------------------------------------- -if ( NOT NFORTRAN ) +if ( SUITESPARSE_HAS_FORTRAN ) file ( GLOB AMD_SOURCES "Source/*.c" "Source/*.f" ) else ( ) file ( GLOB AMD_SOURCES "Source/*.c" ) endif ( ) -add_library ( amd SHARED ${AMD_SOURCES} ) -set_target_properties ( amd PROPERTIES - VERSION ${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB} - C_STANDARD_REQUIRED 11 - SOVERSION ${AMD_VERSION_MAJOR} - PUBLIC_HEADER "Include/amd.h" - WINDOWS_EXPORT_ALL_SYMBOLS ON ) +if ( BUILD_SHARED_LIBS ) + add_library ( AMD SHARED ${AMD_SOURCES} ) + set_target_properties ( AMD PROPERTIES + VERSION ${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB} + C_STANDARD 11 + C_STANDARD_REQUIRED ON + OUTPUT_NAME amd + SOVERSION ${AMD_VERSION_MAJOR} + PUBLIC_HEADER "Include/amd.h" + WINDOWS_EXPORT_ALL_SYMBOLS ON ) + + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) + set_target_properties ( AMD PROPERTIES EXPORT_NO_SYSTEM ON ) + endif ( ) + + target_include_directories ( AMD + INTERFACE $ + $ ) +endif ( ) #------------------------------------------------------------------------------- # static amd library properties #------------------------------------------------------------------------------- -if ( NOT NSTATIC ) - add_library ( amd_static STATIC ${AMD_SOURCES} ) - set_target_properties ( amd_static PROPERTIES - VERSION ${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB} - C_STANDARD_REQUIRED 11 +if ( BUILD_STATIC_LIBS ) + add_library ( AMD_static STATIC ${AMD_SOURCES} ) + set_target_properties ( AMD_static PROPERTIES + C_STANDARD 11 + C_STANDARD_REQUIRED ON OUTPUT_NAME amd - SOVERSION ${AMD_VERSION_MAJOR} ) + PUBLIC_HEADER "Include/amd.h" ) - if ( MSVC ) - set_target_properties ( amd_static PROPERTIES + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) + set_target_properties ( AMD_static PROPERTIES OUTPUT_NAME amd_static ) endif ( ) + + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) + set_target_properties ( AMD_static PROPERTIES EXPORT_NO_SYSTEM ON ) + endif ( ) + + target_include_directories ( AMD_static + INTERFACE $ + $ ) + endif ( ) #------------------------------------------------------------------------------- # add the library dependencies #------------------------------------------------------------------------------- -# suitesparseconfig: -target_link_libraries ( amd PUBLIC ${SUITESPARSE_CONFIG_LIBRARIES} ) -if ( NOT NSTATIC ) - target_link_libraries ( amd_static PUBLIC ${SUITESPARSE_CONFIG_STATIC} ) +# SuiteSparseConfig: +if ( BUILD_SHARED_LIBS ) + target_link_libraries ( AMD PRIVATE SuiteSparse::SuiteSparseConfig ) + target_include_directories ( AMD PUBLIC + "$" ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + if ( TARGET SuiteSparse::SuiteSparseConfig_static ) + target_link_libraries ( AMD_static PUBLIC SuiteSparse::SuiteSparseConfig_static ) + else ( ) + target_link_libraries ( AMD_static PUBLIC SuiteSparse::SuiteSparseConfig ) + endif ( ) endif ( ) # libm: if ( NOT WIN32 ) - target_link_libraries ( amd PUBLIC m ) - if ( NOT NSTATIC ) - target_link_libraries ( amd_static PUBLIC m ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( AMD PRIVATE m ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + set ( AMD_STATIC_LIBS "${AMD_STATIC_LIBS} -lm" ) + target_link_libraries ( AMD_static PUBLIC m ) endif ( ) endif ( ) @@ -132,25 +161,99 @@ endif ( ) # AMD installation location #------------------------------------------------------------------------------- -install ( TARGETS amd - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -install ( FILES ${CMAKE_SOURCE_DIR}/cmake_modules/FindAMD.cmake - DESTINATION ${SUITESPARSE_LIBDIR}/cmake/SuiteSparse - COMPONENT Development ) -if ( NOT NSTATIC ) - install ( TARGETS amd_static - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} ) +include ( CMakePackageConfigHelpers ) + +if ( BUILD_SHARED_LIBS ) + install ( TARGETS AMD + EXPORT AMDTargets + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + install ( TARGETS AMD_static + EXPORT AMDTargets + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) + +# create (temporary) export target file during build +export ( EXPORT AMDTargets + NAMESPACE SuiteSparse:: + FILE ${CMAKE_CURRENT_BINARY_DIR}/AMDTargets.cmake ) + +# install export target, config and version files for find_package +install ( EXPORT AMDTargets + NAMESPACE SuiteSparse:: + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/AMD ) + +# generate config file to be used in common build tree +set ( SUITESPARSE_IN_BUILD_TREE ON ) +configure_package_config_file ( + Config/AMDConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/AMDConfig.cmake + INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/AMDConfig.cmake ) + +# generate config file to be installed +set ( SUITESPARSE_IN_BUILD_TREE OFF ) +configure_package_config_file ( + Config/AMDConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/target/AMDConfig.cmake + INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/AMD ) + +write_basic_package_version_file ( + ${CMAKE_CURRENT_BINARY_DIR}/AMDConfigVersion.cmake + COMPATIBILITY SameMajorVersion ) + +install ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/target/AMDConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/AMDConfigVersion.cmake + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/AMD ) + +#------------------------------------------------------------------------------- +# create pkg-config file +#------------------------------------------------------------------------------- + +if ( NOT MSVC ) + set ( prefix "${CMAKE_INSTALL_PREFIX}" ) + set ( exec_prefix "\${prefix}" ) + cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) + if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) + set ( libdir "${SUITESPARSE_LIBDIR}") + else ( ) + set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") + endif ( ) + cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) + if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) + set ( includedir "${SUITESPARSE_INCLUDEDIR}") + else ( ) + set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") + endif ( ) + if ( BUILD_SHARED_LIBS ) + set ( SUITESPARSE_LIB_BASE_NAME $ ) + else ( ) + set ( SUITESPARSE_LIB_BASE_NAME $ ) + endif ( ) + configure_file ( + Config/AMD.pc.in + AMD.pc.out + @ONLY + NEWLINE_STYLE LF ) + file ( GENERATE + OUTPUT AMD.pc + INPUT ${CMAKE_CURRENT_BINARY_DIR}/AMD.pc.out + NEWLINE_STYLE LF ) + install ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/AMD.pc + DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) endif ( ) #------------------------------------------------------------------------------- # Demo library and programs #------------------------------------------------------------------------------- -option ( DEMO "ON: Build the demo programs. OFF (default): do not build the demo programs." off ) -if ( DEMO ) +if ( SUITESPARSE_DEMOS ) #--------------------------------------------------------------------------- # demo library @@ -166,19 +269,30 @@ if ( DEMO ) add_executable ( amd_l_demo "Demo/amd_l_demo.c" ) add_executable ( amd_demo2 "Demo/amd_demo2.c" ) add_executable ( amd_simple "Demo/amd_simple.c" ) - if ( NOT NFORTRAN ) + if ( SUITESPARSE_HAS_FORTRAN ) add_executable ( amd_f77demo "Demo/amd_f77demo.f" ) add_executable ( amd_f77simple "Demo/amd_f77simple.f" ) endif ( ) # Libraries required for Demo programs - target_link_libraries ( amd_demo PUBLIC amd ) - target_link_libraries ( amd_l_demo PUBLIC amd ) - target_link_libraries ( amd_demo2 PUBLIC amd ) - target_link_libraries ( amd_simple PUBLIC amd ) - if ( NOT NFORTRAN ) - target_link_libraries ( amd_f77demo PUBLIC amd ) - target_link_libraries ( amd_f77simple PUBLIC amd ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( amd_demo PUBLIC AMD ) + target_link_libraries ( amd_l_demo PUBLIC AMD ) + target_link_libraries ( amd_demo2 PUBLIC AMD ) + target_link_libraries ( amd_simple PUBLIC AMD ) + if ( SUITESPARSE_HAS_FORTRAN ) + target_link_libraries ( amd_f77demo PUBLIC AMD ) + target_link_libraries ( amd_f77simple PUBLIC AMD ) + endif ( ) + else ( ) + target_link_libraries ( amd_demo PUBLIC AMD_static ) + target_link_libraries ( amd_l_demo PUBLIC AMD_static ) + target_link_libraries ( amd_demo2 PUBLIC AMD_static ) + target_link_libraries ( amd_simple PUBLIC AMD_static ) + if ( SUITESPARSE_HAS_FORTRAN ) + target_link_libraries ( amd_f77demo PUBLIC AMD_static ) + target_link_libraries ( amd_f77simple PUBLIC AMD_static ) + endif ( ) endif ( ) else ( ) @@ -192,4 +306,3 @@ endif ( ) #------------------------------------------------------------------------------- include ( SuiteSparseReport ) - diff --git a/AMD/Config/AMD.pc.in b/AMD/Config/AMD.pc.in new file mode 100644 index 00000000..e5b50986 --- /dev/null +++ b/AMD/Config/AMD.pc.in @@ -0,0 +1,17 @@ +# AMD, Copyright (c) 1996-2023, Timothy A. Davis. +# All Rights Reserved. +# SPDX-License-Identifier: BSD-3-Clause + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: AMD +URL: https://github.com/DrTimothyAldenDavis/SuiteSparse +Description: Routines for permuting sparse matrices prior to factorization in SuiteSparse +Version: @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@.@AMD_VERSION_SUB@ +Requires.private: SuiteSparse_config +Libs: -L${libdir} -l@SUITESPARSE_LIB_BASE_NAME@ +Libs.private: @AMD_STATIC_LIBS@ +Cflags: -I${includedir} diff --git a/AMD/Config/AMDConfig.cmake.in b/AMD/Config/AMDConfig.cmake.in new file mode 100644 index 00000000..d21e0501 --- /dev/null +++ b/AMD/Config/AMDConfig.cmake.in @@ -0,0 +1,152 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/AMD/cmake_modules/AMDConfig.cmake +#------------------------------------------------------------------------------- + +# The following copyright and license applies to just this file only, not to +# the library itself: +# AMDConfig.cmake, Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +#------------------------------------------------------------------------------- + +# Finds the AMD include file and compiled library. +# The following targets are defined: +# SuiteSparse::AMD - for the shared library (if available) +# SuiteSparse::AMD_static - for the static library (if available) + +# For backward compatibility the following variables are set: + +# AMD_INCLUDE_DIR - where to find amd.h +# AMD_LIBRARY - dynamic AMD library +# AMD_STATIC - static AMD library +# AMD_LIBRARIES - libraries when using AMD +# AMD_FOUND - true if AMD found + +# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is +# installed. + +#------------------------------------------------------------------------------- + +@PACKAGE_INIT@ + +set ( AMD_DATE "@AMD_DATE@" ) +set ( AMD_VERSION_MAJOR @AMD_VERSION_MAJOR@ ) +set ( AMD_VERSION_MINOR @AMD_VERSION_MINOR@ ) +set ( AMD_VERSION_PATCH @AMD_VERSION_SUB@ ) +set ( AMD_VERSION "@AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@.@AMD_VERSION_SUB@" ) + +# Check for dependent targets +include ( CMakeFindDependencyMacro ) + +# Look for SuiteSparse_config target +if ( @SUITESPARSE_IN_BUILD_TREE@ ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + # First check in a common build tree + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ + PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) + # Then, check in the currently active CMAKE_MODULE_PATH + if ( NOT SuiteSparse_config_FOUND ) + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) + endif ( ) + endif ( ) +else ( ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) + endif ( ) +endif ( ) +if ( NOT SuiteSparse_config_FOUND ) + set ( AMD_FOUND OFF ) + return ( ) +endif ( ) + + +# Import target +include ( ${CMAKE_CURRENT_LIST_DIR}/AMDTargets.cmake ) + +# The following is only for backward compatibility with FindAMD. + +set ( _target_shared SuiteSparse::AMD ) +set ( _target_static SuiteSparse::AMD_static ) +set ( _var_prefix "AMD" ) + +if ( NOT @BUILD_SHARED_LIBS@ AND NOT TARGET ${_target_shared} ) + # make sure there is always an import target without suffix ) + add_library ( ${_target_shared} ALIAS ${_target_static} ) +endif ( ) + +get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) +if ( ${_var_prefix}_INCLUDE_DIR ) + # First item in SuiteSparse targets contains the "main" header directory. + list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) +endif ( ) +get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) +if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) +endif ( ) +if ( TARGET ${_target_static} ) + get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) +endif ( ) + +# Check for most common build types +set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) + +get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) +if ( _isMultiConfig ) + # For multi-configuration generators (e.g., Visual Studio), prefer those + # configurations. + list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) +else ( ) + # For single-configuration generators, prefer the current configuration. + list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) +endif ( ) + +list ( REMOVE_DUPLICATES _config_types ) + +foreach ( _config ${_config_types} ) + string ( TOUPPER ${_config} _uc_config ) + if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} + IMPORTED_IMPLIB_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) + endif ( ) + if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} + IMPORTED_LOCATION_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) + endif ( ) + if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) + get_target_property ( _library_chk ${_target_static} + IMPORTED_LOCATION_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_STATIC ${_library_chk} ) + endif ( ) + endif ( ) +endforeach ( ) + +set ( AMD_LIBRARIES ${AMD_LIBRARY} ) + +macro ( suitesparse_check_exist _var _files ) + # ignore generator expressions + string ( GENEX_STRIP "${_files}" _files2 ) + + foreach ( _file ${_files2} ) + if ( NOT EXISTS "${_file}" ) + message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) + endif ( ) + endforeach () +endmacro ( ) + +suitesparse_check_exist ( AMD_INCLUDE_DIR ${AMD_INCLUDE_DIR} ) +suitesparse_check_exist ( AMD_LIBRARY ${AMD_LIBRARY} ) + +message ( STATUS "AMD version: ${AMD_VERSION}" ) +message ( STATUS "AMD include: ${AMD_INCLUDE_DIR}") +message ( STATUS "AMD library: ${AMD_LIBRARY}") +message ( STATUS "AMD static: ${AMD_STATIC}") diff --git a/AMD/Config/amd.h.in b/AMD/Config/amd.h.in index f2a69166..956af010 100644 --- a/AMD/Config/amd.h.in +++ b/AMD/Config/amd.h.in @@ -2,7 +2,7 @@ // AMD/Include/amd.h: approximate minimum degree ordering //------------------------------------------------------------------------------ -// AMD, Copyright (c) 1996-2022, Timothy A. Davis, Patrick R. Amestoy, and +// AMD, Copyright (c) 1996-2024, Timothy A. Davis, Patrick R. Amestoy, and // Iain S. Duff. All Rights Reserved. // SPDX-License-Identifier: BSD-3-clause @@ -35,13 +35,13 @@ #ifndef AMD_H #define AMD_H +#include "SuiteSparse_config.h" + /* make it easy for C++ programs to include AMD */ #ifdef __cplusplus extern "C" { #endif -#include "SuiteSparse_config.h" - int amd_order /* returns AMD_OK, AMD_OK_BUT_JUMBLED, * AMD_INVALID, or AMD_OUT_OF_MEMORY */ ( @@ -313,6 +313,14 @@ void amd_l_control (double Control [ ]) ; void amd_info (double Info [ ]) ; void amd_l_info (double Info [ ]) ; +// amd_version: return AMD version. The version array is returned with +// version [0..2] = {AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION} +void amd_version (int version [3]) ; + +#ifdef __cplusplus +} +#endif + #define AMD_CONTROL 5 /* size of Control array */ #define AMD_INFO 20 /* size of Info array */ @@ -379,11 +387,13 @@ void amd_l_info (double Info [ ]) ; #define AMD_SUB_VERSION @AMD_VERSION_MINOR@ #define AMD_SUBSUB_VERSION @AMD_VERSION_SUB@ -#define AMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) -#define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION,AMD_SUB_VERSION) +#define AMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) +#define AMD_VERSION AMD_VERSION_CODE(@AMD_VERSION_MAJOR@,@AMD_VERSION_MINOR@) -#ifdef __cplusplus -} +#define AMD__VERSION SUITESPARSE__VERCODE(@AMD_VERSION_MAJOR@,@AMD_VERSION_MINOR@,@AMD_VERSION_SUB@) +#if !defined (SUITESPARSE__VERSION) || \ + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@.@AMD_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" #endif #endif diff --git a/AMD/Demo/amd_demo.c b/AMD/Demo/amd_demo.c index 507ab7cc..b599d06d 100644 --- a/AMD/Demo/amd_demo.c +++ b/AMD/Demo/amd_demo.c @@ -52,14 +52,17 @@ int main (void) double Control [AMD_CONTROL], Info [AMD_INFO] ; char A [24][24] ; - /* here is an example of how to use AMD_VERSION. This code will work in - * any version of AMD. */ -#if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE(1,2)) printf ("AMD version %d.%d.%d, date: %s\n", AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE) ; -#else - printf ("AMD version: 1.1 or earlier\n") ; -#endif + int version [3] ; + amd_version (version) ; + if ((version [0] != AMD_MAIN_VERSION) || + (version [1] != AMD_SUB_VERSION) || + (version [2] != AMD_SUBSUB_VERSION)) + { + fprintf (stderr, "version in header does not match library\n") ; + abort ( ) ; + } printf ("AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24:\n") ; diff --git a/AMD/Demo/amd_demo.out b/AMD/Demo/amd_demo.out index 8180f3a8..0422dc5b 100644 --- a/AMD/Demo/amd_demo.out +++ b/AMD/Demo/amd_demo.out @@ -1,7 +1,7 @@ -AMD version 3.0.3, date: Jan 17, 2023 +AMD version 3.3.2, date: Mar 22, 2024 AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24: -AMD version 3.0.3, Jan 17, 2023: approximate minimum degree ordering +AMD version 3.3.2, Mar 22, 2024: approximate minimum degree ordering dense row parameter: 10 (rows with more than max (10 * sqrt (n), 16) entries are considered "dense", and placed last in output permutation) @@ -115,7 +115,7 @@ Plot of input matrix pattern: 23: . . . . . . X . . . . X X . . . . . . . . . . X return value from amd_order: 0 (should be 0) -AMD version 3.0.3, Jan 17, 2023, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 24 nz, number of nonzeros in A: 160 diff --git a/AMD/Demo/amd_demo2.out b/AMD/Demo/amd_demo2.out index aebf70ab..f384d828 100644 --- a/AMD/Demo/amd_demo2.out +++ b/AMD/Demo/amd_demo2.out @@ -1,7 +1,7 @@ AMD demo, with a jumbled version of the 24-by-24 Harwell/Boeing matrix, can_24: -AMD version 3.0.3, Jan 17, 2023: approximate minimum degree ordering +AMD version 3.3.2, Mar 22, 2024: approximate minimum degree ordering dense row parameter: 10 (rows with more than max (10 * sqrt (n), 16) entries are considered "dense", and placed last in output permutation) @@ -144,7 +144,7 @@ Plot of symmetric matrix to be ordered by amd_order: 23: . . . . . . X . . . . X X . . . . . . . . . . X return value from amd_order: 1 (should be 1) -AMD version 3.0.3, Jan 17, 2023, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 24 nz, number of nonzeros in A: 102 diff --git a/AMD/Demo/amd_l_demo.c b/AMD/Demo/amd_l_demo.c index 7def82c7..ff5816ae 100644 --- a/AMD/Demo/amd_l_demo.c +++ b/AMD/Demo/amd_l_demo.c @@ -53,14 +53,17 @@ int main (void) double Control [AMD_CONTROL], Info [AMD_INFO] ; char A [24][24] ; - /* here is an example of how to use AMD_VERSION. This code will work in - * any version of AMD. */ -#if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE(1,2)) printf ("AMD version %d.%d.%d, date: %s\n", AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE) ; -#else - printf ("AMD version: 1.1 or earlier\n") ; -#endif + int version [3] ; + amd_version (version) ; + if ((version [0] != AMD_MAIN_VERSION) || + (version [1] != AMD_SUB_VERSION) || + (version [2] != AMD_SUBSUB_VERSION)) + { + fprintf (stderr, "version in header does not match library\n") ; + abort ( ) ; + } printf ("AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24:\n") ; diff --git a/AMD/Demo/amd_l_demo.out b/AMD/Demo/amd_l_demo.out index 5265f5a0..019ce0ce 100644 --- a/AMD/Demo/amd_l_demo.out +++ b/AMD/Demo/amd_l_demo.out @@ -1,7 +1,7 @@ -AMD version 3.0.3, date: Jan 17, 2023 +AMD version 3.3.2, date: Mar 22, 2024 AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24: -AMD version 3.0.3, Jan 17, 2023: approximate minimum degree ordering +AMD version 3.3.2, Mar 22, 2024: approximate minimum degree ordering dense row parameter: 10 (rows with more than max (10 * sqrt (n), 16) entries are considered "dense", and placed last in output permutation) @@ -115,7 +115,7 @@ Plot of input matrix pattern: 23: . . . . . . X . . . . X X . . . . . . . . . . X return value from amd_l_order: 0 (should be 0) -AMD version 3.0.3, Jan 17, 2023, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 24 nz, number of nonzeros in A: 160 diff --git a/AMD/Doc/AMD_UserGuide.pdf b/AMD/Doc/AMD_UserGuide.pdf index 4cdcddc59eb4fa4bc59d7e5c683c465d11a8bbf9..7b3fd6bf6a243c92793e131a0e79a6f749b92942 100644 GIT binary patch delta 58612 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 d(D4_sY&Z-1H19v)1aLfDtZ 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 SU@1_zxdc#XX{A+VQ2qnq(F1(| diff --git a/AMD/Doc/AMD_UserGuide.tex b/AMD/Doc/AMD_UserGuide.tex index 2e5e1ede..794a29cd 100644 --- a/AMD/Doc/AMD_UserGuide.tex +++ b/AMD/Doc/AMD_UserGuide.tex @@ -46,7 +46,7 @@ \end{abstract} %------------------------------------------------------------------------------ -AMD Copyright\copyright 1996-2022 by Timothy A. +AMD Copyright\copyright 1996-2023 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. @@ -202,8 +202,8 @@ \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 +The C-callable AMD library consists of eight user-callable routines and one +include file. There are two versions of seven of the routines, with \verb'int32_t' and \verb'int64_t' integers. The routines with prefix {\tt amd\_l\_} use \verb'int64_t' integer arguments; the others use @@ -303,6 +303,8 @@ \section{Using AMD in a C program} 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. +\item \verb'amd_version': returns the AMD version. + \end{itemize} The nonzero pattern of the matrix $\m{A}$ is represented in compressed column @@ -480,6 +482,16 @@ \section{Synopsis of C-callable routines} \end{verbatim} } +The \verb'amd_version' function uses plain \verb'int': + +{\footnotesize +\begin{verbatim} +#include "amd.h" +int version [3] ; +amd_version (version) ; +\end{verbatim} +} + %------------------------------------------------------------------------------ \section{Using AMD in a Fortran program} %------------------------------------------------------------------------------ diff --git a/AMD/Doc/ChangeLog b/AMD/Doc/ChangeLog index 97dbc0d8..134b5ca9 100644 --- a/AMD/Doc/ChangeLog +++ b/AMD/Doc/ChangeLog @@ -1,3 +1,29 @@ +Mar 22, 2024: version 3.3.2 + + * minor updates to build system + +Jan 10, 2024: version 3.3.1 + + * minor updates to build system + +Dec 30, 2023: version 3.3.0 + + * major change to build system: by Markus Mützel + * revised test for integer overflow: for CHOLMOD 5.1.0 tests + * amd_version: added to return version of AMD + +Sept 18, 2023: version 3.2.1 + + * cmake update: add "None" build type, from Antonio Rojas, for Arch Linux + +Sept 8, 2023: version 3.2.0 + + * cmake updates: SuiteSparse:: namespace by Markus Muetzel + +June 16, 2023: version 3.0.4 + + * cmake build system updates: update by Markus Muetzel + Jan 17, 2023: version 3.0.3 * NFORTRAN: option added to disable Fortran entirely diff --git a/AMD/Doc/amd_version.tex b/AMD/Doc/amd_version.tex index e24c8cda..c36dbd40 100644 --- a/AMD/Doc/amd_version.tex +++ b/AMD/Doc/amd_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/AMD -\date{VERSION 3.0.3, Jan 17, 2023} +\date{VERSION 3.3.2, Mar 22, 2024} diff --git a/AMD/Include/amd.h b/AMD/Include/amd.h index 94aa96f1..a253a310 100644 --- a/AMD/Include/amd.h +++ b/AMD/Include/amd.h @@ -2,7 +2,7 @@ // AMD/Include/amd.h: approximate minimum degree ordering //------------------------------------------------------------------------------ -// AMD, Copyright (c) 1996-2022, Timothy A. Davis, Patrick R. Amestoy, and +// AMD, Copyright (c) 1996-2024, Timothy A. Davis, Patrick R. Amestoy, and // Iain S. Duff. All Rights Reserved. // SPDX-License-Identifier: BSD-3-clause @@ -35,13 +35,13 @@ #ifndef AMD_H #define AMD_H +#include "SuiteSparse_config.h" + /* make it easy for C++ programs to include AMD */ #ifdef __cplusplus extern "C" { #endif -#include "SuiteSparse_config.h" - int amd_order /* returns AMD_OK, AMD_OK_BUT_JUMBLED, * AMD_INVALID, or AMD_OUT_OF_MEMORY */ ( @@ -313,6 +313,14 @@ void amd_l_control (double Control [ ]) ; void amd_info (double Info [ ]) ; void amd_l_info (double Info [ ]) ; +// amd_version: return AMD version. The version array is returned with +// version [0..2] = {AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION} +void amd_version (int version [3]) ; + +#ifdef __cplusplus +} +#endif + #define AMD_CONTROL 5 /* size of Control array */ #define AMD_INFO 20 /* size of Info array */ @@ -374,16 +382,18 @@ void amd_l_info (double Info [ ]) ; * Versions 1.1 and earlier of AMD do not include a #define'd version number. */ -#define AMD_DATE "Jan 17, 2023" +#define AMD_DATE "Mar 22, 2024" #define AMD_MAIN_VERSION 3 -#define AMD_SUB_VERSION 0 -#define AMD_SUBSUB_VERSION 3 +#define AMD_SUB_VERSION 3 +#define AMD_SUBSUB_VERSION 2 -#define AMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) -#define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION,AMD_SUB_VERSION) +#define AMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) +#define AMD_VERSION AMD_VERSION_CODE(3,3) -#ifdef __cplusplus -} +#define AMD__VERSION SUITESPARSE__VERCODE(3,3,2) +#if !defined (SUITESPARSE__VERSION) || \ + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "AMD 3.3.2 requires SuiteSparse_config 7.7.0 or later" #endif #endif diff --git a/AMD/Include/amd_internal.h b/AMD/Include/amd_internal.h index 85d43930..b5649cbc 100644 --- a/AMD/Include/amd_internal.h +++ b/AMD/Include/amd_internal.h @@ -2,7 +2,7 @@ // AMD/Include/amd_internal.h: internal definitions for AMD //------------------------------------------------------------------------------ -// AMD, Copyright (c) 1996-2022, Timothy A. Davis, Patrick R. Amestoy, and +// AMD, Copyright (c) 1996-2023, Timothy A. Davis, Patrick R. Amestoy, and // Iain S. Duff. All Rights Reserved. // SPDX-License-Identifier: BSD-3-clause @@ -37,12 +37,9 @@ #define NDEBUG #endif -/* - To enable debugging, uncomment the following line: -#undef NDEBUG -*/ +// To enable debugging, uncomment the following line: +// #undef NDEBUG -#define SUITESPARSE_LIBRARY #include "amd.h" /* ------------------------------------------------------------------------- */ diff --git a/AMD/Makefile b/AMD/Makefile index ad08cc1d..15da7cea 100644 --- a/AMD/Makefile +++ b/AMD/Makefile @@ -36,36 +36,36 @@ default: library # default is to install only in /usr/local library: - ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . --config Release -j${JOBS} ) # install only in SuiteSparse/lib and SuiteSparse/include local: - ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=1 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=1 .. && cmake --build . --config Release -j${JOBS} ) # install only in /usr/local (default) global: - ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=0 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=0 .. && cmake --build . --config Release -j${JOBS} ) debug: - ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . --config Debug -j${JOBS} ) all: library demos: library - ( cd build && cmake $(CMAKE_OPTIONS) -DDEMO=1 .. && cmake --build . -j${JOBS} ) - ./build/amd_demo > build/amd_demo.out - - diff --strip-trailing-cr Demo/amd_demo.out build/amd_demo.out - ./build/amd_l_demo > build/amd_l_demo.out - - diff --strip-trailing-cr Demo/amd_l_demo.out build/amd_l_demo.out - ./build/amd_demo2 > build/amd_demo2.out - - diff --strip-trailing-cr Demo/amd_demo2.out build/amd_demo2.out - ./build/amd_simple > build/amd_simple.out - - diff --strip-trailing-cr Demo/amd_simple.out build/amd_simple.out + ( cd build && cmake $(CMAKE_OPTIONS) -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j${JOBS} ) + ./build/amd_demo > build/amd_demo.out && ( command -v d2u && d2u ./build/amd_demo.out || true ) + - diff Demo/amd_demo.out build/amd_demo.out + ./build/amd_l_demo > build/amd_l_demo.out && ( command -v d2u && d2u ./build/amd_l_demo.out || true ) + - diff Demo/amd_l_demo.out build/amd_l_demo.out + ./build/amd_demo2 > build/amd_demo2.out && ( command -v d2u && d2u ./build/amd_demo2.out || true ) + - diff Demo/amd_demo2.out build/amd_demo2.out + ./build/amd_simple > build/amd_simple.out && ( command -v d2u && d2u ./build/amd_simple.out || true ) + - diff Demo/amd_simple.out build/amd_simple.out # Fortran demos will fail if no Fortran compiler is available - - ./build/amd_f77simple > build/amd_f77simple.out - - diff --strip-trailing-cr Demo/amd_f77simple.out build/amd_f77simple.out - - ./build/amd_f77demo > build/amd_f77demo.out - - diff --strip-trailing-cr Demo/amd_f77demo.out build/amd_f77demo.out + - ./build/amd_f77simple > build/amd_f77simple.out && ( command -v d2u && d2u ./build/amd_f77simple.out || true ) + - diff Demo/amd_f77simple.out build/amd_f77simple.out + - ./build/amd_f77demo > build/amd_f77demo.out && ( command -v d2u && d2u ./build/amd_f77demo.out || true ) + - diff Demo/amd_f77demo.out build/amd_f77demo.out # just compile after running cmake; do not run cmake again remake: diff --git a/AMD/Source/amd_order.c b/AMD/Source/amd_order.c index 1dcc15a0..9df32164 100644 --- a/AMD/Source/amd_order.c +++ b/AMD/Source/amd_order.c @@ -71,9 +71,9 @@ int AMD_order 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)) + /* check if n or nz will cause integer overflow */ + if (((size_t) n) >= Int_MAX / sizeof (Int) + || ((size_t) nz) >= Int_MAX / sizeof (Int)) { if (info) Info [AMD_STATUS] = AMD_OUT_OF_MEMORY ; return (AMD_OUT_OF_MEMORY) ; /* problem too large */ @@ -89,8 +89,9 @@ int AMD_order } /* allocate two size-n integer workspaces */ - Len = SuiteSparse_malloc (n, sizeof (Int)) ; - Pinv = SuiteSparse_malloc (n, sizeof (Int)) ; + size_t nn = (size_t) n ; + Len = SuiteSparse_malloc (nn, sizeof (Int)) ; + Pinv = SuiteSparse_malloc (nn, sizeof (Int)) ; mem += n ; mem += n ; if (!Len || !Pinv) @@ -106,7 +107,7 @@ int AMD_order { /* sort the input matrix and remove duplicate entries */ AMD_DEBUG1 (("Matrix is jumbled\n")) ; - Rp = SuiteSparse_malloc (n+1, sizeof (Int)) ; + Rp = SuiteSparse_malloc (nn+1, sizeof (Int)) ; Ri = SuiteSparse_malloc (nz, sizeof (Int)) ; mem += (n+1) ; mem += MAX (nz,1) ; @@ -152,8 +153,8 @@ int AMD_order 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 */ + ok = ((slen + nn) > slen) ; /* check for size_t overflow */ + slen += nn ; /* size-n elbow room, 6 size-n work */ } mem += slen ; ok = ok && (slen < SIZE_T_MAX / sizeof (Int)) ; /* check for overflow */ diff --git a/AMD/Source/amd_version.c b/AMD/Source/amd_version.c new file mode 100644 index 00000000..7d045f35 --- /dev/null +++ b/AMD/Source/amd_version.c @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------ +// AMD/Source/amd_version: return AMD version +//------------------------------------------------------------------------------ + +// AMD, Copyright (c) 1996-2023, Timothy A. Davis, Patrick R. Amestoy, and +// Iain S. Duff. All Rights Reserved. +// SPDX-License-Identifier: BSD-3-clause + +//------------------------------------------------------------------------------ + +#include "amd_internal.h" + +void amd_version (int version [3]) +{ + version [0] = AMD_MAIN_VERSION ; + version [1] = AMD_SUB_VERSION ; + version [2] = AMD_SUBSUB_VERSION ; +} + diff --git a/AMD/cmake_modules/FindAMD.cmake b/AMD/cmake_modules/FindAMD.cmake deleted file mode 100644 index 1b135e05..00000000 --- a/AMD/cmake_modules/FindAMD.cmake +++ /dev/null @@ -1,129 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/AMD/cmake_modules/FindAMD.cmake -#------------------------------------------------------------------------------- - -# The following copyright and license applies to just this file only, not to -# the library itself: -# FindAMD.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# Finds the AMD include file and compiled library and sets: - -# AMD_INCLUDE_DIR - where to find amd.h -# AMD_LIBRARY - dynamic AMD library -# AMD_STATIC - static AMD library -# AMD_LIBRARIES - libraries when using AMD -# AMD_FOUND - true if AMD found - -# set ``AMD_ROOT`` to an AMD installation root to -# tell this module where to look. - -# All the Find*.cmake files in SuiteSparse are installed by 'make install' into -# /usr/local/lib/cmake/SuiteSparse (where '/usr/local' is the -# ${CMAKE_INSTALL_PREFIX}). To access this file, place the following commands -# in your CMakeLists.txt file. See also SuiteSparse/Example/CMakeLists.txt: -# -# set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} -# ${CMAKE_INSTALL_PREFIX}/lib/cmake/SuiteSparse ) - -#------------------------------------------------------------------------------- - -# include files for AMD -find_path ( AMD_INCLUDE_DIR - NAMES amd.h - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/AMD - HINTS ${CMAKE_SOURCE_DIR}/../AMD - PATH_SUFFIXES include Include -) - -# dynamic AMD library (or static if no dynamic library was built) -find_library ( AMD_LIBRARY - NAMES amd amd_static - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/AMD - HINTS ${CMAKE_SOURCE_DIR}/../AMD - PATH_SUFFIXES lib build build/Release build/Debug -) - -if ( MSVC ) - set ( STATIC_NAME amd_static ) -else ( ) - set ( STATIC_NAME amd ) - set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) - set ( CMAKE_FIND_LIBRARY_SUFFIXES - ${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) -endif ( ) - -# static AMD library -find_library ( AMD_STATIC - NAMES ${STATIC_NAME} - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/AMD - HINTS ${CMAKE_SOURCE_DIR}/../AMD - PATH_SUFFIXES lib build build/Release build/Debug -) - -if ( NOT MSVC ) - # restore the CMAKE_FIND_LIBRARY_SUFFIXES variable - set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) -endif ( ) - -# get version of the library from the dynamic library name -get_filename_component ( AMD_LIBRARY ${AMD_LIBRARY} REALPATH ) -get_filename_component ( AMD_FILENAME ${AMD_LIBRARY} NAME ) -string ( - REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" - AMD_VERSION - ${AMD_FILENAME} -) - -# set ( AMD_VERSION "" ) -if ( EXISTS "${AMD_INCLUDE_DIR}" AND NOT AMD_VERSION ) - # if the version does not appear in the filename, read the include file - file ( STRINGS ${AMD_INCLUDE_DIR}/amd.h AMD_MAJOR_STR - REGEX "define AMD_MAIN_VERSION" ) - file ( STRINGS ${AMD_INCLUDE_DIR}/amd.h AMD_MINOR_STR - REGEX "define AMD_SUB_VERSION" ) - file ( STRINGS ${AMD_INCLUDE_DIR}/amd.h AMD_PATCH_STR - REGEX "define AMD_SUBSUB_VERSION" ) - message ( STATUS "major: ${AMD_MAJOR_STR}" ) - message ( STATUS "minor: ${AMD_MINOR_STR}" ) - message ( STATUS "patch: ${AMD_PATCH_STR}" ) - string ( REGEX MATCH "[0-9]+" AMD_MAJOR ${AMD_MAJOR_STR} ) - string ( REGEX MATCH "[0-9]+" AMD_MINOR ${AMD_MINOR_STR} ) - string ( REGEX MATCH "[0-9]+" AMD_PATCH ${AMD_PATCH_STR} ) - set (AMD_VERSION "${AMD_MAJOR}.${AMD_MINOR}.${AMD_PATCH}") -endif ( ) - -set ( AMD_LIBRARIES ${AMD_LIBRARY} ) - -include (FindPackageHandleStandardArgs) - -find_package_handle_standard_args ( AMD - REQUIRED_VARS AMD_LIBRARY AMD_INCLUDE_DIR - VERSION_VAR AMD_VERSION -) - -mark_as_advanced ( - AMD_INCLUDE_DIR - AMD_LIBRARY - AMD_STATIC - AMD_LIBRARIES -) - -if ( AMD_FOUND ) - message ( STATUS "AMD version: ${AMD_VERSION}" ) - message ( STATUS "AMD include: ${AMD_INCLUDE_DIR}") - message ( STATUS "AMD library: ${AMD_LIBRARY}") - message ( STATUS "AMD static: ${AMD_STATIC}") -else ( ) - message ( STATUS "AMD not found" ) - set ( AMD_INCLUDE_DIR "" ) - set ( AMD_LIBRARIES "" ) - set ( AMD_LIBRARY "" ) - set ( AMD_STATIC "" ) -endif ( ) - diff --git a/CITATION.bib b/CITATION.bib new file mode 100644 index 00000000..54df4255 --- /dev/null +++ b/CITATION.bib @@ -0,0 +1,91 @@ + +@article{10.1145/1024074.1024081, +author = {Amestoy, Patrick R. and Davis, Timothy A. and Duff, Iain S.}, +title = {Algorithm 837: AMD, an Approximate Minimum Degree Ordering Algorithm}, +year = {2004}, +issue_date = {September 2004}, +publisher = {Association for Computing Machinery}, +address = {New York, NY, USA}, +volume = {30}, +number = {3}, +issn = {0098-3500}, +url = {https://doi.org/10.1145/1024074.1024081}, +doi = {10.1145/1024074.1024081}, +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.}, +journal = {ACM Trans. Math. Softw.}, +month = {sep}, +pages = {381–388}, +numpages = {8}, +keywords = {sparse matrices, Linear equations, ordering methods, minimum degree} +} + +@article{doi:10.1137/S0895479894278952, +author = {Amestoy, Patrick R. and Davis, Timothy A. and Duff, Iain S.}, +title = {An Approximate Minimum Degree Ordering Algorithm}, +journal = {SIAM Journal on Matrix Analysis and Applications}, +volume = {17}, +number = {4}, +pages = {886-905}, +year = {1996}, +doi = {10.1137/S0895479894278952}, +URL = { https://doi.org/10.1137/S0895479894278952 }, +eprint = { https://doi.org/10.1137/S0895479894278952 } , + abstract = { Abstract. An approximate minimum degree (AMD), ordering algorithm for preordering a symmetric sparse matrix prior to numerical factorization is presented. We use techniques based on the quotient graph for matrix factorization that allow us to obtain computationally cheap bounds for the minimum degree. We show that these bounds are often equal to the actual degree. The resulting algorithm is typically much faster than previous minimum degree ordering algorithms and produces results that are comparable in quality with the best orderings from other minimum degree algorithms. } +} + + +@article{10.1145/1024074.1024080, +author = {Davis, Timothy A. and Gilbert, John R. and Larimore, Stefan I. and Ng, Esmond G.}, +title = {Algorithm 836: COLAMD, a Column Approximate Minimum Degree Ordering Algorithm}, +year = {2004}, +issue_date = {September 2004}, +publisher = {Association for Computing Machinery}, +address = {New York, NY, USA}, +volume = {30}, +number = {3}, +issn = {0098-3500}, +url = {https://doi.org/10.1145/1024074.1024080}, +doi = {10.1145/1024074.1024080}, +abstract = {Two codes are discussed, COLAMD and SYMAMD, that compute approximate minimum degree orderings for sparse matrices in two contexts: (1) sparse partial pivoting, which requires a sparsity preserving column pre-ordering prior to numerical factorization, and (2) sparse Cholesky factorization, which requires a symmetric permutation of both the rows and columns of the matrix being factorized. These orderings are computed by COLAMD and SYMAMD, respectively. The ordering from COLAMD is also suitable for sparse QR factorization, and the factorization of matrices of the form ATA and AAT, such as those that arise in least-squares problems and interior point methods for linear programming problems. The two routines are available both in MATLAB and C-callable forms. They appear as built-in routines in MATLAB Version 6.0.}, +journal = {ACM Trans. Math. Softw.}, +month = {sep}, +pages = {377–380}, +numpages = {4}, +keywords = {sparse nonsymmetric matrices, ordering methods, Linear equations} +} + +@article{10.1145/1024074.1024079, +author = {Davis, Timothy A. and Gilbert, John R. and Larimore, Stefan I. and Ng, Esmond G.}, +title = {A Column Approximate Minimum Degree Ordering Algorithm}, +year = {2004}, +issue_date = {September 2004}, +publisher = {Association for Computing Machinery}, +address = {New York, NY, USA}, +volume = {30}, +number = {3}, +issn = {0098-3500}, +url = {https://doi.org/10.1145/1024074.1024079}, +doi = {10.1145/1024074.1024079}, +abstract = {Sparse Gaussian elimination with partial pivoting computes the factorization PAQ = LU of a sparse matrix A, where the row ordering P is selected during factorization using standard partial pivoting with row interchanges. The goal is to select a column preordering, Q, based solely on the nonzero pattern of A, that limits the worst-case number of nonzeros in the factorization. The fill-in also depends on P, but Q is selected to reduce an upper bound on the fill-in for any subsequent choice of P. The choice of Q can have a dramatic impact on the number of nonzeros in L and U. One scheme for determining a good column ordering for A is to compute a symmetric ordering that reduces fill-in in the Cholesky factorization of ATA. A conventional minimum degree ordering algorithm would require the sparsity structure of ATA to be computed, which can be expensive both in terms of space and time since ATA may be much denser than A. An alternative is to compute Q directly from the sparsity structure of A; this strategy is used by MATLAB's COLMMD preordering algorithm. A new ordering algorithm, COLAMD, is presented. It is based on the same strategy but uses a better ordering heuristic. COLAMD is faster and computes better orderings, with fewer nonzeros in the factors of the matrix.}, +journal = {ACM Trans. Math. Softw.}, +month = {sep}, +pages = {353–376}, +numpages = {24}, +keywords = {linear equations, Sparse nonsymmetric matrices, ordering methods} +} + +@article{10.1145/3519024, +author = {Lourenco, Christopher and Chen, Jinhao and Moreno-Centeno, Erick and Davis, Timothy A.}, +title = {Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via a Sparse Left-Looking Integer-Preserving LU Factorization}, +year = {2022}, +publisher = {Association for Computing Machinery}, +address = {New York, NY, USA}, +issn = {0098-3500}, +url = {https://doi.org/10.1145/3519024}, +doi = {10.1145/3519024}, +abstract = {SPEX Left LU is a software package for exactly solving unsymmetric sparse linear systems. As a component of the sparse exact (SPEX) software package, SPEX Left LU can be applied to any input matrix, A, whose entries are integral, rational, or decimal, and provides a solution to the system Ax = b which is either exact or accurate to user-specified precision. SPEX Left LU preorders the matrix A with a user-specified fill-reducing ordering and computes a left-looking LU factorization with the special property that each operation used to compute the L and U matrices is integral. Notable additional applications of this package include benchmarking the stability and accuracy of state-of-the-art linear solvers, and determining whether singular-to-double-precision matrices are indeed singular. Computationally, this paper evaluates the impact of several novel pivoting schemes in exact arithmetic, benchmarks the exact iterative solvers within Linbox, and benchmarks the accuracy of MATLAB sparse backslash. Most importantly, it is shown that SPEX Left LU outperforms the exact iterative solvers in run time on easy instances and in stability as the iterative solver fails on a sizeable subset of the tested (both easy and hard) instances. The SPEX Left LU package is written in ANSI C, comes with a MATLAB interface, and is distributed via GitHub, as a component of the SPEX software package, and as a component of SuiteSparse.}, +journal = {ACM Trans. Math. Softw.}, +month = {jun}, +keywords = {exact matrix factorization, sparse linear systems, sparse matrix algorithms, exactly solving linear systems, roundoff errors} +} + diff --git a/COLAMD/CMakeLists.txt b/COLAMD/CMakeLists.txt index 0f9603c9..4d4b17cf 100644 --- a/COLAMD/CMakeLists.txt +++ b/COLAMD/CMakeLists.txt @@ -2,19 +2,19 @@ # SuiteSparse/COLAMD/CMakeLists.txt: cmake for COLAMD #------------------------------------------------------------------------------- -# Copyright (c) 1998-2023, Timothy A. Davis. All Rights Reserved. +# Copyright (c) 1998-2024, Timothy A. Davis. All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- # get the version #------------------------------------------------------------------------------- -cmake_minimum_required ( VERSION 3.19 ) +cmake_minimum_required ( VERSION 3.22 ) -set ( COLAMD_DATE "Jan 17, 2023" ) -set ( COLAMD_VERSION_MAJOR 3 ) -set ( COLAMD_VERSION_MINOR 0 ) -set ( COLAMD_VERSION_SUB 3 ) +set ( COLAMD_DATE "Mar 22, 2024" ) +set ( COLAMD_VERSION_MAJOR 3 CACHE STRING "" FORCE ) +set ( COLAMD_VERSION_MINOR 3 CACHE STRING "" FORCE ) +set ( COLAMD_VERSION_SUB 3 CACHE STRING "" FORCE ) message ( STATUS "Building COLAMD version: v" ${COLAMD_VERSION_MAJOR}. @@ -22,28 +22,33 @@ message ( STATUS "Building COLAMD version: v" ${COLAMD_VERSION_SUB} " (" ${COLAMD_DATE} ")" ) #------------------------------------------------------------------------------- -# SuiteSparse policies +# define the project #------------------------------------------------------------------------------- -set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${CMAKE_SOURCE_DIR}/cmake_modules - ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) - -include ( SuiteSparsePolicy ) +project ( COLAMD + VERSION "${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB}" + LANGUAGES C ) #------------------------------------------------------------------------------- -# define the project +# SuiteSparse policies #------------------------------------------------------------------------------- -project ( colamd - VERSION "${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB}" - LANGUAGES C ) +set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} + ${PROJECT_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) + +include ( SuiteSparsePolicy ) #------------------------------------------------------------------------------- # find library dependencies #------------------------------------------------------------------------------- -find_package ( SuiteSparse_config 7.0.0 REQUIRED ) +if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) + find_package ( SuiteSparse_config 7.7.0 + PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) + endif ( ) +endif ( ) #------------------------------------------------------------------------------- # configure files @@ -57,7 +62,7 @@ configure_file ( "Config/colamd.h.in" # include directories #------------------------------------------------------------------------------- -include_directories ( Source Include ${SUITESPARSE_CONFIG_INCLUDE_DIR} ) +include_directories ( Source Include ) #------------------------------------------------------------------------------- # dynamic colamd library properties @@ -65,48 +70,79 @@ include_directories ( Source Include ${SUITESPARSE_CONFIG_INCLUDE_DIR} ) file ( GLOB COLAMD_SOURCES "Source/*.c" ) -add_library ( colamd SHARED ${COLAMD_SOURCES} ) +if ( BUILD_SHARED_LIBS ) + add_library ( COLAMD SHARED ${COLAMD_SOURCES} ) + + set_target_properties ( COLAMD PROPERTIES + VERSION ${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB} + C_STANDARD 11 + C_STANDARD_REQUIRED ON + OUTPUT_NAME colamd + SOVERSION ${COLAMD_VERSION_MAJOR} + PUBLIC_HEADER "Include/colamd.h" + WINDOWS_EXPORT_ALL_SYMBOLS ON ) + + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) + set_target_properties ( COLAMD PROPERTIES EXPORT_NO_SYSTEM ON ) + endif ( ) -set_target_properties ( colamd PROPERTIES - VERSION ${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB} - C_STANDARD_REQUIRED 11 - SOVERSION ${COLAMD_VERSION_MAJOR} - PUBLIC_HEADER "Include/colamd.h" - WINDOWS_EXPORT_ALL_SYMBOLS ON ) + target_include_directories ( COLAMD + INTERFACE $ + $ ) +endif ( ) #------------------------------------------------------------------------------- # static colamd library properties #------------------------------------------------------------------------------- -if ( NOT NSTATIC ) - add_library ( colamd_static STATIC ${COLAMD_SOURCES} ) +if ( BUILD_STATIC_LIBS ) + add_library ( COLAMD_static STATIC ${COLAMD_SOURCES} ) - set_target_properties ( colamd_static PROPERTIES - VERSION ${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB} + set_target_properties ( COLAMD_static PROPERTIES OUTPUT_NAME colamd - C_STANDARD_REQUIRED 11 - SOVERSION ${COLAMD_VERSION_MAJOR} ) + C_STANDARD 11 + C_STANDARD_REQUIRED ON + PUBLIC_HEADER "Include/colamd.h" ) - if ( MSVC ) - set_target_properties ( colamd_static PROPERTIES + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) + set_target_properties ( COLAMD_static PROPERTIES OUTPUT_NAME colamd_static ) endif ( ) + + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) + set_target_properties ( COLAMD_static PROPERTIES EXPORT_NO_SYSTEM ON ) + endif ( ) + + target_include_directories ( COLAMD_static + INTERFACE $ + $ ) endif ( ) #------------------------------------------------------------------------------- # add the library dependencies #------------------------------------------------------------------------------- -target_link_libraries ( colamd PUBLIC ${SUITESPARSE_CONFIG_LIBRARY} ) -if ( NOT NSTATIC ) - target_link_libraries ( colamd_static PUBLIC ${SUITESPARSE_CONFIG_STATIC} ) +if ( BUILD_SHARED_LIBS ) + target_link_libraries ( COLAMD PRIVATE SuiteSparse::SuiteSparseConfig ) + target_include_directories ( COLAMD PUBLIC + "$" ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + if ( TARGET SuiteSparse::SuiteSparseConfig_static ) + target_link_libraries ( COLAMD_static PUBLIC SuiteSparse::SuiteSparseConfig_static ) + else ( ) + target_link_libraries ( COLAMD_static PUBLIC SuiteSparse::SuiteSparseConfig ) + endif ( ) endif ( ) # libm: if ( NOT WIN32 ) - target_link_libraries ( colamd PUBLIC m ) - if ( NOT NSTATIC ) - target_link_libraries ( colamd_static PUBLIC m ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( COLAMD PRIVATE m ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + set ( COLAMD_STATIC_LIBS "${COLAMD_STATIC_LIBS} -lm" ) + target_link_libraries ( COLAMD_static PUBLIC m ) endif ( ) endif ( ) @@ -114,25 +150,99 @@ endif ( ) # COLAMD installation location #------------------------------------------------------------------------------- -install ( TARGETS colamd - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -install ( FILES ${CMAKE_SOURCE_DIR}/cmake_modules/FindCOLAMD.cmake - DESTINATION ${SUITESPARSE_LIBDIR}/cmake/SuiteSparse - COMPONENT Development ) -if ( NOT NSTATIC ) - install ( TARGETS colamd_static - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} ) +include ( CMakePackageConfigHelpers ) + +if ( BUILD_SHARED_LIBS ) + install ( TARGETS COLAMD + EXPORT COLAMDTargets + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + install ( TARGETS COLAMD_static + EXPORT COLAMDTargets + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) + +# create (temporary) export target file during build +export ( EXPORT COLAMDTargets + NAMESPACE SuiteSparse:: + FILE ${CMAKE_CURRENT_BINARY_DIR}/COLAMDTargets.cmake ) + +# install export target, config and version files for find_package +install ( EXPORT COLAMDTargets + NAMESPACE SuiteSparse:: + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/COLAMD ) + +# generate config file to be used in common build tree +set ( SUITESPARSE_IN_BUILD_TREE ON ) +configure_package_config_file ( + Config/COLAMDConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/COLAMDConfig.cmake + INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/COLAMDConfig.cmake ) + +# generate config file to be installed +set ( SUITESPARSE_IN_BUILD_TREE OFF ) +configure_package_config_file ( + Config/COLAMDConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/target/COLAMDConfig.cmake + INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/COLAMD ) + +write_basic_package_version_file ( + ${CMAKE_CURRENT_BINARY_DIR}/COLAMDConfigVersion.cmake + COMPATIBILITY SameMajorVersion ) + +install ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/target/COLAMDConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/COLAMDConfigVersion.cmake + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/COLAMD ) + +#------------------------------------------------------------------------------- +# create pkg-config file +#------------------------------------------------------------------------------- + +if ( NOT MSVC ) + set ( prefix "${CMAKE_INSTALL_PREFIX}" ) + set ( exec_prefix "\${prefix}" ) + cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) + if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) + set ( libdir "${SUITESPARSE_LIBDIR}") + else ( ) + set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") + endif ( ) + cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) + if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) + set ( includedir "${SUITESPARSE_INCLUDEDIR}") + else ( ) + set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") + endif ( ) + if ( BUILD_SHARED_LIBS ) + set ( SUITESPARSE_LIB_BASE_NAME $ ) + else ( ) + set ( SUITESPARSE_LIB_BASE_NAME $ ) + endif ( ) + configure_file ( + Config/COLAMD.pc.in + COLAMD.pc.out + @ONLY + NEWLINE_STYLE LF ) + file ( GENERATE + OUTPUT COLAMD.pc + INPUT ${CMAKE_CURRENT_BINARY_DIR}/COLAMD.pc.out + NEWLINE_STYLE LF ) + install ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/COLAMD.pc + DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) endif ( ) #------------------------------------------------------------------------------- # Demo library and programs #------------------------------------------------------------------------------- -option ( DEMO "ON: Build the demo programs. OFF (default): do not build the demo programs." off ) -if ( DEMO ) +if ( SUITESPARSE_DEMOS ) #--------------------------------------------------------------------------- # demo library @@ -148,8 +258,13 @@ if ( DEMO ) add_executable ( colamd_l_example "Demo/colamd_l_example.c" ) # Libraries required for Demo programs - target_link_libraries ( colamd_example PUBLIC colamd ) - target_link_libraries ( colamd_l_example PUBLIC colamd ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( colamd_example PUBLIC COLAMD ) + target_link_libraries ( colamd_l_example PUBLIC COLAMD ) + else ( ) + target_link_libraries ( colamd_example PUBLIC COLAMD_static ) + target_link_libraries ( colamd_l_example PUBLIC COLAMD_static ) + endif ( ) else ( ) @@ -162,4 +277,3 @@ endif ( ) #------------------------------------------------------------------------------- include ( SuiteSparseReport ) - diff --git a/COLAMD/Config/COLAMD.pc.in b/COLAMD/Config/COLAMD.pc.in new file mode 100644 index 00000000..5444c608 --- /dev/null +++ b/COLAMD/Config/COLAMD.pc.in @@ -0,0 +1,17 @@ +# COLAMD, Copyright (c) 1998-2023, Timothy A. Davis. +# All Rights Reserved. +# SPDX-License-Identifier: BSD-3-Clause + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: COLAMD +URL: https://github.com/DrTimothyAldenDavis/SuiteSparse +Description: Routines for column approximate minimum degree ordering algorithm in SuiteSparse +Version: @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@.@COLAMD_VERSION_SUB@ +Requires.private: SuiteSparse_config +Libs: -L${libdir} -l@SUITESPARSE_LIB_BASE_NAME@ +Libs.private: @COLAMD_STATIC_LIBS@ +Cflags: -I${includedir} diff --git a/COLAMD/Config/COLAMDConfig.cmake.in b/COLAMD/Config/COLAMDConfig.cmake.in new file mode 100644 index 00000000..7bb4701f --- /dev/null +++ b/COLAMD/Config/COLAMDConfig.cmake.in @@ -0,0 +1,152 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/COLAMD/cmake_modules/COLAMDConfig.cmake +#------------------------------------------------------------------------------- + +# The following copyright and license applies to just this file only, not to +# the library itself: +# COLAMDConfig.cmake, Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +#------------------------------------------------------------------------------- + +# Finds the COLAMD include file and compiled library. +# The following targets are defined: +# SuiteSparse::COLAMD - for the shared library (if available) +# SuiteSparse::COLAMD_static - for the static library (if available) + +# For backward compatibility the following variables are set: + +# COLAMD_INCLUDE_DIR - where to find colamd.h +# COLAMD_LIBRARY - dynamic COLAMD library +# COLAMD_STATIC - static COLAMD library +# COLAMD_LIBRARIES - libraries when using COLAMD +# COLAMD_FOUND - true if COLAMD found + +# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is +# installed. + +#------------------------------------------------------------------------------- + +@PACKAGE_INIT@ + +set ( COLAMD_DATE "@COLAMD_DATE@" ) +set ( COLAMD_VERSION_MAJOR @COLAMD_VERSION_MAJOR@ ) +set ( COLAMD_VERSION_MINOR @COLAMD_VERSION_MINOR@ ) +set ( COLAMD_VERSION_PATCH @COLAMD_VERSION_SUB@ ) +set ( COLAMD_VERSION "@COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@.@COLAMD_VERSION_SUB@" ) + +# Check for dependent targets +include ( CMakeFindDependencyMacro ) + +# Look for SuiteSparse_config target +if ( @SUITESPARSE_IN_BUILD_TREE@ ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + # First check in a common build tree + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ + PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) + # Then, check in the currently active CMAKE_MODULE_PATH + if ( NOT SuiteSparse_config_FOUND ) + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) + endif ( ) + endif ( ) +else ( ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) + endif ( ) +endif ( ) +if ( NOT SuiteSparse_config_FOUND ) + set ( COLAMD_FOUND OFF ) + return ( ) +endif ( ) + + +# Import target +include ( ${CMAKE_CURRENT_LIST_DIR}/COLAMDTargets.cmake ) + +# The following is only for backward compatibility with FindCOLAMD. + +set ( _target_shared SuiteSparse::COLAMD ) +set ( _target_static SuiteSparse::COLAMD_static ) +set ( _var_prefix "COLAMD" ) + +if ( NOT @BUILD_SHARED_LIBS@ AND NOT TARGET ${_target_shared} ) + # make sure there is always an import target without suffix ) + add_library ( ${_target_shared} ALIAS ${_target_static} ) +endif ( ) + +get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) +if ( ${_var_prefix}_INCLUDE_DIR ) + # First item in SuiteSparse targets contains the "main" header directory. + list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) +endif ( ) +get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) +if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) +endif ( ) +if ( TARGET ${_target_static} ) + get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) +endif ( ) + +# Check for most common build types +set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) + +get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) +if ( _isMultiConfig ) + # For multi-configuration generators (e.g., Visual Studio), prefer those + # configurations. + list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) +else ( ) + # For single-configuration generators, prefer the current configuration. + list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) +endif ( ) + +list ( REMOVE_DUPLICATES _config_types ) + +foreach ( _config ${_config_types} ) + string ( TOUPPER ${_config} _uc_config ) + if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} + IMPORTED_IMPLIB_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) + endif ( ) + if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} + IMPORTED_LOCATION_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) + endif ( ) + if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) + get_target_property ( _library_chk ${_target_static} + IMPORTED_LOCATION_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_STATIC ${_library_chk} ) + endif ( ) + endif ( ) +endforeach ( ) + +set ( COLAMD_LIBRARIES ${COLAMD_LIBRARY} ) + +macro ( suitesparse_check_exist _var _files ) + # ignore generator expressions + string ( GENEX_STRIP "${_files}" _files2 ) + + foreach ( _file ${_files2} ) + if ( NOT EXISTS "${_file}" ) + message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) + endif ( ) + endforeach () +endmacro ( ) + +suitesparse_check_exist ( COLAMD_INCLUDE_DIR ${COLAMD_INCLUDE_DIR} ) +suitesparse_check_exist ( COLAMD_LIBRARY ${COLAMD_LIBRARY} ) + +message ( STATUS "COLAMD version: ${COLAMD_VERSION}" ) +message ( STATUS "COLAMD include: ${COLAMD_INCLUDE_DIR}" ) +message ( STATUS "COLAMD library: ${COLAMD_LIBRARY}" ) +message ( STATUS "COLAMD static: ${COLAMD_STATIC}" ) diff --git a/COLAMD/Config/colamd.h.in b/COLAMD/Config/colamd.h.in index fb0450ac..915f81c5 100644 --- a/COLAMD/Config/colamd.h.in +++ b/COLAMD/Config/colamd.h.in @@ -1,8 +1,8 @@ //------------------------------------------------------------------------------ -// COLAMD/Source/colamd.h: include file for COLAMD +// COLAMD/Include/colamd.h: include file for COLAMD //------------------------------------------------------------------------------ -// COLAMD, Copyright (c) 1998-2022, Timothy A. Davis and Stefan Larimore, +// COLAMD, Copyright (c) 1998-2024, Timothy A. Davis and Stefan Larimore, // All Rights Reserved. // SPDX-License-Identifier: BSD-3-clause @@ -37,11 +37,6 @@ #ifndef COLAMD_H #define COLAMD_H -/* make it easy for C++ programs to include COLAMD */ -#ifdef __cplusplus -extern "C" { -#endif - /* ========================================================================== */ /* === Include files ======================================================== */ /* ========================================================================== */ @@ -75,9 +70,14 @@ extern "C" { #define COLAMD_SUB_VERSION @COLAMD_VERSION_MINOR@ #define COLAMD_SUBSUB_VERSION @COLAMD_VERSION_SUB@ -#define COLAMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) -#define COLAMD_VERSION \ - COLAMD_VERSION_CODE(COLAMD_MAIN_VERSION,COLAMD_SUB_VERSION) +#define COLAMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) +#define COLAMD_VERSION COLAMD_VERSION_CODE(@COLAMD_VERSION_MAJOR@,@COLAMD_VERSION_MINOR@) + +#define COLAMD__VERSION SUITESPARSE__VERCODE(@COLAMD_VERSION_MAJOR@,@COLAMD_VERSION_MINOR@,@COLAMD_VERSION_SUB@) +#if !defined (SUITESPARSE__VERSION) || \ + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "COLAMD @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@.@COLAMD_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" +#endif /* ========================================================================== */ /* === Knob and statistics definitions ====================================== */ @@ -129,6 +129,11 @@ extern "C" { /* === Prototypes of user-callable routines ================================= */ /* ========================================================================== */ +/* make it easy for C++ programs to include COLAMD */ +#ifdef __cplusplus +extern "C" { +#endif + size_t colamd_recommended /* returns recommended value of Alen, */ /* or 0 if input arguments are erroneous */ ( @@ -229,6 +234,8 @@ void symamd_l_report int64_t stats [COLAMD_STATS] ) ; +void colamd_version (int version [3]) ; + #ifdef __cplusplus } #endif diff --git a/COLAMD/Demo/colamd_example.c b/COLAMD/Demo/colamd_example.c index e478f7d2..b64ca33e 100644 --- a/COLAMD/Demo/colamd_example.c +++ b/COLAMD/Demo/colamd_example.c @@ -98,6 +98,21 @@ int main (void) int row, col, pp, length, ok ; + //-------------------------------------------------------------------------- + // colamd version + //-------------------------------------------------------------------------- + + int version [3] ; + colamd_version (version) ; + printf ("COLAMD v%d.%d.%d\n", version [0], version [1], version [2]) ; + if ((version [0] != COLAMD_MAIN_VERSION) || + (version [1] != COLAMD_SUB_VERSION) || + (version [2] != COLAMD_SUBSUB_VERSION)) + { + fprintf (stderr, "version in header does not match library\n") ; + abort ( ) ; + } + /* ====================================================================== */ /* dump the input matrix A */ /* ====================================================================== */ diff --git a/COLAMD/Demo/colamd_example.out b/COLAMD/Demo/colamd_example.out index 56be3fb0..1b6c81fc 100644 --- a/COLAMD/Demo/colamd_example.out +++ b/COLAMD/Demo/colamd_example.out @@ -1,3 +1,4 @@ +COLAMD v3.3.3 colamd 5-by-4 input matrix: Column 0, with 3 entries: row 0 @@ -15,7 +16,7 @@ Column 3, with 2 entries: row 1 row 3 -colamd version 3.0.3, Jan 17, 2023: OK. +colamd version 3.3.3, Mar 22, 2024: 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 @@ -38,7 +39,7 @@ Column 3, with 1 entries: row 4 Column 4, with 0 entries: -symamd version 3.0.3, Jan 17, 2023: OK. +symamd version 3.3.3, Mar 22, 2024: 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 diff --git a/COLAMD/Demo/colamd_l_example.c b/COLAMD/Demo/colamd_l_example.c index b48a55bf..3bf4c18c 100644 --- a/COLAMD/Demo/colamd_l_example.c +++ b/COLAMD/Demo/colamd_l_example.c @@ -99,6 +99,21 @@ int main (void) int64_t row, col, pp, length ; int ok ; + //-------------------------------------------------------------------------- + // colamd version + //-------------------------------------------------------------------------- + + int version [3] ; + colamd_version (version) ; + printf ("COLAMD v%d.%d.%d\n", version [0], version [1], version [2]) ; + if ((version [0] != COLAMD_MAIN_VERSION) || + (version [1] != COLAMD_SUB_VERSION) || + (version [2] != COLAMD_SUBSUB_VERSION)) + { + fprintf (stderr, "version in header does not match library\n") ; + abort ( ) ; + } + /* ====================================================================== */ /* dump the input matrix A */ /* ====================================================================== */ diff --git a/COLAMD/Demo/colamd_l_example.out b/COLAMD/Demo/colamd_l_example.out index c75474b9..104688ee 100644 --- a/COLAMD/Demo/colamd_l_example.out +++ b/COLAMD/Demo/colamd_l_example.out @@ -1,3 +1,4 @@ +COLAMD v3.3.3 colamd 5-by-4 input matrix: Column 0, with 3 entries: row 0 @@ -15,7 +16,7 @@ Column 3, with 2 entries: row 1 row 3 -colamd version 3.0.3, Jan 17, 2023: OK. +colamd version 3.3.3, Mar 22, 2024: 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 @@ -38,7 +39,7 @@ Column 3, with 1 entries: row 4 Column 4, with 0 entries: -symamd version 3.0.3, Jan 17, 2023: OK. +symamd version 3.3.3, Mar 22, 2024: 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 diff --git a/COLAMD/Doc/ChangeLog b/COLAMD/Doc/ChangeLog index f7a3dcf3..b9e700d9 100644 --- a/COLAMD/Doc/ChangeLog +++ b/COLAMD/Doc/ChangeLog @@ -1,3 +1,32 @@ +Mar 22, 2024: version 3.3.3 + + * minor updates to build system + +Jan 20, 2024: version 3.3.2 + + * minor updates to build system + +Jan 10, 2024: version 3.3.1 + + * minor updates to build system + +Dec 30, 2023: version 3.3.0 + + * major change to build system: by Markus Mützel + * colamd_version: added to return version of COLAMD + +Sept 18, 2023: version 3.2.1 + + * cmake update: add "None" build type, from Antonio Rojas, for Arch Linux + +Sept 8, 2023: version 3.2.0 + + * cmake updates: SuiteSparse:: namespace by Markus Muetzel + +June 16, 2023: version 3.0.4 + + * cmake build system updates: update by Markus Muetzel + Jan 17, 2023: version 3.0.3 * SuiteSparse_config: now v7.0.0 diff --git a/COLAMD/Include/colamd.h b/COLAMD/Include/colamd.h index f258ef68..7b2e77f1 100644 --- a/COLAMD/Include/colamd.h +++ b/COLAMD/Include/colamd.h @@ -1,8 +1,8 @@ //------------------------------------------------------------------------------ -// COLAMD/Source/colamd.h: include file for COLAMD +// COLAMD/Include/colamd.h: include file for COLAMD //------------------------------------------------------------------------------ -// COLAMD, Copyright (c) 1998-2022, Timothy A. Davis and Stefan Larimore, +// COLAMD, Copyright (c) 1998-2024, Timothy A. Davis and Stefan Larimore, // All Rights Reserved. // SPDX-License-Identifier: BSD-3-clause @@ -37,11 +37,6 @@ #ifndef COLAMD_H #define COLAMD_H -/* make it easy for C++ programs to include COLAMD */ -#ifdef __cplusplus -extern "C" { -#endif - /* ========================================================================== */ /* === Include files ======================================================== */ /* ========================================================================== */ @@ -70,14 +65,19 @@ extern "C" { * Versions 2.3 and earlier of COLAMD do not include a #define'd version number. */ -#define COLAMD_DATE "Jan 17, 2023" +#define COLAMD_DATE "Mar 22, 2024" #define COLAMD_MAIN_VERSION 3 -#define COLAMD_SUB_VERSION 0 +#define COLAMD_SUB_VERSION 3 #define COLAMD_SUBSUB_VERSION 3 -#define COLAMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) -#define COLAMD_VERSION \ - COLAMD_VERSION_CODE(COLAMD_MAIN_VERSION,COLAMD_SUB_VERSION) +#define COLAMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) +#define COLAMD_VERSION COLAMD_VERSION_CODE(3,3) + +#define COLAMD__VERSION SUITESPARSE__VERCODE(3,3,3) +#if !defined (SUITESPARSE__VERSION) || \ + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "COLAMD 3.3.3 requires SuiteSparse_config 7.7.0 or later" +#endif /* ========================================================================== */ /* === Knob and statistics definitions ====================================== */ @@ -129,6 +129,11 @@ extern "C" { /* === Prototypes of user-callable routines ================================= */ /* ========================================================================== */ +/* make it easy for C++ programs to include COLAMD */ +#ifdef __cplusplus +extern "C" { +#endif + size_t colamd_recommended /* returns recommended value of Alen, */ /* or 0 if input arguments are erroneous */ ( @@ -229,6 +234,8 @@ void symamd_l_report int64_t stats [COLAMD_STATS] ) ; +void colamd_version (int version [3]) ; + #ifdef __cplusplus } #endif diff --git a/COLAMD/Makefile b/COLAMD/Makefile index 2c7de9ee..787ee26f 100644 --- a/COLAMD/Makefile +++ b/COLAMD/Makefile @@ -36,27 +36,27 @@ default: library # default is to install only in /usr/local library: - ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . --config Release -j${JOBS} ) # install only in SuiteSparse/lib and SuiteSparse/include local: - ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=1 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=1 .. && cmake --build . --config Release -j${JOBS} ) # install only in /usr/local (default) global: - ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=0 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=0 .. && cmake --build . --config Release -j${JOBS} ) debug: - ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . --config Debug -j${JOBS} ) all: library demos: library - ( cd build && cmake $(CMAKE_OPTIONS) -DDEMO=1 .. && cmake --build . -j${JOBS} ) - - ./build/colamd_example > ./build/colamd_example.out - - diff --strip-trailing-cr ./Demo/colamd_example.out ./build/colamd_example.out - - ./build/colamd_l_example > ./build/colamd_l_example.out - - diff --strip-trailing-cr ./Demo/colamd_l_example.out ./build/colamd_l_example.out + ( cd build && cmake $(CMAKE_OPTIONS) -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j${JOBS} ) + - ./build/colamd_example > ./build/colamd_example.out && ( command -v d2u && d2u ./build/colamd_example.out || true ) + - diff ./Demo/colamd_example.out ./build/colamd_example.out + - ./build/colamd_l_example > ./build/colamd_l_example.out && ( command -v d2u && d2u ./build/colamd_l_example.out || true ) + - diff ./Demo/colamd_l_example.out ./build/colamd_l_example.out # just compile after running cmake; do not run cmake again remake: @@ -64,7 +64,7 @@ remake: # just run cmake to set things up setup: - ( cd build ; cmake $(CMAKE_OPTIONS) .. ) + ( cd build && cmake $(CMAKE_OPTIONS) .. ) install: ( cd build && cmake --install . ) diff --git a/COLAMD/Source/colamd.c b/COLAMD/Source/colamd.c index af5b27f7..968d90fc 100644 --- a/COLAMD/Source/colamd.c +++ b/COLAMD/Source/colamd.c @@ -1046,7 +1046,6 @@ size_t COLAMD_recommended /* returns recommended value of Alen. */ return (ok ? s : 0) ; } - /* ========================================================================== */ /* === colamd_set_defaults ================================================== */ /* ========================================================================== */ diff --git a/COLAMD/Source/colamd_version.c b/COLAMD/Source/colamd_version.c new file mode 100644 index 00000000..9184817e --- /dev/null +++ b/COLAMD/Source/colamd_version.c @@ -0,0 +1,19 @@ +//------------------------------------------------------------------------------ +// COLAMD/Source/colamd_version.c: return COLAMD version +//------------------------------------------------------------------------------ + +// COLAMD, Copyright (c) 1998-2022, Timothy A. Davis and Stefan Larimore, +// All Rights Reserved. +// SPDX-License-Identifier: BSD-3-clause + +//------------------------------------------------------------------------------ + +#include "colamd.h" + +void colamd_version (int version [3]) +{ + version [0] = COLAMD_MAIN_VERSION ; + version [1] = COLAMD_SUB_VERSION ; + version [2] = COLAMD_SUBSUB_VERSION ; +} + diff --git a/COLAMD/cmake_modules/FindCOLAMD.cmake b/COLAMD/cmake_modules/FindCOLAMD.cmake deleted file mode 100644 index 00e8a9ac..00000000 --- a/COLAMD/cmake_modules/FindCOLAMD.cmake +++ /dev/null @@ -1,129 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/COLAMD/cmake_modules/FindCOLAMD.cmake -#------------------------------------------------------------------------------- - -# The following copyright and license applies to just this file only, not to -# the library itself: -# FindCOLAMD.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# Finds the COLAMD include file and compiled library and sets: - -# COLAMD_INCLUDE_DIR - where to find colamd.h -# COLAMD_LIBRARY - dynamic COLAMD library -# COLAMD_STATIC - static COLAMD library -# COLAMD_LIBRARIES - libraries when using COLAMD -# COLAMD_FOUND - true if COLAMD found - -# set ``COLAMD_ROOT`` to a COLAMD installation root to -# tell this module where to look. - -# All the Find*.cmake files in SuiteSparse are installed by 'make install' into -# /usr/local/lib/cmake/SuiteSparse (where '/usr/local' is the -# ${CMAKE_INSTALL_PREFIX}). To access this file, place the following commands -# in your CMakeLists.txt file. See also SuiteSparse/Example/CMakeLists.txt: -# -# set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} -# ${CMAKE_INSTALL_PREFIX}/lib/cmake/SuiteSparse ) - -#------------------------------------------------------------------------------- - -# include files for COLAMD -find_path ( COLAMD_INCLUDE_DIR - NAMES colamd.h - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/COLAMD - HINTS ${CMAKE_SOURCE_DIR}/../COLAMD - PATH_SUFFIXES include Include -) - -# dynamic COLAMD library (or static if no dynamic library was built) -find_library ( COLAMD_LIBRARY - NAMES colamd colamd_static - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/COLAMD - HINTS ${CMAKE_SOURCE_DIR}/../COLAMD - PATH_SUFFIXES lib build build/Release build/Debug -) - -if ( MSVC ) - set ( STATIC_NAME colamd_static ) -else ( ) - set ( STATIC_NAME colamd ) - set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) - set ( CMAKE_FIND_LIBRARY_SUFFIXES - ${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) -endif ( ) - -# static COLAMD library -find_library ( COLAMD_STATIC - NAMES ${STATIC_NAME} - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/COLAMD - HINTS ${CMAKE_SOURCE_DIR}/../COLAMD - PATH_SUFFIXES lib build build/Release build/Debug -) - -if ( NOT MSVC ) - # restore the CMAKE_FIND_LIBRARY_SUFFIXES variable - set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) -endif ( ) - -# get version of the library from the dynamic library name -get_filename_component ( COLAMD_LIBRARY ${COLAMD_LIBRARY} REALPATH ) -get_filename_component ( COLAMD_FILENAME ${COLAMD_LIBRARY} NAME ) -string ( - REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" - COLAMD_VERSION - ${COLAMD_FILENAME} -) - -# set ( COLAMD_VERSION "" ) -if ( EXISTS "${COLAMD_INCLUDE_DIR}" AND NOT COLAMD_VERSION ) - # if the version does not appear in the filename, read the include file - file ( STRINGS ${COLAMD_INCLUDE_DIR}/colamd.h COLAMD_MAJOR_STR - REGEX "define COLAMD_MAIN_VERSION" ) - file ( STRINGS ${COLAMD_INCLUDE_DIR}/colamd.h COLAMD_MINOR_STR - REGEX "define COLAMD_SUB_VERSION" ) - file ( STRINGS ${COLAMD_INCLUDE_DIR}/colamd.h COLAMD_PATCH_STR - REGEX "define COLAMD_SUBSUB_VERSION" ) - message ( STATUS "major: ${COLAMD_MAJOR_STR}" ) - message ( STATUS "minor: ${COLAMD_MINOR_STR}" ) - message ( STATUS "patch: ${COLAMD_PATCH_STR}" ) - string ( REGEX MATCH "[0-9]+" COLAMD_MAJOR ${COLAMD_MAJOR_STR} ) - string ( REGEX MATCH "[0-9]+" COLAMD_MINOR ${COLAMD_MINOR_STR} ) - string ( REGEX MATCH "[0-9]+" COLAMD_PATCH ${COLAMD_PATCH_STR} ) - set (COLAMD_VERSION "${COLAMD_MAJOR}.${COLAMD_MINOR}.${COLAMD_PATCH}") -endif ( ) - -set (COLAMD_LIBRARIES ${COLAMD_LIBRARY}) - -include (FindPackageHandleStandardArgs) - -find_package_handle_standard_args ( COLAMD - REQUIRED_VARS COLAMD_LIBRARY COLAMD_INCLUDE_DIR - VERSION_VAR COLAMD_VERSION -) - -mark_as_advanced ( - COLAMD_INCLUDE_DIR - COLAMD_LIBRARY - COLAMD_STATIC - COLAMD_LIBRARIES -) - -if ( COLAMD_FOUND ) - message ( STATUS "COLAMD version: ${COLAMD_VERSION}" ) - message ( STATUS "COLAMD include: ${COLAMD_INCLUDE_DIR}" ) - message ( STATUS "COLAMD library: ${COLAMD_LIBRARY}" ) - message ( STATUS "COLAMD static: ${COLAMD_STATIC}" ) -else ( ) - message ( STATUS "COLAMD not found" ) - set ( COLAMD_INCLUDE_DIR "" ) - set ( COLAMD_LIBRARIES "" ) - set ( COLAMD_LIBRARY "" ) - set ( COLAMD_STATIC "" ) -endif ( ) - diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..a81e104c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing to SuiteSparse + +To add an issue for a bug report (gasp!) or a feature request, +you can use the issue tracker on github.com, at +[`https://github.com/DrTimothyAldenDavis/SuiteSparse/issues`] +(https://github.com/DrTimothyAldenDavis/SuiteSparse/issues). + +To contribute code, you can submit a pull request. To do so, +you must first agree to the Contributor License Agreement +[`CONTRIBUTOR-LICENSE.txt`](CONTRIBUTOR-LICENSE.txt). +Print a copy of the txt file (as a PDF), sign and date it, +and email it to me at DrTimothyAldenDavis@gmail.com. Pull +requests will only be included into SuiteSparse after I receive +your email with the signed PDF. + +Do not submit a pull request to the default branch. +Instead, use the dev or dev2 branches. + diff --git a/CONTRIBUTOR-LICENSE.txt b/CONTRIBUTOR-LICENSE.txt new file mode 100644 index 00000000..7cd19eec --- /dev/null +++ b/CONTRIBUTOR-LICENSE.txt @@ -0,0 +1,177 @@ +SuiteSparse Individual Contributor License Agreement + +Thank you for your interest in contributing to SuiteSparse ("We" or "Us"). + +This contributor agreement ("Agreement") documents the rights granted by +contributors to Us. To make this document effective, please sign it and send it +to Us by electronic submission. This is a legally binding document, so please +read it carefully before agreeing to it. The Agreement may cover more than one +software project managed by Us. + +1. Definitions + + "You" means the individual who Submits a Contribution to Us. + + "Contribution" means any work of authorship that is Submitted by You to Us + in which You own or assert ownership of the Copyright. + + "Copyright" means all rights protecting works of authorship owned or + controlled by You, including copyright, moral and neighboring rights, as + appropriate, for the full term of their existence including any extensions + by You. + + "Material" means the work of authorship which is made available by Us to + third parties. When this Agreement covers more than one software project, + the Material means the work of authorship to which the Contribution was + Submitted. After You Submit the Contribution, it may be included in the + Material. + + "Submit" means any form of electronic, verbal, or written communication + sent to Us or our representatives, including but not limited to electronic + mailing lists, source code control systems, and issue tracking systems that + are managed by, or on behalf of, Us for the purpose of discussing and + improving the Material, but excluding communication that is conspicuously + marked or otherwise designated in writing by You as "Not a Contribution." + + "Submission Date" means the date on which You Submit a Contribution to Us. + + "Effective Date" means the date You execute this Agreement or the date You + first Submit a Contribution to Us, whichever is earlier. + +2. Grant of Rights + + 2.1 Copyright License + + (a) You retain ownership of the Copyright in Your Contribution and have + the same rights to use or license the Contribution which You would have + had without entering into the Agreement. + + (b) To the maximum extent permitted by the relevant law, You grant to + Us a perpetual, worldwide, non-exclusive, transferable, royalty-free, + irrevocable license under the Copyright covering the Contribution, with + the right to sublicense such rights through multiple tiers of + sublicensees, to reproduce, modify, display, perform and distribute the + Contribution as part of the Material; provided that this license is + conditioned upon compliance with Section 2.3. + + 2.2 Patent License + + For patent claims including, without limitation, method, process, and + apparatus claims which You own, control or have the right to grant, now + or in the future, You grant to Us a perpetual, worldwide, + non-exclusive, transferable, royalty-free, irrevocable patent license, + with the right to sublicense these rights to multiple tiers of + sublicensees, to make, have made, use, sell, offer for sale, import and + otherwise transfer the Contribution and the Contribution in combination + with the Material (and portions of such combination). This license is + granted only to the extent that the exercise of the licensed rights + infringes such patent claims; and provided that this license is + conditioned upon compliance with Section 2.3. + + 2.3 Outbound License + + Based on the grant of rights in Sections 2.1 and 2.2, if We include + Your Contribution in a Material, We may license the Contribution under + any license, including copyleft, permissive, commercial, or proprietary + licenses. + + 2.4 Moral Rights. + + If moral rights apply to the Contribution, to the maximum extent + permitted by law, You waive and agree not to assert such moral rights + against Us or our successors in interest, or any of our licensees, + either direct or indirect. + + 2.5 Our Rights. + + You acknowledge that We are not obligated to use Your Contribution as + part of the Material and may decide to include any Contribution We + consider appropriate. + + 2.6 Reservation of Rights. + + Any rights not expressly licensed under this section are expressly + reserved by You. + +3. Agreement + + You confirm that: + + (a) You have the legal authority to enter into this Agreement. + + (b) You own the Copyright and patent claims covering the Contribution which + are required to grant the rights under Section 2. + + (c) The grant of rights under Section 2 does not violate any grant of + rights which You have made to third parties, including Your employer. If + You are an employee, You have had Your employer approve this Agreement or + sign the Entity version of this document. If You are less than eighteen + years old, please have Your parents or guardian sign the Agreement. + +4. Disclaimer + + EXCEPT FOR THE EXPRESS WARRANTIES IN SECTION 3, THE CONTRIBUTION IS + PROVIDED "AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES + INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY + DISCLAIMED BY YOU TO US. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE + DISCLAIMED, SUCH WARRANTY IS LIMITED IN DURATION TO THE MINIMUM PERIOD + PERMITTED BY LAW. + +5. Consequential Damage Waiver + + TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU BE + LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA, + INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING + OUT OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY + (CONTRACT, TORT OR OTHERWISE) UPON WHICH THE CLAIM IS BASED. + +6. Miscellaneous + + 6.1 This Agreement will be governed by and construed in accordance with the + laws of the State of Texas excluding its conflicts of law provisions. Under + certain circumstances, the governing law in this section might be + superseded by the United Nations Convention on Contracts for the + International Sale of Goods ("UN Convention") and the parties intend to + avoid the application of the UN Convention to this Agreement and, thus, + exclude the application of the UN Convention in its entirety to this + Agreement. + + 6.2 This Agreement sets out the entire agreement between You and Us for + Your Contributions to Us and overrides all other agreements or + understandings. + + 6.3 If You or We assign the rights or obligations received through this + Agreement to a third party, as a condition of the assignment, that third + party must agree in writing to abide by all the rights and obligations in + the Agreement. + + 6.4 The failure of either party to require performance by the other party + of any provision of this Agreement in one situation shall not affect the + right of a party to require such performance at any time in the future. A + waiver of performance under a provision in one situation shall not be + considered a waiver of the performance of the provision in the future or a + waiver of the provision in its entirety. + + 6.5 If any provision of this Agreement is found void and unenforceable, + such provision will be replaced to the extent possible with a provision + that comes closest to the meaning of the original provision and which is + enforceable. The terms and conditions set forth in this Agreement shall + apply notwithstanding any failure of essential purpose of this Agreement or + any limited remedy to the maximum extent possible under law. + +Us +Timothy A. Davis, and all SuiteSparse co-authors (varies according to +the SuiteSparse package) + + +You: + + Your Name (printed): + + + Your Signature: + + + Date: + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..2516bc71 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,113 @@ +This file lists all licenses for all packages in SPEX, for your +convenience. Each package has its own separate license, which can be +found in the lists below. + +==> SPEX/LICENSE <== + + SPEX: a SParse EXact Factorization Framework for solving SLEs + + Copyright (c) 2019-2024, Christopher Lourenco, Jinhao Chen, + Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. + + Available at: + https://github.com/clouren/SPEX + http://suitesparse.com + + Contact Chris Lourenco, chrisjlourenco@gmail.com, or Tim Davis + (timdavis@aldenmath.com or DrTimothyAldenDavis@gmail.com) for a commercial + license. + + -------------------------------------------------------------------------------- + + SPEX is free software; you can redistribute it and/or modify + it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * 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. + + or both in parallel, as here. + + SPEX 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 copies of the GNU General Public License and the + GNU Lesser General Public License along with this software. If not, + see https://www.gnu.org/licenses/. + +==> AMD/Doc/License.txt <== + + AMD, Copyright (c), 1996-2015, Timothy A. Davis, + Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. + + Availability: + + http://www.suitesparse.com + + ------------------------------------------------------------------------------- + AMD License: BSD 3-clause: + ------------------------------------------------------------------------------- + + 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. + +==> COLAMD/Doc/License.txt <== + + COLAMD, Copyright 1998-2016, Timothy A. Davis. http://www.suitesparse.com + http://www.suitesparse.com + + COLAMD License: BSD 3-clause + + 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. + diff --git a/Makefile b/Makefile index d733c223..af5b2aec 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,10 @@ # Makefile for SPEX and its dependent packages (AMD, COLAMD, SuiteSparse_config) #------------------------------------------------------------------------------- +# Just this particular file is under the Apache-2.0 license; each package has +# its own license. +# SPDX-License-Identifier: Apache-2.0 + # edit this variable to pass options to cmake: export CMAKE_OPTIONS ?= @@ -15,8 +19,7 @@ export SUITESPARSE = $(CURDIR) # Compile the default rules for each package. -# default: "make install" will install all libraries in /usr/local/lib -# and include files in /usr/local/include. Not installed in SuiteSparse/lib. +# default: compile and install in SPEX/lib and SPEX/include default: local install # compile; "sudo make install" will install only in /usr/local @@ -27,7 +30,7 @@ library: ( cd COLAMD && $(MAKE) ) ( cd SPEX && $(MAKE) ) -# compile; "make install" only in SuiteSparse/lib and SuiteSparse/include +# compile; "make install" only in SPEX/lib and SPEX/include local: ( cd SuiteSparse_config && $(MAKE) local ) ( cd AMD && $(MAKE) local ) @@ -64,8 +67,8 @@ purge: - ( cd SuiteSparse_config && $(MAKE) purge ) - ( cd AMD && $(MAKE) purge ) - ( cd COLAMD && $(MAKE) purge ) - - $(RM) -r include/* bin/* lib/* - ( cd SPEX && $(MAKE) purge ) + - $(RM) -r include/* bin/* lib/* clean: purge @@ -85,3 +88,9 @@ docs: cov: local install ( cd SPEX && $(MAKE) cov ) +debug: + ( cd SuiteSparse_config && $(MAKE) debug ) + ( cd AMD && $(MAKE) debug ) + ( cd COLAMD && $(MAKE) debug ) + ( cd SPEX && $(MAKE) debug ) + diff --git a/README.md b/README.md index ad1d4e85..225ef135 100644 --- a/README.md +++ b/README.md @@ -83,42 +83,162 @@ is provided. All it does is use cmake to build each of the packages. keeps compiled libraries and demoes, ./lib and ./include. +You can also use cmake or ccmake directly. For example, try: + + cd AMD/build + ccmake .. + make + +----------------------------------------------------------------------------- +How to cite the SPEX meta-package and its component packages: +----------------------------------------------------------------------------- + +* for AMD: + + P. Amestoy, T. A. Davis, and I. S. Duff, Algorithm 837: An approximate + minimum degree ordering algorithm, ACM Trans. on Mathematical Software, + 30(3), 2004, pp. 381--388. + https://dl.acm.org/doi/abs/10.1145/1024074.1024081 + + P. Amestoy, T. A. Davis, and I. S. Duff, An approximate minimum degree + ordering algorithm, SIAM J. Matrix Analysis and Applications, 17(4), 1996, + pp. 886--905. https://doi.org/10.1137/S0895479894278952 + +* for COLAMD: + + T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD, an + approximate column minimum degree ordering algorithm, ACM Trans. on + Mathematical Software, 30(3), 2004, pp. 377--380. + https://doi.org/10.1145/1024074.1024080 + + T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, A column approximate minimum + degree ordering algorithm, ACM Trans. on Mathematical Software, 30(3), 2004, + pp. 353--376. https://doi.org/10.1145/1024074.1024079 + +* for SPEX: + + Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and T. A. Davis. + 2022. Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via + a Sparse Left-Looking Integer-Preserving LU Factorization. ACM Trans. Math. + Softw. June 2022. https://doi.org/10.1145/3519024 + +----------------------------------------------------------------------------- +Compilation options +----------------------------------------------------------------------------- + You can set specific options for CMake with the command (for example): +``` + cmake -DBUILD_STATIC_LIBS=OFF -DCMAKE_BUILD_TYPE=Debug .. +``` - CMAKE_OPTIONS="-DNSTATIC=1 -DCMAKE_BUILD_TYPE=Debug" make +That command will compile SPEX, AMD, COLAMD, and `SuiteSparse_config`. +Debug mode will be used (the build type). The static libraries will not be +built (since `-DBUILD_STATIC_LIBS=OFF` is set). -That command will compile all of SPEX and it dependencies. -Debug mode will be used. The static libraries will not be built -(NSTATIC is true). +* `SUITESPARSE_ENABLE_PROJECTS`: - CMAKE_BUILD_TYPE: Default: "Release", use "Debug" for debugging. + Semicolon separated list of projects to be built or `all`. + Default: `all` in which case the following projects are built: - GLOBAL_INSTALL: if true, "make install" will install - into /usr/local/lib and /usr/local/include. - Default: true + `suitesparse_config;amd;colamd;spex` - LOCAL_INSTALL: if true, "make install" will install - into SuiteSparse/lib and SuiteSparse/include. - Default: false +* `CMAKE_BUILD_TYPE`: - NSTATIC: if true, static libraries are not built. - Default: false, except for GraphBLAS, which - takes a long time to compile so the default for - GraphBLAS is true. For Mongoose, the NSTATIC setting - is treated as if it always false, since the mongoose - program is built with the static library. + Default: `Release`, use `Debug` for debugging. - NOPENMP if true: OpenMP is not used. Default: false. - Only used by SuiteSparse_config. +* `SUITESPARSE_USE_STRICT`: - DEMO if true: build the demo programs for each package. - Default: false. + SuiteSparse has many user-definable settings of the form `SUITESPARSE_USE_*` + or `(package)_USE_*` for some particular package. In general, these settings + are not strict. For example, if `SUITESPARSE_USE_OPENMP` is `ON` then OpenMP + is preferred, but SuiteSparse can be used without OpenMP so no error is + generated if OpenMP is not found. However, if `SUITESPARSE_USE_STRICT` is + `ON` then all `*_USE_*` settings are treated strictly and an error occurs + if any are set to `ON` but the corresponding package or setting is not + available. The `*_USE_SYSTEM_*` settings are always treated as strict. + Default: `OFF`. -You can also use cmake or ccmake directly. For example, try: +* `CMAKE_INSTALL_PREFIX`: - cd AMD/build - ccmake .. - make + Defines the install location (default on Linux is `/usr/local`). For example, + this command while in a folder `build` in the top level SuiteSparse folder + will set the install directory to `/stuff`, used by the subsequent + `sudo cmake --install .`: +``` + cmake -DCMAKE_INSTALL_PREFIX=/stuff .. + sudo cmake --install . +``` + +* `SUITESPARSE_PKGFILEDIR`: + + Directory where CMake Config and pkg-config files will be installed. By + default, CMake Config files will be installed in the subfolder `cmake` of the + directory where the (static) libraries will be installed (e.g., `lib`). The + `.pc` files for pkg-config will be installed in the subfolder `pkgconfig` of + the directory where the (static) libraries will be installed. + + This option allows to install them at a location different from the (static) + libraries. This allows to install multiple configurations of the SuiteSparse + libraries at the same time (e.g., by also setting a different + `CMAKE_RELEASE_POSTFIX` and `CMAKE_INSTALL_LIBDIR` for each of them). To pick + up the respective configuration in downstream projects, set, e.g., + `CMAKE_PREFIX_PATH` (for CMake) or `PKG_CONFIG_PATH` (for build systems using + pkg-config) to the path containing the respective CMake Config files or + pkg-config files. + +* `SUITESPARSE_INCLUDEDIR_POSTFIX`: + + Postfix for installation target of header from SuiteSparse. Default: + suitesparse, so the default include directory is: + `CMAKE_INSTALL_PREFIX/include/suitesparse` + +* `BUILD_SHARED_LIBS`: + + If `ON`, shared libraries are built. + Default: `ON`. + +* `BUILD_STATIC_LIBS`: + + If `ON`, static libraries are built. + Default: `ON`, except for GraphBLAS, which takes a long time to compile so + the default for GraphBLAS is `OFF` unless `BUILD_SHARED_LIBS` is `OFF`. + +* `SUITESPARSE_USE_OPENMP`: + + If `ON`, OpenMP is used by default if it is available. Default: `ON`. + SPEX relies on OpenMP for its thread safety. + +* `SUITESPARSE_CONFIG_USE_OPENMP`: + + If `ON`, `SuiteSparse_config` uses OpenMP if it is available. + Default: `SUITESPARSE_USE_OPENMP`. + It is not essential and only used to let `SuiteSparse_time` call + `omp_get_wtime`. + +* `SPEX_USE_OPENMP`: + + If `ON`, OpenMP is used in SPEX if it is available. + Default: `SUITESPARSE_USE_OPENMP`. + +* `SUITESPARSE_DEMOS`: + + If `ON`, build the demo programs for each package. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_AMD`: + + If `ON`, use AMD libraries installed on the build system. If `OFF`, + automatically build AMD as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_COLAMD`: + + If `ON`, use COLAMD libraries installed on the build system. If `OFF`, + automatically build COLAMD as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_SUITESPARSE_CONFIG`: + + If `ON`, use `SuiteSparse_config` libraries installed on the build system. If + `OFF`, automatically build `SuiteSparse_config` as dependency if needed. + Default: `OFF`. ----------------------------------------------------------------------------- Acknowledgements @@ -133,9 +253,9 @@ to contact us if there's anything we can do to make your life easier. See also the various Acknowledgements within each package. -Primary Author: Chris Lourenco +Primary Author of SPEX: Chris Lourenco -Coauthors (alphabetical order): +SPEX Coauthors (alphabetical order): Jinhao Chen Timothy A Davis diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index 976a040c..b9a3929b 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -2,73 +2,110 @@ # SuiteSparse/SPEX/CMakeLists.txt: cmake for SPEX #------------------------------------------------------------------------------- -# Copyright (c) 2022-2023, Timothy A. Davis. +# SPEX: (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis, Texas A&M. # All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later #------------------------------------------------------------------------------- # get the version #------------------------------------------------------------------------------- -cmake_minimum_required ( VERSION 3.19 ) +cmake_minimum_required ( VERSION 3.22 ) -set ( SPEX_DATE "Jul 26, 2023" ) -set ( SPEX_VERSION_MAJOR 3 ) -set ( SPEX_VERSION_MINOR 0 ) -set ( SPEX_VERSION_SUB 0 ) +set ( SPEX_DATE "Mar 22, 2024" ) +set ( SPEX_VERSION_MAJOR 3 CACHE STRING "" FORCE ) +set ( SPEX_VERSION_MINOR 1 CACHE STRING "" FORCE ) +set ( SPEX_VERSION_SUB 0 CACHE STRING "" FORCE ) message ( STATUS "Building SPEX version: v" ${SPEX_VERSION_MAJOR}. ${SPEX_VERSION_MINOR}. ${SPEX_VERSION_SUB} " (" ${SPEX_DATE} ")" ) +#------------------------------------------------------------------------------- +# define the project +#------------------------------------------------------------------------------- + +project ( SPEX + VERSION "${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB}" + LANGUAGES C ) + #------------------------------------------------------------------------------- # SuiteSparse policies #------------------------------------------------------------------------------- set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${CMAKE_SOURCE_DIR}/cmake_modules - ${CMAKE_SOURCE_DIR}/../COLAMD/cmake_modules - ${CMAKE_SOURCE_DIR}/../AMD/cmake_modules - ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) + ${PROJECT_SOURCE_DIR}/cmake_modules + ${PROJECT_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) include ( SuiteSparsePolicy ) #------------------------------------------------------------------------------- -# define the project +# find OpenMP #------------------------------------------------------------------------------- -project ( spex - VERSION "${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB}" - LANGUAGES C ) +option ( SPEX_USE_OPENMP "ON: Use OpenMP in SPEX if available. OFF: Do not use OpenMP. (Default: SUITESPARSE_USE_OPENMP)" ${SUITESPARSE_USE_OPENMP} ) +if ( SPEX_USE_OPENMP ) + if ( CMAKE_VERSION VERSION_LESS 3.24 ) + find_package ( OpenMP COMPONENTS C ) + else ( ) + find_package ( OpenMP COMPONENTS C GLOBAL ) + endif ( ) +else ( ) + # OpenMP has been disabled + set ( OpenMP_C_FOUND OFF ) +endif ( ) + +if ( SPEX_USE_OPENMP AND OpenMP_C_FOUND ) + set ( SPEX_HAS_OPENMP ON ) +else ( ) + set ( SPEX_HAS_OPENMP OFF ) +endif ( ) +message ( STATUS "SPEX has OpenMP: ${SPEX_HAS_OPENMP}" ) + +# check for strict usage +if ( SUITESPARSE_USE_STRICT AND SPEX_USE_OPENMP AND NOT SPEX_HAS_OPENMP ) + message ( FATAL_ERROR "OpenMP required for SPEX but not found" ) +endif ( ) #------------------------------------------------------------------------------- # find library dependencies #------------------------------------------------------------------------------- -find_package ( SuiteSparse_config 6.0.2 REQUIRED ) -find_package ( COLAMD 3.0.2 REQUIRED ) -find_package ( AMD 3.0.2 REQUIRED ) -find_package ( GMP 6.1.2 REQUIRED ) # from SPEX/cmake_modules -find_package ( MPFR 4.0.2 REQUIRED ) # from SPEX/cmake_modules +if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) + find_package ( SuiteSparse_config 7.7.0 + PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) + endif ( ) -option ( NOPENMP "ON (default): do not use OpenMP. OFF: use OpenMP" on ) -if ( NOPENMP ) - set ( OPENMP_FOUND false ) -else ( ) - find_package ( OpenMP ) + find_package ( AMD 3.3.2 + PATHS ${CMAKE_SOURCE_DIR}/../AMD/build NO_DEFAULT_PATH ) + if ( NOT TARGET SuiteSparse::AMD ) + find_package ( AMD 3.3.2 REQUIRED ) + endif ( ) + + find_package ( COLAMD 3.3.3 + PATHS ${CMAKE_SOURCE_DIR}/../COLAMD/build NO_DEFAULT_PATH ) + if ( NOT TARGET SuiteSparse::COLAMD ) + find_package ( COLAMD 3.3.3 REQUIRED ) + endif ( ) endif ( ) -include ( SuiteSparse__thread ) +find_package ( GMP 6.1.2 REQUIRED ) # from SPEX/cmake_modules +find_package ( MPFR 4.0.2 REQUIRED ) # from SPEX/cmake_modules #------------------------------------------------------------------------------- # configure files #------------------------------------------------------------------------------- configure_file ( "Config/SPEX.h.in" - "${PROJECT_SOURCE_DIR}/Include/SPEX.h") + "${PROJECT_SOURCE_DIR}/Include/SPEX.h" + NEWLINE_STYLE LF ) configure_file ( "Config/SPEX_version.tex.in" - "${PROJECT_SOURCE_DIR}/Doc/SPEX_version.tex") + "${PROJECT_SOURCE_DIR}/Doc/SPEX_version.tex" + NEWLINE_STYLE LF ) #------------------------------------------------------------------------------- # include directories @@ -81,96 +118,154 @@ include_directories ( Include ${GMP_INCLUDE_DIR} ${MPFR_INCLUDE_DIR} ${AMD_INCLUDE_DIR} ${COLAMD_INCLUDE_DIR} ) -#------------------------------------------------------------------------------- -# compiler flags -#------------------------------------------------------------------------------- - -# (for example): -# if ( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" ) -# set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2" ) -# endif ( ) - #------------------------------------------------------------------------------- # dynamic spex library properties #------------------------------------------------------------------------------- file ( GLOB SPEX_SOURCES "SPEX*/Source/*.c" ) -add_library ( spex SHARED ${SPEX_SOURCES} ) +if ( BUILD_SHARED_LIBS ) + add_library ( SPEX SHARED ${SPEX_SOURCES} ) + + set_target_properties ( SPEX PROPERTIES + VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} + C_STANDARD 11 + C_STANDARD_REQUIRED ON + OUTPUT_NAME spex + SOVERSION ${SPEX_VERSION_MAJOR} + PUBLIC_HEADER "Include/SPEX.h" + WINDOWS_EXPORT_ALL_SYMBOLS ON ) -set_target_properties ( spex PROPERTIES - VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} - C_STANDARD_REQUIRED 11 - SOVERSION ${SPEX_VERSION_MAJOR} - PUBLIC_HEADER "Include/SPEX.h" ) + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) + set_target_properties ( SPEX PROPERTIES EXPORT_NO_SYSTEM ON ) + endif ( ) + + target_include_directories ( SPEX + INTERFACE $ + $ ) +endif ( ) #------------------------------------------------------------------------------- # static spex library properties #------------------------------------------------------------------------------- -if ( NOT NSTATIC ) -add_library ( spex_static STATIC ${SPEX_SOURCES} ) +if ( BUILD_STATIC_LIBS ) + add_library ( SPEX_static STATIC ${SPEX_SOURCES} ) -set_target_properties ( spex_static PROPERTIES - VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} - C_STANDARD_REQUIRED 11 - OUTPUT_NAME spex - SOVERSION ${SPEX_VERSION_MAJOR} ) + set_target_properties ( SPEX_static PROPERTIES + C_STANDARD 11 + C_STANDARD_REQUIRED ON + OUTPUT_NAME spex + PUBLIC_HEADER "Include/SPEX.h" ) + + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) + set_target_properties ( SPEX_static PROPERTIES + OUTPUT_NAME spex_static ) + endif ( ) + + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) + set_target_properties ( SPEX_static PROPERTIES EXPORT_NO_SYSTEM ON ) + endif ( ) + + target_include_directories ( SPEX_static + INTERFACE $ + $ ) endif ( ) #------------------------------------------------------------------------------- # add the library dependencies #------------------------------------------------------------------------------- -# suitesparseconfig: -target_link_libraries ( spex PUBLIC ${SUITESPARSE_CONFIG_LIBRARIES} ) -if ( NOT NSTATIC ) - target_link_libraries ( spex_static PUBLIC ${SUITESPARSE_CONFIG_LIBRARIES} ) +# SuiteSparseConfig: +if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SPEX PRIVATE SuiteSparse::SuiteSparseConfig ) + target_include_directories ( SPEX PUBLIC + "$" ) endif ( ) - -# OpenMP: -if ( OPENMP_FOUND ) - message ( STATUS "OpenMP C libraries: ${OpenMP_C_LIBRARIES} ") - message ( STATUS "OpenMP C include: ${OpenMP_C_INCLUDE_DIRS} ") - message ( STATUS "OpenMP C flags: ${OpenMP_C_FLAGS} ") - target_link_libraries ( spex PUBLIC ${OpenMP_C_LIBRARIES} ) - if ( NOT NSTATIC ) - target_link_libraries ( spex_static PUBLIC ${OpenMP_C_LIBRARIES} ) +if ( BUILD_STATIC_LIBS ) + if ( TARGET SuiteSparse::SuiteSparseConfig_static ) + target_link_libraries ( SPEX_static PUBLIC SuiteSparse::SuiteSparseConfig_static ) + else ( ) + target_link_libraries ( SPEX_static PUBLIC SuiteSparse::SuiteSparseConfig ) endif ( ) - set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS} " ) - include_directories ( ${OpenMP_C_INCLUDE_DIRS} ) endif ( ) # AMD: -target_link_libraries ( spex PUBLIC ${AMD_LIBRARIES} ) -if ( NOT NSTATIC ) - target_link_libraries ( spex_static PUBLIC ${AMD_STATIC} ) +if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SPEX PRIVATE SuiteSparse::AMD ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + if ( TARGET SuiteSparse::AMD_static ) + target_link_libraries ( SPEX_static PRIVATE SuiteSparse::AMD_static ) + else ( ) + target_link_libraries ( SPEX_static PRIVATE SuiteSparse::AMD ) + endif ( ) endif ( ) # COLAMD: -target_link_libraries ( spex PUBLIC ${COLAMD_LIBRARIES} ) -if ( NOT NSTATIC ) - target_link_libraries ( spex_static PUBLIC ${COLAMD_STATIC} ) +if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SPEX PRIVATE SuiteSparse::COLAMD ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + if ( TARGET SuiteSparse::COLAMD_static ) + target_link_libraries ( SPEX_static PRIVATE SuiteSparse::COLAMD_static ) + else ( ) + target_link_libraries ( SPEX_static PRIVATE SuiteSparse::COLAMD ) + endif ( ) endif ( ) # MPFR: -target_link_libraries ( spex PUBLIC ${MPFR_LIBRARIES} ) -if ( NOT NSTATIC ) - target_link_libraries ( spex_static PUBLIC ${MPFR_STATIC} ) +if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SPEX PRIVATE ${MPFR_LIBRARIES} ) + target_include_directories ( SPEX SYSTEM AFTER PUBLIC ${MPFR_INCLUDE_DIR} ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + list ( APPEND SPEX_STATIC_LIBS ${MPFR_STATIC} ) + target_link_libraries ( SPEX_static PUBLIC ${MPFR_STATIC} ) + target_include_directories ( SPEX_static SYSTEM AFTER PUBLIC ${MPFR_INCLUDE_DIR} ) endif ( ) # GMP: # must occur after MPFR -target_link_libraries ( spex PUBLIC ${GMP_LIBRARIES} ) -if ( NOT NSTATIC ) - target_link_libraries ( spex_static PUBLIC ${GMP_STATIC} ) +if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SPEX PRIVATE ${GMP_LIBRARIES} ) + target_include_directories ( SPEX SYSTEM AFTER PUBLIC ${GMP_INCLUDE_DIR} ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + list ( APPEND SPEX_STATIC_LIBS ${GMP_STATIC} ) + target_link_libraries ( SPEX_static PUBLIC ${GMP_STATIC} ) + target_include_directories ( SPEX_static SYSTEM AFTER PUBLIC ${GMP_INCLUDE_DIR} ) +endif ( ) + +# OpenMP: +if ( SPEX_HAS_OPENMP ) + message ( STATUS "OpenMP C libraries: ${OpenMP_C_LIBRARIES}" ) + message ( STATUS "OpenMP C include: ${OpenMP_C_INCLUDE_DIRS}" ) + message ( STATUS "OpenMP C flags: ${OpenMP_C_FLAGS}" ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SPEX PRIVATE OpenMP::OpenMP_C ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + target_link_libraries ( SPEX_static PRIVATE OpenMP::OpenMP_C ) + list ( APPEND SPEX_STATIC_LIBS ${OpenMP_C_LIBRARIES} ) + endif ( ) +else ( ) + # use threadprivate variables for SPEX instead of globals, so multiple user + # threads can call SPEX in parallel on different matrices. Otherwise, SPEX + # is not thread-safe (see SPEX_Utilities/Source/SPEX_gmp.c). + include ( SuiteSparse__thread ) endif ( ) # libm: -if ( NOT WIN32 ) - target_link_libraries ( spex PUBLIC m ) - if ( NOT NSTATIC ) - target_link_libraries ( spex_static PUBLIC m ) +include ( CheckSymbolExists ) +check_symbol_exists ( fmax "math.h" NO_LIBM ) +if ( NOT NO_LIBM ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SPEX PRIVATE m ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + list ( APPEND SPEX_STATIC_LIBS "m" ) + target_link_libraries ( SPEX_static PUBLIC m ) endif ( ) endif ( ) @@ -178,54 +273,179 @@ endif ( ) # SPEX installation location #------------------------------------------------------------------------------- -install ( TARGETS spex - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -install ( FILES ${CMAKE_SOURCE_DIR}/cmake_modules/FindSPEX.cmake - DESTINATION ${SUITESPARSE_LIBDIR}/cmake/SuiteSparse - COMPONENT Development ) -if ( NOT NSTATIC ) - install ( TARGETS spex_static - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} ) +include ( CMakePackageConfigHelpers ) + +if ( BUILD_SHARED_LIBS ) + install ( TARGETS SPEX + EXPORT SPEXTargets + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + install ( TARGETS SPEX_static + EXPORT SPEXTargets + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) + +# create (temporary) export target file during build +export ( EXPORT SPEXTargets + NAMESPACE SuiteSparse:: + FILE ${CMAKE_CURRENT_BINARY_DIR}/SPEXTargets.cmake ) + +# install export target, config and version files for find_package +install ( EXPORT SPEXTargets + NAMESPACE SuiteSparse:: + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SPEX ) + +# generate config file to be used in common build tree +set ( SUITESPARSE_IN_BUILD_TREE ON ) +configure_package_config_file ( + Config/SPEXConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/SPEXConfig.cmake + INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/SPEXConfig.cmake ) + +# generate config file to be installed +set ( SUITESPARSE_IN_BUILD_TREE OFF ) +configure_package_config_file ( + Config/SPEXConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/target/SPEXConfig.cmake + INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SPEX ) + +write_basic_package_version_file ( + ${CMAKE_CURRENT_BINARY_DIR}/SPEXConfigVersion.cmake + COMPATIBILITY SameMajorVersion ) + +install ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/target/SPEXConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/SPEXConfigVersion.cmake + ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/FindGMP.cmake + ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/FindMPFR.cmake + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SPEX ) + +#------------------------------------------------------------------------------- +# configure MATLAB +#------------------------------------------------------------------------------- + +cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) +if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) + set ( matlab_libdir "${SUITESPARSE_LIBDIR}") +else ( ) + set ( matlab_libdir "${CMAKE_INSTALL_PREFIX}/${SUITESPARSE_LIBDIR}") +endif ( ) +cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) +if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) + set ( matlab_includedir "${SUITESPARSE_INCLUDEDIR}") +else ( ) + set ( matlab_includedir "${CMAKE_INSTALL_PREFIX}/${SUITESPARSE_INCLUDEDIR}") +endif ( ) + +#------------------------------------------------------------------------------- +# create pkg-config file +#------------------------------------------------------------------------------- + +if ( NOT MSVC ) + # This might be something like: + # /usr/lib/libgomp.so;/usr/lib/libpthread.a;m + # convert to -l flags for pkg-config, i.e.: "-lgomp -lpthread -lm" + set ( SPEX_STATIC_LIBS_LIST ${SPEX_STATIC_LIBS} ) + set ( SPEX_STATIC_LIBS "" ) + foreach ( _lib ${SPEX_STATIC_LIBS_LIST} ) + string ( FIND ${_lib} "." _pos REVERSE ) + if ( ${_pos} EQUAL "-1" ) + set ( SPEX_STATIC_LIBS "${SPEX_STATIC_LIBS} -l${_lib}" ) + continue () + endif ( ) + set ( _kinds "SHARED" "STATIC" ) + if ( WIN32 ) + list ( PREPEND _kinds "IMPORT" ) + endif ( ) + foreach ( _kind IN LISTS _kinds ) + set ( _regex ".*\\/(lib)?([^\\.]*)(${CMAKE_${_kind}_LIBRARY_SUFFIX})" ) + if ( ${_lib} MATCHES ${_regex} ) + string ( REGEX REPLACE ${_regex} "\\2" _libname ${_lib} ) + if ( NOT "${_libname}" STREQUAL "" ) + set ( SPEX_STATIC_LIBS "${SPEX_STATIC_LIBS} -l${_libname}" ) + break () + endif ( ) + endif ( ) + endforeach ( ) + endforeach ( ) + + set ( prefix "${CMAKE_INSTALL_PREFIX}" ) + set ( exec_prefix "\${prefix}" ) + cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) + if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) + set ( libdir "${SUITESPARSE_LIBDIR}") + else ( ) + set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") + endif ( ) + cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) + if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) + set ( includedir "${SUITESPARSE_INCLUDEDIR}") + else ( ) + set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") + endif ( ) + if ( BUILD_SHARED_LIBS ) + set ( SUITESPARSE_LIB_BASE_NAME $ ) + else ( ) + set ( SUITESPARSE_LIB_BASE_NAME $ ) + endif ( ) + configure_file ( + Config/SPEX.pc.in + SPEX.pc.out + @ONLY + NEWLINE_STYLE LF ) + file ( GENERATE + OUTPUT SPEX.pc + INPUT ${CMAKE_CURRENT_BINARY_DIR}/SPEX.pc.out + NEWLINE_STYLE LF ) + install ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/SPEX.pc + DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) endif ( ) #------------------------------------------------------------------------------- # python interface #------------------------------------------------------------------------------- -file ( GLOB SPEX_PYTHON_SOURCES "Python/SPEXpy/Source/*.c" ) +if ( BUILD_SHARED_LIBS ) -add_library ( spexpython SHARED ${SPEX_PYTHON_SOURCES} ) + file ( GLOB SPEX_PYTHON_SOURCES "Python/SPEXpy/Source/*.c" ) + add_library ( spexpython SHARED ${SPEX_PYTHON_SOURCES} ) -set_target_properties ( spexpython PROPERTIES - VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} - C_STANDARD_REQUIRED 11 - SOVERSION ${SPEX_VERSION_MAJOR} - PUBLIC_HEADER "Python/SPEXpy/Source/spex_python_connect.h" ) + set_target_properties ( spexpython PROPERTIES + VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} + C_STANDARD 11 + C_STANDARD_REQUIRED ON + SOVERSION ${SPEX_VERSION_MAJOR} + PUBLIC_HEADER "Python/SPEXpy/Source/spex_python_connect.h" ) -# MPFR: -target_link_libraries ( spexpython PUBLIC ${MPFR_LIBRARIES} ) + # MPFR: + target_link_libraries ( spexpython PRIVATE ${MPFR_LIBRARIES} ) -# GMP: -# must occur after MPFR -target_link_libraries ( spexpython PUBLIC ${GMP_LIBRARIES} ) + # GMP: + # must occur after MPFR + target_link_libraries ( spexpython PRIVATE ${GMP_LIBRARIES} ) -target_link_libraries ( spexpython PUBLIC spex ) + target_link_libraries ( spexpython PRIVATE SuiteSparse::COLAMD ) + target_link_libraries ( spexpython PRIVATE SuiteSparse::AMD ) + target_link_libraries ( spexpython PRIVATE SPEX ) -install ( TARGETS spexpython - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) + install ( TARGETS spexpython + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) #------------------------------------------------------------------------------- # Demo library and programs #------------------------------------------------------------------------------- -option ( DEMO "ON: Build the demo programs. OFF (default): do not build the demo programs." off ) -if ( DEMO ) +if ( SUITESPARSE_DEMOS ) #--------------------------------------------------------------------------- # demo library @@ -250,14 +470,34 @@ if ( DEMO ) add_executable ( spex_demo_threaded "Demo/spex_demo_threaded.c" ${SPEX_DEMO_SOURCES} ) # Libraries required for Demo programs - target_link_libraries ( spex_demo_backslash PUBLIC spex ) - target_link_libraries ( spex_demo_cholesky_extended PUBLIC spex ) - target_link_libraries ( spex_demo_cholesky_simple PUBLIC spex ) - target_link_libraries ( spex_demo_lu_doub PUBLIC spex ) - target_link_libraries ( spex_demo_lu_extended PUBLIC spex ) - target_link_libraries ( spex_demo_lu_simple1 PUBLIC spex ) - target_link_libraries ( spex_demo_lu_simple2 PUBLIC spex ) - target_link_libraries ( spex_demo_threaded PUBLIC spex ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( spex_demo_backslash PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) + target_link_libraries ( spex_demo_cholesky_extended PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) + target_link_libraries ( spex_demo_cholesky_simple PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) + target_link_libraries ( spex_demo_lu_doub PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) + target_link_libraries ( spex_demo_lu_extended PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) + target_link_libraries ( spex_demo_lu_simple1 PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) + target_link_libraries ( spex_demo_lu_simple2 PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) + target_link_libraries ( spex_demo_threaded PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) + else ( ) + target_link_libraries ( spex_demo_backslash PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) + target_link_libraries ( spex_demo_cholesky_extended PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) + target_link_libraries ( spex_demo_cholesky_simple PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) + target_link_libraries ( spex_demo_lu_doub PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) + target_link_libraries ( spex_demo_lu_extended PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) + target_link_libraries ( spex_demo_lu_simple1 PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) + target_link_libraries ( spex_demo_lu_simple2 PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) + target_link_libraries ( spex_demo_threaded PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) + endif ( ) + + if ( SPEX_USE_OPENMP ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( spex_demo_threaded PUBLIC OpenMP::OpenMP_C ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + target_link_libraries ( spex_demo_threaded PUBLIC OpenMP::OpenMP_C ) + endif ( ) + endif ( ) else ( ) @@ -269,50 +509,66 @@ endif ( ) # configure MATLAB and Tcov #------------------------------------------------------------------------------- -# get paths to libraries -get_filename_component ( GMP_PATH ${GMP_LIBRARY} DIRECTORY ) -get_filename_component ( SUITESPARSE_CONFIG_PATH ${SUITESPARSE_CONFIG_LIBRARY} DIRECTORY ) -get_filename_component ( COLAMD_PATH ${COLAMD_LIBRARY} DIRECTORY ) -get_filename_component ( AMD_PATH ${AMD_LIBRARY} DIRECTORY ) -get_filename_component ( MPFR_PATH ${MPFR_LIBRARY} DIRECTORY ) - -# message ( STATUS "suitesparseconfig path ${SUITESPARSE_CONFIG_PATH}" ) -# message ( STATUS "colamd path ${COLAMD_PATH}" ) -# message ( STATUS "amd path ${AMD_PATH}" ) -# message ( STATUS "gmp path ${GMP_PATH}" ) -# message ( STATUS "mpfr path ${MPFR_PATH}" ) - -# construct the -I list -get_target_property ( INCS spex INCLUDE_DIRECTORIES ) -list ( TRANSFORM INCS PREPEND " -I" ) -set ( SPEX_INC "" ) -foreach ( INC ${INCS} ) - string ( APPEND SPEX_INC " " ${INC} ) -endforeach ( ) -# message ( STATUS "Incs: ${SPEX_INC}" ) - -# construct the library list -set ( SPEX_LIB_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}" ) -get_target_property ( LIBS spex LINK_LIBRARIES ) -string ( REPLACE "." "\\." LIBSUFFIX ${SPEX_LIB_SUFFIX} ) -set ( SPEX_LIBRARIES "" ) -foreach ( LIB_NAME ${LIBS} ) -# message ( STATUS "Lib: ${LIB_NAME}" ) - if ( LIB_NAME MATCHES ${LIBSUFFIX} ) -# message ( STATUS "has suffix" ) - string ( APPEND SPEX_LIBRARIES " " ${LIB_NAME} ) - else ( ) -# message ( STATUS "no suffix" ) - string ( APPEND SPEX_LIBRARIES " -l" ${LIB_NAME} ) - endif ( ) -endforeach ( ) -# message ( STATUS "Libs: ${SPEX_LIBRARIES}" ) - -configure_file ( "Config/spex_deps.m.in" - "${PROJECT_SOURCE_DIR}/MATLAB/spex_deps.m") +if ( BUILD_SHARED_LIBS AND NOT SUITESPARSE_ROOT_CMAKELISTS ) + + # get paths to libraries + get_filename_component ( GMP_PATH ${GMP_LIBRARY} DIRECTORY ) + get_filename_component ( SUITESPARSE_CONFIG_PATH ${SUITESPARSE_CONFIG_LIBRARY} DIRECTORY ) + get_filename_component ( COLAMD_PATH ${COLAMD_LIBRARY} DIRECTORY ) + get_filename_component ( AMD_PATH ${AMD_LIBRARY} DIRECTORY ) + get_filename_component ( MPFR_PATH ${MPFR_LIBRARY} DIRECTORY ) + + # message ( STATUS "suitesparseconfig path ${SUITESPARSE_CONFIG_PATH}" ) + # message ( STATUS "colamd path ${COLAMD_PATH}" ) + # message ( STATUS "amd path ${AMD_PATH}" ) + # message ( STATUS "gmp path ${GMP_PATH}" ) + # message ( STATUS "mpfr path ${MPFR_PATH}" ) + + # construct the -I list + get_target_property ( INCS SPEX INCLUDE_DIRECTORIES ) + list ( TRANSFORM INCS PREPEND " -I" ) + set ( SPEX_INCS "" ) + foreach ( INC ${INCS} ) + # message ( STATUS "check inc: ${INC}" ) + if ( NOT ${INC} MATCHES "TARGET_PROPERTY" ) + # message ( STATUS "add inc: ${INC}" ) + string ( APPEND SPEX_INCS " " ${INC} ) + endif ( ) + endforeach ( ) + # message ( STATUS "Incs: ${SPEX_INCS}" ) + + # construct the library list for Tcov/Makefile + set ( SPEX_LIB_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}" ) + get_target_property ( LIBS SPEX LINK_LIBRARIES ) + string ( REPLACE "." "\\." LIBSUFFIX ${SPEX_LIB_SUFFIX} ) + set ( SPEX_LIBS "" ) + foreach ( LIB_NAME ${LIBS} ) + # message ( STATUS "Lib: ${LIB_NAME}" ) + if ( LIB_NAME MATCHES "::" ) + # do nothing + elseif ( LIB_NAME MATCHES ${LIBSUFFIX} ) + # message ( STATUS "has suffix" ) + string ( APPEND SPEX_LIBS " " ${LIB_NAME} ) + else ( ) + # message ( STATUS "no suffix" ) + string ( APPEND SPEX_LIBS " -l" ${LIB_NAME} ) + endif ( ) + endforeach ( ) + # message ( STATUS "Libs: ${SPEX_LIBS}" ) + + configure_file ( + "Config/spex_deps.m.in" + "${PROJECT_SOURCE_DIR}/MATLAB/spex_deps.m" + @ONLY + NEWLINE_STYLE LF ) + + configure_file ( + "Config/Tcov_Makefile.in" + "${PROJECT_SOURCE_DIR}/Tcov/Makefile" + @ONLY + NEWLINE_STYLE LF ) -configure_file ( "Config/Tcov_Makefile.in" - "${PROJECT_SOURCE_DIR}/Tcov/Makefile") +endif ( ) #------------------------------------------------------------------------------- # report status diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index 2961797b..cbdb791f 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -2,8 +2,8 @@ // SPEX/Include/SPEX.h: Include file for SPEX Library //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -27,7 +27,7 @@ //------------------------------------------------------------------------------ // Unless otherwise noted all functions are authored by: // -// Christopher Lourenco, Jinhao Chen, +// Christopher Lourenco, Jinhao Chen, // Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis // @@ -66,8 +66,8 @@ // // See license.txt for license info. // -// This software is copyright by Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. +// This software is copyright by Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // @@ -95,13 +95,40 @@ #include #include #include -#include -#include -#include -#include +// #include +// #include +// #include +// #include #include "SuiteSparse_config.h" -#include "amd.h" -#include "colamd.h" + +//------------------------------------------------------------------------------ +// SPEX Version +//------------------------------------------------------------------------------ + +// Current version of the code +#define SPEX_DATE "@SPEX_DATE@" +#define SPEX_VERSION_STRING "@SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@" +#define SPEX_VERSION_MAJOR @SPEX_VERSION_MAJOR@ +#define SPEX_VERSION_MINOR @SPEX_VERSION_MINOR@ +#define SPEX_VERSION_SUB @SPEX_VERSION_SUB@ + +#define SPEX_VERSION_NUMBER(major,minor,sub) \ + (((major)*1000ULL + (minor))*1000ULL + (sub)) +#define SPEX_VERSION \ + SPEX_VERSION_NUMBER (SPEX_VERSION_MAJOR, \ + SPEX_VERSION_MINOR, \ + SPEX_VERSION_SUB) + +#define SPEX__VERSION SUITESPARSE__VERCODE(@SPEX_VERSION_MAJOR@,@SPEX_VERSION_MINOR@,@SPEX_VERSION_SUB@) +#if !defined (SUITESPARSE__VERSION) || \ + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "SPEX @SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" +#endif + +#if defined ( __cplusplus ) +extern "C" +{ +#endif //------------------------------------------------------------------------------ // Error codes @@ -128,23 +155,9 @@ typedef enum SPEX_info ; //------------------------------------------------------------------------------ -// SPEX Version +// SPEX Version, continued //------------------------------------------------------------------------------ -// Current version of the code -#define SPEX_DATE "@SPEX_DATE@" -#define SPEX_VERSION_STRING "@SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@" -#define SPEX_VERSION_MAJOR @SPEX_VERSION_MAJOR@ -#define SPEX_VERSION_MINOR @SPEX_VERSION_MINOR@ -#define SPEX_VERSION_SUB @SPEX_VERSION_SUB@ - -#define SPEX_VERSION_NUMBER(major,minor,sub) \ - (((major)*1000ULL + (minor))*1000ULL + (sub)) -#define SPEX_VERSION \ - SPEX_VERSION_NUMBER (SPEX_VERSION_MAJOR, \ - SPEX_VERSION_MINOR, \ - SPEX_VERSION_SUB) - SPEX_info SPEX_version ( int version [3], // SPEX major, minor, and sub version @@ -166,6 +179,42 @@ SPEX_info SPEX_version #error "MPFR v4.0.2 or later is required." #endif +//------------------------------------------------------------------------------ +// SPEX_TRY: try a SPEX method and check for errors +//------------------------------------------------------------------------------ + +// In a robust application, the return values from each call to SPEX should be +// checked, and corrective action should be taken if an error occurs. The +// SPEX_TRY macros assist in this effort. +// +// SPEX is written in C, and so it cannot rely on the try/catch mechanism of +// C++. To accomplish a similar goal, we provide our mechanism. The SPEX_TRY +// macro calls a single SPEX method and then takes corrected action based on a +// user-defined macro SPEX_CATCH. + +#define SPEX_TRY(method) \ +{ \ + SPEX_info info = (method) ; \ + if (info != SPEX_OK) \ + { \ + SPEX_CATCH (info) ; \ + } \ +} + +// A typical example user application might #define SPEX_CATCH as follows. +// Suppose the user function needs to free some workspace and return to the +// caller if an error occurs: + +/* + #define SPEX_CATCH(info) \ + { \ + SPEX_matrix_free (&A, NULL) ; \ + fprintf (stderr, "SPEX failed: info %d, line %d, file %s\n", \ + info, __LINE__, __FILE__) ; \ + return (info) ; \ + } \ +*/ + //------------------------------------------------------------------------------ // Pivot scheme codes //------------------------------------------------------------------------------ @@ -339,7 +388,7 @@ SPEX_type ; // A->x. For example, if A->p_shallow is true, then a non-NULL A->p is a // pointer to a read-only array, and the A->p array is not freed by // SPEX_matrix_free. If A->p is NULL (for a triplet or dense matrix), then -// A->p_shallow has no effect. +// A->p_shallow has no effect. typedef struct { @@ -405,6 +454,20 @@ typedef struct // A SPEX_matrix is a pointer to a SPEX_matrix_struct typedef SPEX_matrix_struct *SPEX_matrix ; +//------------------------------------------------------------------------------ +// SPEX_matrix macros +//------------------------------------------------------------------------------ + +// These macros simplify the access to entries in a SPEX_matrix. +// The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. + +// To access the kth entry in a SPEX_matrix using 1D linear addressing, +// in any matrix kind (CSC, triplet, or dense), in any type: +#define SPEX_1D(A,k,type) ((A)->x.type [k]) + +// To access the (i,j)th entry in a 2D dense SPEX_matrix, in any type: +#define SPEX_2D(A,i,j,type) SPEX_1D (A, (i)+(j)*((A)->m), type) + //------------------------------------------------------------------------------ // SPEX_matrix_allocate: allocate an m-by-n SPEX_matrix //------------------------------------------------------------------------------ @@ -487,7 +550,7 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code // SPEX_matrix_copy: make a copy of a SPEX_matrix, into another kind and type. // SPEX supports 16 matrix formats: 15 of them are all combinations of -// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). +// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). SPEX_info SPEX_matrix_copy ( @@ -792,8 +855,6 @@ SPEX_info SPEX_determine_symmetry const SPEX_options option // Command options ) ; -// ended HERE on Apr 10. - //------------------------------------------------------------------------------ //---------------------------SPEX GMP/MPFR Functions---------------------------- //------------------------------------------------------------------------------ @@ -915,6 +976,8 @@ SPEX_info SPEX_mpq_equal (int *r, const mpq_t x, const mpq_t y) ; SPEX_info SPEX_mpfr_init2(mpfr_t x, const uint64_t size) ; +SPEX_info SPEX_mpfr_set_prec(mpfr_t x, const uint64_t size) ; + SPEX_info SPEX_mpfr_set (mpfr_t x, const mpfr_t y, const mpfr_rnd_t rnd) ; SPEX_info SPEX_mpfr_set_d (mpfr_t x, const double y, const mpfr_rnd_t rnd) ; @@ -951,6 +1014,13 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; +SPEX_info SPEX_mpz_set_null (mpz_t x) ; +SPEX_info SPEX_mpq_set_null (mpq_t x) ; +SPEX_info SPEX_mpfr_set_null (mpfr_t x) ; +SPEX_info SPEX_mpz_clear (mpz_t x) ; +SPEX_info SPEX_mpq_clear (mpq_t x) ; +SPEX_info SPEX_mpfr_clear (mpfr_t x) ; + //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -964,7 +1034,7 @@ SPEX_info SPEX_mpfr_free_str (char *str) ; // "Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via // a Sparse Left-looking Integer-preserving LU Factorization", -// C. Lourenco, J. Chen, E. Moreno-Centeno, T. Davis, +// C. Lourenco, J. Chen, E. Moreno-Centeno, T. Davis, // ACM Trans. Mathematical Software. pp 1-23, vol 48, no 2, 2022. // The theory associated with this software can be found in the paper @@ -990,7 +1060,7 @@ SPEX_info SPEX_mpfr_free_str (char *str) ; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Christopher Lourenco, Jinhao Chen, Timothy A. Davis, and Erick Moreno-Centeno +// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis //------------------------------------------------------------------------------ @@ -1141,7 +1211,7 @@ SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b //------------------------------------------------------------------------------ // Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. //------------------------------------------------------------------------------ @@ -1299,5 +1369,9 @@ SPEX_info SPEX_backslash SPEX_options option // Command options (NULL: means use defaults) ) ; +#if defined ( __cplusplus ) +} +#endif + #endif diff --git a/SPEX/Config/SPEX.pc.in b/SPEX/Config/SPEX.pc.in new file mode 100644 index 00000000..2f347cfa --- /dev/null +++ b/SPEX/Config/SPEX.pc.in @@ -0,0 +1,18 @@ +# SPEX, Copyright (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis, Texas A&M. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: SPEX +URL: https://github.com/DrTimothyAldenDavis/SuiteSparse +Description: Software package for SParse EXact algebra in SuiteSparse +Version: @SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@ +Requires.private: SuiteSparse_config AMD COLAMD +Libs: -L${libdir} -l@SUITESPARSE_LIB_BASE_NAME@ +Libs.private: @SPEX_STATIC_LIBS@ +Cflags: -I${includedir} diff --git a/SPEX/Config/SPEXConfig.cmake.in b/SPEX/Config/SPEXConfig.cmake.in new file mode 100644 index 00000000..d61890d6 --- /dev/null +++ b/SPEX/Config/SPEXConfig.cmake.in @@ -0,0 +1,190 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/SPEX/cmake_modules/SPEXConfig.cmake +#------------------------------------------------------------------------------- + +# SPEX, Copyright (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis, Texas A&M. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +#------------------------------------------------------------------------------- + +# Finds the SPEX include file and compiled library. +# The following targets are defined: +# SuiteSparse::SPEX - for the shared library (if available) +# SuiteSparse::SPEX_static - for the static library (if available) + +# For backward compatibility the following variables are set: + +# SPEX_INCLUDE_DIR - where to find SPEX.h +# SPEX_LIBRARY - dynamic SPEX library +# SPEX_STATIC - static SPEX library +# SPEX_LIBRARIES - libraries when using SPEX +# SPEX_FOUND - true if SPEX found + +# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is +# installed. + +#------------------------------------------------------------------------------- + +@PACKAGE_INIT@ + +set ( SPEX_DATE "@SPEX_DATE@" ) +set ( SPEX_VERSION_MAJOR @SPEX_VERSION_MAJOR@ ) +set ( SPEX_VERSION_MINOR @SPEX_VERSION_MINOR@ ) +set ( SPEX_VERSION_PATCH @SPEX_VERSION_SUB@ ) +set ( SPEX_VERSION "@SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@" ) + +# Check for dependent targets +include ( CMakeFindDependencyMacro ) + +# Look for SuiteSparse_config, AMD and COLAMD targets +if ( @SUITESPARSE_IN_BUILD_TREE@ ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + # First check in a common build tree + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ + PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) + # Then, check in the currently active CMAKE_MODULE_PATH + if ( NOT SuiteSparse_config_FOUND ) + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) + endif ( ) + endif ( ) + + if ( NOT TARGET SuiteSparse::AMD ) + # First check in a common build tree + find_dependency ( AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@ + PATHS ${CMAKE_SOURCE_DIR}/../AMD/build NO_DEFAULT_PATH ) + # Then, check in the currently active CMAKE_MODULE_PATH + if ( NOT AMD_FOUND ) + find_dependency ( AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@ ) + endif ( ) + endif ( ) + + if ( NOT TARGET SuiteSparse::COLAMD ) + # First check in a common build tree + find_dependency ( COLAMD @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@ + PATHS ${CMAKE_SOURCE_DIR}/../COLAMD/build NO_DEFAULT_PATH ) + # Then, check in the currently active CMAKE_MODULE_PATH + if ( NOT COLAMD_FOUND ) + find_dependency ( COLAMD @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@ ) + endif ( ) + endif ( ) + +else ( ) + if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) + find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) + endif ( ) + if ( NOT TARGET SuiteSparse::AMD ) + find_dependency ( AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@ ) + endif ( ) + if ( NOT TARGET SuiteSparse::COLAMD ) + find_dependency ( COLAMD @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@ ) + endif ( ) +endif ( ) + +# Look for GMP and MPFR modules +list ( PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ) +if ( NOT GMP_FOUND ) + find_dependency ( GMP 6.1.2 ) +endif ( ) +if ( NOT MPFR_FOUND ) + find_dependency ( MPFR 4.0.2 ) +endif ( ) + +if ( NOT SuiteSparse_config_FOUND OR NOT AMD_FOUND OR NOT COLAMD_FOUND + OR NOT GMP_FOUND OR NOT MPFR_FOUND) + set ( SPEX_FOUND OFF ) + return ( ) +endif ( ) + + +# Import target +include ( ${CMAKE_CURRENT_LIST_DIR}/SPEXTargets.cmake ) + +# The following is only for backward compatibility with FindSPEX. + +set ( _target_shared SuiteSparse::SPEX ) +set ( _target_static SuiteSparse::SPEX_static ) +set ( _var_prefix "SPEX" ) + +if ( NOT @BUILD_SHARED_LIBS@ AND NOT TARGET ${_target_shared} ) + # make sure there is always an import target without suffix ) + add_library ( ${_target_shared} ALIAS ${_target_static} ) +endif ( ) + +get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) +if ( ${_var_prefix}_INCLUDE_DIR ) + # First item in SuiteSparse targets contains the "main" header directory. + list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) +endif ( ) +get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) +if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) +endif ( ) +if ( TARGET ${_target_static} ) + get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) +endif ( ) + +# Check for most common build types +set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) + +get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) +if ( _isMultiConfig ) + # For multi-configuration generators (e.g., Visual Studio), prefer those + # configurations. + list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) +else ( ) + # For single-configuration generators, prefer the current configuration. + list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) +endif ( ) + +list ( REMOVE_DUPLICATES _config_types ) + +foreach ( _config ${_config_types} ) + string ( TOUPPER ${_config} _uc_config ) + if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} + IMPORTED_IMPLIB_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) + endif ( ) + if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} + IMPORTED_LOCATION_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) + endif ( ) + if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) + get_target_property ( _library_chk ${_target_static} + IMPORTED_LOCATION_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_STATIC ${_library_chk} ) + endif ( ) + endif ( ) +endforeach ( ) + +set ( SPEX_LIBRARIES ${SPEX_LIBRARY} ) + +macro ( suitesparse_check_exist _var _files ) + # ignore generator expressions + string ( GENEX_STRIP "${_files}" _files2 ) + + foreach ( _file ${_files2} ) + if ( NOT EXISTS "${_file}" ) + message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) + endif ( ) + endforeach () +endmacro ( ) + +suitesparse_check_exist ( SPEX_INCLUDE_DIR ${SPEX_INCLUDE_DIR} ) +suitesparse_check_exist ( SPEX_LIBRARY ${SPEX_LIBRARY} ) + +message ( STATUS "SPEX version: ${SPEX_VERSION}" ) +message ( STATUS "SPEX include: ${SPEX_INCLUDE_DIR}" ) +message ( STATUS "SPEX library: ${SPEX_LIBRARY}" ) +message ( STATUS "SPEX static: ${SPEX_STATIC}" ) diff --git a/SPEX/Config/Tcov_Makefile.in b/SPEX/Config/Tcov_Makefile.in index cd861fb2..450815fe 100644 --- a/SPEX/Config/Tcov_Makefile.in +++ b/SPEX/Config/Tcov_Makefile.in @@ -2,8 +2,8 @@ # SPEX/Tcov/Makefile: compile and run SPEX test coverage #------------------------------------------------------------------------------- -# SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2019-2024, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -16,8 +16,11 @@ SUITESPARSE ?= $(realpath $(CURDIR)/../..) ################################################################################ # configured by CMake: -INC = @SPEX_INC@ -LIBS = @SPEX_LIBRARIES@ +INC = @SPEX_INCS@ +LIBS = ../../SuiteSparse_config/build/libsuitesparseconfig.so \ + ../../AMD/build/libamd.so \ + ../../COLAMD/build/libcolamd.so \ + @SPEX_LIBS@ SUITESPARSE_CONFIG_PATH = @SUITESPARSE_CONFIG_PATH@ COLAMD_PATH = @COLAMD_PATH@ @@ -42,10 +45,13 @@ MPFR_PATH = @MPFR_PATH@ ################################################################################ -# select the thread-safety mechanism to test: none, openmp, or pthreads. +# select the thread-safety mechanism to test: none, openmp, etc +# none: # THREADS = +# opemp: # THREADS = -fopenmp - THREADS = -DSPEX_USE_PTHREADS -pthread +# __thread keyword (gcc and many compilers): + THREADS = -DHAVE_KEYWORD__THREAD # Linux test coverage (gcc is required for test coverage) CC = gcc @@ -60,7 +66,8 @@ CFLAGS = -g -fprofile-arcs -ftest-coverage \ cov: runtests ./covall -all: tcov_for_lu spex_demo_lu_extended tcov_for_cholesky tcov_for_lu2 +all: tcov_for_lu spex_demo_lu_extended tcov_for_cholesky tcov_for_lu2 \ + tcov_for_other #------------------------------------------------------------------------------- # compile .c file in this folder @@ -81,6 +88,9 @@ OBJ_Util = \ spex_create_mpfr_array.o \ spex_create_mpq_array.o \ spex_create_mpz_array.o \ + spex_free_mpfr_array.o \ + spex_free_mpq_array.o \ + spex_free_mpz_array.o \ spex_cumsum.o \ spex_expand_double_array.o \ spex_expand_mpfr_array.o \ @@ -106,8 +116,7 @@ OBJ_Util = \ SPEX_determine_symmetry.o \ SPEX_transpose.o \ spex_amd.o \ - spex_colamd.o \ - spex_create_mpq.o + spex_colamd.o $(OBJ_Util): ../Include/SPEX.h ../SPEX_Utilities/Source/spex_util_internal.h @@ -211,6 +220,9 @@ spex_demo_lu_extended: $(OBJ_Util) $(OBJ_LU) ../Demo/spex_demo_lu_extended.c $( tcov_for_cholesky: $(OBJ_Tcov) $(OBJ_Util) $(OBJ_Cholesky) tcov_for_cholesky.c simple_rand.c simple_rand.h $(DEMO_SRC) $(CC) $(LDFLAGS) $(CFLAGS) tcov_for_cholesky.c simple_rand.c $(DEMO_SRC) -o tcov_for_cholesky $(OBJ_Tcov) $(OBJ_Util) $(OBJ_Cholesky) $(LIBS) +tcov_for_other: $(OBJ_Tcov) $(OBJ_Util) $(OBJ_LU) tcov_for_other.c + $(CC) $(LDFLAGS) tcov_for_other.c $(CFLAGS) -o tcov_for_other $(OBJ_Tcov) $(OBJ_Util) $(OBJ_LU) $(LIBS) + #------------------------------------------------------------------------------- # run all statement coverage tests @@ -218,18 +230,19 @@ runtests: runtests4llu runtests4chol # only run test for SPEX_LU runtests4llu: all - - ./spex_demo_lu_extended p 2 q 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu1.out - - ./spex_demo_lu_extended p 3 q 2 o 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu2.out - - ./spex_demo_lu_extended p 4 q 3 o 1 f ../ExampleMats/test.mat.txt ../ExampleMats/test.rhs.txt > lu3.out - - ./spex_demo_lu_extended p 5 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu4.out - - ./tcov_for_lu > test_for_lu.out - - ./tcov_for_lu 0 1 1 > lu5.out - - ./tcov_for_lu2 ../ExampleMats/Trefethen_500.mat.txt ../ExampleMats/Trefethen_500.rhs.txt > test_for_lu2.out + ./tcov_for_other + ./spex_demo_lu_extended q 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu1.out + ./spex_demo_lu_extended q 2 o 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu2.out + ./spex_demo_lu_extended q 3 o 1 f ../ExampleMats/test.mat.txt ../ExampleMats/test.rhs.txt > lu3.out + ./spex_demo_lu_extended f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu4.out + ./tcov_for_lu > test_for_lu.out + ./tcov_for_lu 0 1 1 > lu5.out + ./tcov_for_lu2 ../ExampleMats/Trefethen_500.mat.txt ../ExampleMats/Trefethen_500.rhs.txt > test_for_lu2.out # only run test for SPEX_Cholesky runtests4chol: all - - ./tcov_for_cholesky ../ExampleMats/mesh1e1.mat.txt ../ExampleMats/mesh1e1.rhs.txt > test_for_cholesky.out + ./tcov_for_cholesky ../ExampleMats/mesh1e1.mat.txt ../ExampleMats/mesh1e1.rhs.txt > test_for_cholesky.out #------------------------------------------------------------------------------- @@ -242,24 +255,28 @@ vtests: vtests4llu vtests4chol # run test for SPEX_LU with valgrind vtests4llu: all - - $(V) ./spex_demo_lu_extended p 2 q 0 f ../ExampleMats/10teams_mat.txt ../ExampleMats/10teams_v.txt > lu1.out - - $(V) ./spex_demo_lu_extended p 3 q 1 o 1 f ../ExampleMats/10teams_mat.txt ../ExampleMats/10teams_v.txt > lu2.out - - $(V) ./spex_demo_lu_extended p 4 q 2 o 1 f ../ExampleMats/test_mat.txt ../ExampleMats/test_rhs.txt > lu3.out - - $(V) ./spex_demo_lu_extended p 5 f ../ExampleMats/10teams_mat.txt ../ExampleMats/10teams_v.txt > lu4.out - - $(V) ./tcov_for_lu > test_for_lu.out - - $(V) ./tcov_for_lu 0 1 1 > lu5.out - + $(V) ./tcov_for_other + $(V) ./spex_demo_lu_extended q 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu1.out + $(V) ./spex_demo_lu_extended q 2 o 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu2.out + $(V) ./spex_demo_lu_extended q 3 o 1 f ../ExampleMats/test.mat.txt ../ExampleMats/test.rhs.txt > lu3.out + $(V) ./spex_demo_lu_extended f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu4.out + $(V) ./tcov_for_lu > test_for_lu.out + $(V) ./tcov_for_lu 0 1 1 > lu5.out + $(V) ./tcov_for_lu2 ../ExampleMats/Trefethen_500.mat.txt ../ExampleMats/Trefethen_500.rhs.txt > test_for_lu2.out + +vtest2: all + $(V) ./tcov_for_lu2 ../ExampleMats/Trefethen_500.mat.txt ../ExampleMats/Trefethen_500.rhs.txt > test_for_lu2.out # run test for SPEX_Cholesky with valgrind vtests4chol: all - - $(V) ./tcov_for_cholesky ../ExampleMats/872.mat.txt > test_for_cholesky.out + $(V) ./tcov_for_cholesky ../ExampleMats/mesh1e1.mat.txt ../ExampleMats/mesh1e1.rhs.txt > test_for_cholesky.out #------------------------------------------------------------------------------- # remove all files not in the original distribution, including symbolic links clean: - $(RM) *.o *.bbg *.da *.gcov *.gcda *gcno - - $(RM) tcov_for_lu spex_demo_lu_extended *.out *.a out tcov_for_lu2 + - $(RM) tcov_for_lu spex_demo_lu_extended *.out *.a out tcov_for_lu2 tcov_for_other - $(RM) -r SPEX_*.c spex_*.c *.dSYM - $(RM) -r tcov_for_cholesky diff --git a/SPEX/Config/spex_deps.m.in b/SPEX/Config/spex_deps.m.in index f9953068..73e347c8 100644 --- a/SPEX/Config/spex_deps.m.in +++ b/SPEX/Config/spex_deps.m.in @@ -6,15 +6,15 @@ function [suitesparse_libdir, suitesparse_incdir, gmp_lib, gmp_include, mpfr_lib % On Linux you may need to add the following to your shell script (typically % .bashrc), start a new shell, and then start MATLAB again. % -% LD_LIBRARY_PATH=$LD_LIBRARY_PATH:@SUITESPARSE_LIBDIR@ +% LD_LIBRARY_PATH=$LD_LIBRARY_PATH:@matlab_libdir@ -% SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +% SPEX: (c) 2022-2024, Chris Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later -suitesparse_libdir = '@SUITESPARSE_LIBDIR@' ; -suitesparse_incdir = '@SUITESPARSE_INCLUDEDIR@' ; +suitesparse_libdir = '@matlab_libdir@' ; +suitesparse_incdir = '@matlab_includedir@' ; gmp_lib = '@GMP_LIBRARY@' ; gmp_include = '@GMP_INCLUDE_DIR@' ; mpfr_lib = '@MPFR_LIBRARY@' ; diff --git a/SPEX/Demo/Utilities/spex_demo_check_solution.c b/SPEX/Demo/Utilities/spex_demo_check_solution.c index 9e2a8c8a..adaf402b 100644 --- a/SPEX/Demo/Utilities/spex_demo_check_solution.c +++ b/SPEX/Demo/Utilities/spex_demo_check_solution.c @@ -2,25 +2,23 @@ // Demo/spex_check_solution: checks whether a given vector exactly solves Ax=b //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ - #include "spex_demos.h" #undef FREE_WORKSPACE #define FREE_WORKSPACE \ { \ - SPEX_MPQ_CLEAR(temp); \ - SPEX_MPQ_CLEAR(scale); \ + SPEX_mpq_clear (temp) ; \ + SPEX_mpq_clear (scale) ; \ SPEX_matrix_free(&b2, NULL); \ } - SPEX_info spex_demo_check_solution ( const SPEX_matrix A, // Input matrix @@ -29,34 +27,30 @@ SPEX_info spex_demo_check_solution const SPEX_options option // Command options ) { - if (!SPEX_initialize ( )) return (SPEX_PANIC); - - //-------------------------------------------------------------------------- - // check inputs. Input are also checked by the two callers - //-------------------------------------------------------------------------- - - SPEX_info info ; - /*SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ); - SPEX_REQUIRE (x, SPEX_DENSE, SPEX_MPQ); - SPEX_REQUIRE (b, SPEX_DENSE, SPEX_MPZ);*/ //-------------------------------------------------------------------------- // Declare vars //-------------------------------------------------------------------------- + mpq_t temp; + mpq_t scale; int64_t p, j, i, nz; SPEX_matrix b2 = NULL; // b2 stores the solution of A*x - mpq_t temp; SPEX_MPQ_SET_NULL(temp); - mpq_t scale; SPEX_MPQ_SET_NULL(scale); + int r; + SPEX_mpq_set_null (temp) ; + SPEX_mpq_set_null (scale) ; - SPEX_MPQ_INIT(temp); - SPEX_MPQ_INIT(scale); - SPEX_CHECK (SPEX_matrix_allocate(&b2, SPEX_DENSE, SPEX_MPQ, b->m, b->n, - b->nzmax, false, true, option)); + //-------------------------------------------------------------------------- + // initialize + //-------------------------------------------------------------------------- + SPEX_TRY (SPEX_mpq_init(temp)); + SPEX_TRY (SPEX_mpq_init(scale)); + SPEX_TRY (SPEX_matrix_allocate(&b2, SPEX_DENSE, SPEX_MPQ, b->m, b->n, + b->nzmax, false, true, option)); //-------------------------------------------------------------------------- - // perform SPEX_mpq_addmul in loops to compute b2 = A'*x, where A' is the + // perform SPEX_mpq_add,mul in loops to compute b2 = A'*x, where A' is the // scaled matrix with all entries in integer //-------------------------------------------------------------------------- @@ -68,15 +62,15 @@ SPEX_info spex_demo_check_solution { // temp = A[p][i] (note this must be done seperately since A is // mpz and temp is mpq) - SPEX_MPQ_SET_Z(temp, A->x.mpz[p]); + SPEX_TRY (SPEX_mpq_set_z(temp, A->x.mpz[p])); // temp = temp*x[i] - SPEX_MPQ_MUL(temp, temp, - SPEX_2D(x, i, j, mpq)); + SPEX_TRY (SPEX_mpq_mul(temp, temp, + SPEX_2D(x, i, j, mpq))); // b2[p] = b2[p]-temp - SPEX_MPQ_ADD(SPEX_2D(b2, A->i[p], j, mpq), - SPEX_2D(b2, A->i[p], j, mpq),temp); + SPEX_TRY (SPEX_mpq_add(SPEX_2D(b2, A->i[p], j, mpq), + SPEX_2D(b2, A->i[p], j, mpq),temp)); } } } @@ -85,17 +79,16 @@ SPEX_info spex_demo_check_solution // Apply scales of A and b to b2 before comparing the b2 with scaled b' //-------------------------------------------------------------------------- - SPEX_MPQ_DIV(scale, b->scale, A->scale); + SPEX_TRY (SPEX_mpq_div(scale, b->scale, A->scale)); // Apply scaling factor, but ONLY if it is not 1 - int r; - SPEX_MPQ_CMP_UI(&r, scale, 1, 1); + SPEX_TRY (SPEX_mpq_cmp_ui(&r, scale, 1, 1)); if (r != 0) { nz = x->m * x->n; for (i = 0; i < nz; i++) { - SPEX_MPQ_MUL(b2->x.mpq[i], b2->x.mpq[i], scale); + SPEX_TRY (SPEX_mpq_mul(b2->x.mpq[i], b2->x.mpq[i], scale)); } } @@ -108,40 +101,25 @@ SPEX_info spex_demo_check_solution for (i = 0; i < b->m; i++) { // temp = b[i] (correct b) - SPEX_MPQ_SET_Z(temp, SPEX_2D(b, i, j, mpz)); + SPEX_TRY (SPEX_mpq_set_z(temp, SPEX_2D(b, i, j, mpz))); // set check false if b!=b2 - SPEX_MPQ_EQUAL(&r, temp, SPEX_2D(b2, i, j, mpq)); + SPEX_TRY (SPEX_mpq_equal(&r, temp, SPEX_2D(b2, i, j, mpq))); if (r == 0) { - //printf("ERROR\n"); - info = SPEX_PANIC; - j = b->n; - break; + // This can "never" happen. + fprintf (stderr, "ERROR! Solution is wrong. This is a bug;" + "please contact the authors of SPEX.\n"); + SPEX_TRY (SPEX_PANIC) ; } } } - //-------------------------------------------------------------------------- - // Print info - //-------------------------------------------------------------------------- - - int pr = SPEX_OPTION_PRINT_LEVEL (option); - if (info == SPEX_OK) - { - SPEX_PR1 ("Solution is verified to be exact.\n"); - } - else if (info == SPEX_PANIC) - { - // This can never happen. - SPEX_PR1 ("ERROR! Solution is wrong. This is a bug; please " - "contact the authors of SPEX.\n"); - } - //-------------------------------------------------------------------------- // Free memory //-------------------------------------------------------------------------- FREE_WORKSPACE ; - return info; + return SPEX_OK ; } + diff --git a/SPEX/Demo/Utilities/spex_demo_determine_error.c b/SPEX/Demo/Utilities/spex_demo_determine_error.c index 3cc1d980..d11d518c 100644 --- a/SPEX/Demo/Utilities/spex_demo_determine_error.c +++ b/SPEX/Demo/Utilities/spex_demo_determine_error.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// Demo/spex_determine_error: auxiliary file for test coverage (tcov) +// Demo/spex_determine_error: auxiliary file for user demos //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -14,22 +14,24 @@ #include "spex_demos.h" - void spex_demo_determine_error ( - SPEX_info ok + SPEX_info info, + int line, + char *file ) { - if (ok == SPEX_OUT_OF_MEMORY) + if (info == SPEX_OUT_OF_MEMORY) { - printf("\nOut of memory\n"); + printf("\nSPEX: Out of memory\n"); } - else if (ok == SPEX_SINGULAR) + else if (info == SPEX_SINGULAR) { - printf("\nInput matrix is singular OR no diagonal pivot. Please ensure input is SPD\n"); + printf("\nSPEX: Input matrix is singular OR no diagonal pivot. Please ensure input is SPD\n"); } - else if (ok == SPEX_INCORRECT_INPUT) + else if (info == SPEX_INCORRECT_INPUT) { - printf("\nIncorrect input for a SPEX_Chol Function\n"); + printf("\nSPEX: Incorrect input for a SPEX_Chol Function\n"); } + printf ("line %d, file: %s\n", line, file) ; } diff --git a/SPEX/Demo/Utilities/spex_demo_process_command_line.c b/SPEX/Demo/Utilities/spex_demo_process_command_line.c index c05bcf25..84b8de43 100644 --- a/SPEX/Demo/Utilities/spex_demo_process_command_line.c +++ b/SPEX/Demo/Utilities/spex_demo_process_command_line.c @@ -2,8 +2,8 @@ // Demo/spex_process_command_line: processes command line for user specified options //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Demo/Utilities/spex_demo_read_dense.c b/SPEX/Demo/Utilities/spex_demo_read_dense.c index 19faff8a..2bd6d59c 100644 --- a/SPEX/Demo/Utilities/spex_demo_read_dense.c +++ b/SPEX/Demo/Utilities/spex_demo_read_dense.c @@ -2,8 +2,8 @@ // Demo/spex_read_dense: reads an integral dense matrix //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Demo/Utilities/spex_demo_tripread.c b/SPEX/Demo/Utilities/spex_demo_tripread.c index eb8bd8cd..363937e0 100644 --- a/SPEX/Demo/Utilities/spex_demo_tripread.c +++ b/SPEX/Demo/Utilities/spex_demo_tripread.c @@ -2,8 +2,8 @@ // Demo/spex_demo_tripread: reads a matrix stored in triplet format of a given type //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -27,13 +27,16 @@ SPEX_info spex_demo_tripread ( SPEX_matrix *A_handle, // Matrix to be populated FILE *file, // file to read from (must already be open) - SPEX_type C_type, // C->type: mpz_t or double + SPEX_type C_type, // C->type: mpz_t or double SPEX_options option ) { SPEX_info info ; - ASSERT(A_handle!=NULL); - ASSERT(file!=NULL); + + if (A_handle == NULL || file == NULL) + { + return (SPEX_INCORRECT_INPUT) ; + } (*A_handle) = NULL ; diff --git a/SPEX/Demo/spex_demo_backslash.c b/SPEX/Demo/spex_demo_backslash.c index 50c3165b..59e0ea70 100644 --- a/SPEX/Demo/spex_demo_backslash.c +++ b/SPEX/Demo/spex_demo_backslash.c @@ -2,21 +2,29 @@ // Demo/spex_demo_backslash: example of SPEX_Blackslash //------------------------------------------------------------------------------ -// SPEX: (c) 2021-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2021-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ - -/* A demo of SPEX_Backslash in C - */ +// A demo of SPEX_Backslash in C # include "spex_demos.h" #define FREE_WORKSPACE \ { \ + if (mat_file != NULL) \ + { \ + fclose(mat_file); \ + } \ + mat_file = NULL ; \ + if (rhs_file != NULL) \ + { \ + fclose(rhs_file); \ + } \ + rhs_file = NULL ; \ SPEX_matrix_free(&A,NULL); \ SPEX_matrix_free(&b,NULL); \ SPEX_matrix_free(&x,NULL); \ @@ -25,35 +33,32 @@ SPEX_finalize(); \ } \ - int main( int argc, char *argv[] ) { - //-------------------------------------------------------------------------- - // Prior to using SPEX, its environment must be initialized. This is done - // by calling the SPEX_initialize() function. - //-------------------------------------------------------------------------- - SPEX_initialize(); - - //-------------------------------------------------------------------------- - // Declare memory & Process Command Line - //-------------------------------------------------------------------------- - int64_t n = 0, ok; - + int64_t n = 0 ; SPEX_matrix A = NULL; SPEX_matrix b = NULL; SPEX_matrix x = NULL; SPEX_matrix x2 = NULL; - - // Set default options + FILE *mat_file = NULL ; + FILE *rhs_file = NULL ; SPEX_options option = NULL; - DEMO_OK(SPEX_create_default_options(&option)); - char *mat_name = NULL, *rhs_name = NULL; int64_t rat = 1; + //-------------------------------------------------------------------------- + // Prior to using SPEX, its environment must be initialized. This is done + // by calling the SPEX_initialize() function. + //-------------------------------------------------------------------------- + + SPEX_TRY (SPEX_initialize ( )) ; + + // Set default options + SPEX_TRY (SPEX_create_default_options(&option)); + // Process the command line - DEMO_OK(spex_demo_process_command_line(argc, argv, option, + SPEX_TRY (spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -61,31 +66,33 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- // Read in A - FILE *mat_file = fopen(mat_name,"r"); + mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } // Note, there are a few matrices in BasisLIB that dont fit in double // Need to use the other tripread for those. - DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); + SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); + mat_file = NULL ; n = A->n; // Read in b. The output of this demo function is b in dense format with // mpz_t entries - FILE *rhs_file = fopen(rhs_name,"r"); + rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); + rhs_file = NULL ; //-------------------------------------------------------------------------- // Solve Ax = b @@ -94,30 +101,31 @@ int main( int argc, char *argv[] ) printf("solving Ax=b ...\n"); fflush (stdout); fflush (stderr); - clock_t start = clock(); + double start = SuiteSparse_time (); option->print_level = 0; - DEMO_OK( SPEX_backslash(&x, SPEX_MPQ, A, b, option)); + SPEX_TRY ( SPEX_backslash(&x, SPEX_MPQ, A, b, option)); - clock_t end = clock(); + double end = SuiteSparse_time (); - double t_tot = (double) (end - start) / CLOCKS_PER_SEC; + double t_tot = (end - start) ; printf("\nSPEX Backslash Factor & Solve time: %lf\n", t_tot); option->print_level=1; - DEMO_OK( spex_demo_check_solution(A,x,b,option)); + SPEX_TRY ( spex_demo_check_solution(A,x,b,option)); // x2 is a copy of the solution. x2 is a dense matrix with double entries // Note: roundoff will have occured in converting the exact solution // to the double x. - DEMO_OK ( SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option)); + SPEX_TRY ( SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option)); //-------------------------------------------------------------------------- // Free Memory //-------------------------------------------------------------------------- FREE_WORKSPACE; + return (0) ; } diff --git a/SPEX/Demo/spex_demo_cholesky_extended.c b/SPEX/Demo/spex_demo_cholesky_extended.c index 742d7ccb..abe4595c 100644 --- a/SPEX/Demo/spex_demo_cholesky_extended.c +++ b/SPEX/Demo/spex_demo_cholesky_extended.c @@ -2,18 +2,27 @@ // Demo/spex_demo_cholesky_extended: example of extended call of SPEX_Cholesky //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ - #include "spex_demos.h" #define FREE_WORKSPACE \ { \ + if (mat_file != NULL) \ + { \ + fclose(mat_file); \ + } \ + mat_file = NULL ; \ + if (rhs_file != NULL) \ + { \ + fclose(rhs_file); \ + } \ + rhs_file = NULL ; \ SPEX_matrix_free(&A,NULL); \ SPEX_matrix_free(&b,NULL); \ SPEX_matrix_free(&x,NULL); \ @@ -26,33 +35,30 @@ int main( int argc, char *argv[] ) { - //-------------------------------------------------------------------------- - // Prior to using SPEX-Chol, its environment must be initialized. This is - // done by calling the SPEX_initialize() function. - //-------------------------------------------------------------------------- - - SPEX_initialize(); - - //-------------------------------------------------------------------------- - // Declare memory & Process Command Line - //-------------------------------------------------------------------------- - int64_t n = 0, ok; - + int64_t n = 0 ; SPEX_symbolic_analysis S = NULL; SPEX_factorization F = NULL ; SPEX_matrix A = NULL; SPEX_matrix b = NULL; SPEX_matrix x = NULL; - + FILE *mat_file = NULL ; + FILE *rhs_file = NULL; char *mat_name, *rhs_name; int64_t rat = 1; + SPEX_options option = NULL; + + //-------------------------------------------------------------------------- + // Prior to using SPEX-Chol, its environment must be initialized. This is + // done by calling the SPEX_initialize() function. + //-------------------------------------------------------------------------- + + SPEX_TRY (SPEX_initialize ( )) ; // Default options. - SPEX_options option = NULL; - DEMO_OK(SPEX_create_default_options(&option)); + SPEX_TRY (SPEX_create_default_options(&option)); // Process the command line - DEMO_OK(spex_demo_process_command_line(argc, argv, option, + SPEX_TRY (spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -60,93 +66,96 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- // Read in A - FILE *mat_file = fopen(mat_name,"r"); + mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); + SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); fclose(mat_file); + mat_file = NULL ; n = A->n; // For this code, we utilize a vector of all ones as the RHS vector - SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, true, - option); + SPEX_TRY (SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, + true, option)); // Read in b. The output of this demo function is b in dense format with // mpz_t entries - FILE *rhs_file = fopen(rhs_name,"r"); + rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); + rhs_file = NULL ; //-------------------------------------------------------------------------- // Perform Analysis of A //-------------------------------------------------------------------------- - clock_t start_col = clock(); + double start_col = SuiteSparse_time (); // Symmetric ordering of A. Uncomment the desired one, AMD is recommended //option->order = SPEX_NO_ORDERING; // No ordering option->order = SPEX_AMD; // AMD //option->order = SPEX_COLAMD; // COLAMD - DEMO_OK(SPEX_cholesky_analyze(&S, A, option)); + SPEX_TRY (SPEX_cholesky_analyze(&S, A, option)); - clock_t end_col = clock(); + double end_col = SuiteSparse_time (); //-------------------------------------------------------------------------- // Factorize PAP //-------------------------------------------------------------------------- //option->algo=SPEX_CHOL_LEFT; - clock_t start_factor = clock(); + double start_factor = SuiteSparse_time (); - DEMO_OK( SPEX_cholesky_factorize(&F, A, S, option)); + SPEX_TRY ( SPEX_cholesky_factorize(&F, A, S, option)); - clock_t end_factor = clock(); + double end_factor = SuiteSparse_time (); option->print_level=3; - //DEMO_OK(SPEX_matrix_check(F->L,option)); + //SPEX_TRY (SPEX_matrix_check(F->L,option)); //-------------------------------------------------------------------------- // Solve linear system //-------------------------------------------------------------------------- - clock_t start_solve = clock(); + double start_solve = SuiteSparse_time (); - DEMO_OK( SPEX_cholesky_solve(&x, F, b, option)); + SPEX_TRY ( SPEX_cholesky_solve(&x, F, b, option)); - clock_t end_solve = clock(); + double end_solve = SuiteSparse_time (); //-------------------------------------------------------------------------- // Output & Timing Stats //-------------------------------------------------------------------------- - double t_col = (double) (end_col-start_col)/CLOCKS_PER_SEC; - double t_factor = (double) (end_factor - start_factor) / CLOCKS_PER_SEC; - double t_solve = (double) (end_solve - start_solve) / CLOCKS_PER_SEC; + double t_col = (end_col-start_col) ; + double t_factor = (end_factor - start_factor) ; + double t_solve = (end_solve - start_solve) ; - printf("\nNumber of L nonzeros: \t\t\t%ld", - (F->L->p[F->L->n]) ); + printf("\nNumber of L nonzeros: \t\t\t%g", + (double) (F->L->p[F->L->n]) ); printf("\nSymbolic Analysis Check time: \t\t%lf", t_col); printf("\nIP Chol Factorization time: \t\t%lf", t_factor); printf("\nFB Substitution time: \t\t\t%lf\n\n", t_solve); // Check solution option->print_level=1; - //DEMO_OK ( SPEX_check_solution(A,x,b,option)); + // SPEX_TRY ( SPEX_check_solution(A,x,b,option)); //-------------------------------------------------------------------------- // Free Memory //-------------------------------------------------------------------------- FREE_WORKSPACE; + return (0) ; } diff --git a/SPEX/Demo/spex_demo_cholesky_simple.c b/SPEX/Demo/spex_demo_cholesky_simple.c index 5e35dc15..4652358e 100644 --- a/SPEX/Demo/spex_demo_cholesky_simple.c +++ b/SPEX/Demo/spex_demo_cholesky_simple.c @@ -2,47 +2,62 @@ // Demo/spex_demo_cholesky_simple.c: example of simple call of SPEX_Cholesky //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -/* This example shows how to use SPEX Chol with a given input matrix and a - * double output. The input is read from a file */ - -// usage: -// example > out -// out is file for output calculated result +// This example shows how to use SPEX Chol with a given input matrix and a +// double output. The input is read from a file. #include "spex_demos.h" -#define FREE_WORKSPACE \ -{ \ - SPEX_matrix_free(&A, option); \ - SPEX_matrix_free(&b, option); \ - SPEX_matrix_free(&x, option); \ - SPEX_matrix_free(&x2, option); \ - SPEX_FREE(option); \ - SPEX_finalize(); \ +#define FREE_WORKSPACE \ +{ \ + if (mat_file != NULL) \ + { \ + fclose(mat_file); \ + } \ + mat_file = NULL ; \ + if (rhs_file != NULL) \ + { \ + fclose(rhs_file); \ + } \ + rhs_file = NULL ; \ + SPEX_matrix_free(&A, option); \ + SPEX_matrix_free(&b, option); \ + SPEX_matrix_free(&x, option); \ + SPEX_matrix_free(&x2, option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ } - int main (int argc, char **argv) { + + SPEX_matrix A = NULL ; // input matrix with mpz values + SPEX_matrix b = NULL ; // Right hand side vector + SPEX_matrix x = NULL ; // Solution vectors + SPEX_matrix x2 = NULL ; // copy of solution vectors + SPEX_options option = NULL; + FILE *mat_file = NULL; + FILE *rhs_file = NULL; + char *mat_name = NULL ; + char *rhs_name = NULL ; + //-------------------------------------------------------------------------- - // Prior to using SPEX Chol, its environment must be initialized. This is + // Prior to using SPEX, its environment must be initialized. This is // done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + + SPEX_TRY (SPEX_initialize ( )) ; //-------------------------------------------------------------------------- // Get matrix file name //-------------------------------------------------------------------------- - char *mat_name; - char *rhs_name; //this is actually ignored and we're using a rhs of 1s int64_t rat = 1; if (argc > 2) { @@ -50,25 +65,20 @@ int main (int argc, char **argv) } //-------------------------------------------------------------------------- - // Declare our data structures + // Get options and process the command line //-------------------------------------------------------------------------- - SPEX_info ok; - SPEX_matrix A = NULL ; // input matrix with mpz values - SPEX_matrix b = NULL ; // Right hand side vector - SPEX_matrix x = NULL ; // Solution vectors - SPEX_matrix x2 = NULL ; // copy of solution vectors - SPEX_options option = NULL; - DEMO_OK(SPEX_create_default_options(&option)); + + SPEX_TRY (SPEX_create_default_options(&option)); if (option == NULL) { fprintf (stderr, "Error! OUT of MEMORY!\n"); FREE_WORKSPACE; - return 0; + return (1) ; } option->order = SPEX_AMD; //AMD is default for Cholesky - + // Process the command line - DEMO_OK(spex_demo_process_command_line(argc, argv, option, + SPEX_TRY (spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -77,32 +87,34 @@ int main (int argc, char **argv) // Read in A. The output of this demo function is A in CSC format with // double entries. - FILE *mat_file = fopen(mat_name,"r"); + mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - - DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); + + SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); fclose(mat_file); + mat_file = NULL ; int64_t n = A->n; - SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, true, - option); + SPEX_TRY (SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, + true, option) ); // Read in b. The output of this demo function is b in dense format with // mpz_t entries - FILE *rhs_file = fopen(rhs_name,"r"); + rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); + rhs_file = NULL; // Check if the size of A matches b if (A->n != b->m) @@ -110,36 +122,37 @@ int main (int argc, char **argv) printf("%"PRId64" %"PRId64" \n", A->m,b->m); fprintf (stderr, "Error! Size of A and b do not match!\n"); FREE_WORKSPACE; - return 0; + return (1) ; } + //-------------------------------------------------------------------------- // solve //-------------------------------------------------------------------------- - clock_t start_s = clock(); + + double start_s = SuiteSparse_time (); option->algo=SPEX_CHOL_LEFT; - DEMO_OK(SPEX_cholesky_backslash( &x, SPEX_MPQ, A, b, option)); + SPEX_TRY (SPEX_cholesky_backslash( &x, SPEX_MPQ, A, b, option)); - clock_t end_s = clock(); + double end_s = SuiteSparse_time (); - double t_s = (double) (end_s - start_s) / CLOCKS_PER_SEC; + double t_s = (end_s - start_s) ; printf("\nSPEX Chol Factor & Solve time: %lf\n", t_s); // x2 is a copy of the solution. x2 is a dense matrix with mpfr entries - DEMO_OK ( SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option)); + SPEX_TRY ( SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option)); // check solution option->print_level=1; - DEMO_OK ( spex_demo_check_solution(A,x,b,option)); + SPEX_TRY ( spex_demo_check_solution(A,x,b,option)); //-------------------------------------------------------------------------- // Free memory //-------------------------------------------------------------------------- - FREE_WORKSPACE; + FREE_WORKSPACE; printf ("\n%s: all tests passed\n\n", __FILE__); - - return 0; + return (0) ; } diff --git a/SPEX/Demo/spex_demo_lu_doub.c b/SPEX/Demo/spex_demo_lu_doub.c index 84856671..fbe973bd 100644 --- a/SPEX/Demo/spex_demo_lu_doub.c +++ b/SPEX/Demo/spex_demo_lu_doub.c @@ -2,31 +2,26 @@ // Demo/spex_demo_lu_doub.c: example of simple SPEX_LU call on a double matrix //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -/* This program will exactly solve the sparse linear system Ax = b by - * performing the SPEX Left LU factorization. This is intended to be a - * demonstration of the "advanced interface" of SPEX Left LU. Refer to - * README.txt for information on how to properly use this code - */ - // usage: -// spex_lu_demo Followed by the listed args: +// spex_lu_demo_doub Followed by the listed args: // -// f (or file) Filename. e.g., spex_lu_demo f MATRIX_NAME RHS_NAME, which -// indicates spex_lu_demo will read matrix from MATRIX_NAME and right hand side -// from RHS_NAME. The matrix must be stored in Matrix Market format. Refer to -// http://math.nist.gov/MatrixMarket/formats.html for information on Matrix -// Market format. The right hand side vector must be stored as a dense vector. +// f (or file) Filename. e.g., spex_lu_demo_doub f MATRIX_NAME RHS_NAME, which +// indicates spex_lu_demo_doub will read matrix from MATRIX_NAME and right hand +// side from RHS_NAME. The matrix must be stored in Matrix Market format. +// Refer to http://math.nist.gov/MatrixMarket/formats.html for information on +// Matrix Market format. The right hand side vector must be stored as a dense +// vector. // -// p (or piv) Pivot_param. e.g., spex_lu_demo p 0, which indicates SPEX_LU will -// use smallest pivot for pivot scheme. Other available options are listed as -// follows: +// p (or piv) Pivot_param. e.g., spex_lu_demo_doub p 0, which indicates SPEX_LU +// will use smallest pivot for pivot scheme. Other available options are listed +// as follows: // // 0: Smallest pivot: Default and recommended // 1: Diagonal pivoting @@ -35,91 +30,57 @@ // 4: Diagonal pivoting with tolerance for largest pivot // 5: Largest pivot // -// q (or col) Column_order_param. e.g., spex_lu_demo q 1, which indicates +// q (or col) Column_order_param. e.g., spex_lu_demo_doub q 1, which indicates // SPEX_LU will use COLAMD for column ordering. Other available options are: // // 0: None: Not recommended for sparse matrices 1: COLAMD: Default 2: // AMD // -// t (or tol) tolerance_param. e.g., spex_lu_demo t 1e-10, which indicates +// t (or tol) tolerance_param. e.g., spex_lu_demo_doub t 1e-10, which indicates // SPEX_LU will use 1e-10 as the tolerance for pivot scheme 3 and 4 mentioned // above. Therefore, it is only necessary if pivot scheme 3 or 4 is used. // -// o (or out). e.g., spex_lu_demo o 1, which indicates SPEX_LU will output the -// errors and warnings during the process. Other available options are: 0: +// o (or out). e.g., spex_lu_demo_doub o 1, which indicates SPEX_LU will output +// the errors and warnings during the process. Other available options are: 0: // print nothing 1: just errors and warnings: Default 2: terse, with basic // stats from COLAMD/AMD and SPEX and solution -// -// If none of the above args is given, they are set to the following default: -// #include "spex_demos.h" -#define FREE_WORKSPACE \ -{ \ - SPEX_matrix_free(&A, option); \ - SPEX_factorization_free(&F, option); \ - SPEX_symbolic_analysis_free(&S, option); \ - SPEX_FREE(option); \ - SPEX_finalize(); \ +#define FREE_WORKSPACE \ +{ \ + if (mat_file != NULL) \ + { \ + fclose(mat_file); \ + } \ + mat_file = NULL ; \ + SPEX_matrix_free(&A, option); \ + SPEX_factorization_free(&F, option); \ + SPEX_symbolic_analysis_free(&S, option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ } int main (int argc, char *argv[]) { + SPEX_matrix A = NULL; + SPEX_symbolic_analysis S = NULL; + SPEX_factorization F = NULL; + FILE *mat_file = NULL; + SPEX_options option = NULL; + char *mat_name = NULL, *rhs_name = NULL; + int64_t rat = 1; + //-------------------------------------------------------------------------- // Prior to using SPEX Left LU, its environment must be initialized. This // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); - - //-------------------------------------------------------------------------- - // We first initialize the default parameters. These parameters are modified - // either via command line arguments or when reading in data. The important - // initializations are in the block below. - // - // First, we initialize 6 SPEX_matrices. Note that these matrices must - // simply be declared, they will be created and allocated within their - // respective functions. These matrices are: - // - // A: User input matrix. Must be SPEX_CSC and SPEX_MPZ for routines - // - // L: Lower triangular matrix. Will be output as SPEX_CSC and SPEX_MPZ - // - // U: Upper triangular matrix. Will be output as SPEX_CSC and SPEX_MPZ - // - // x: Solution to the linear system. Will be output as SPEX_DENSE and - // SPEX_MPQ - // - // b: Set of right hand side vectors. Must be SPEX_DENSE and SPEX_MPZ - // - // Additionally, two other data structures are declared here: - // - // pinv: Inverse row permutation used for LDU factorization and - // permutation - // - // S: Symbolic analysis struct. - // - // Lastly, the following parameter is created: - // - // option: Command options for the factorization. In general, this can be - // set to default values and is almost always the last input - // argument for SPEX Left LU functions (except SPEX_malloc and - // such) - //-------------------------------------------------------------------------- - SPEX_matrix A = NULL; - SPEX_symbolic_analysis S = NULL; - SPEX_factorization F = NULL; - SPEX_info ok ; + SPEX_TRY (SPEX_initialize ( )) ; // Initialize option, command options for the factorization - SPEX_options option = NULL; - DEMO_OK(SPEX_create_default_options(&option)); - - // Extra parameters used to obtain A, b, etc - char *mat_name, *rhs_name; - int64_t rat = 1; + SPEX_TRY (SPEX_create_default_options(&option)); //-------------------------------------------------------------------------- // After initializing memory, we process the command line for this function. @@ -128,67 +89,38 @@ int main (int argc, char *argv[]) // option->order = SPEX_AMD. //-------------------------------------------------------------------------- - DEMO_OK(spex_demo_process_command_line(argc, argv, option, + SPEX_TRY (spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- - // In this demo file, we now read in the A and b matrices from external - // files. Refer to the example.c file or the user guide for other - // methods of creating the input matrix. In general, the user can create - // his/her matrix (say in double form) and then create a copy of it with - // SPEX_matrix_copy + // Read in A //-------------------------------------------------------------------------- - // Read in A - FILE *mat_file = fopen(mat_name,"r"); + mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); + SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); fclose(mat_file); - -#if 0 - // Read in right hand side - FILE *rhs_file = fopen(rhs_name,"r"); - if( rhs_file == NULL ) - { - perror("Error while opening the file"); - FREE_WORKSPACE; - return 0; - } - DEMO_OK(SPEX_read_dense(&b, rhs_file, option)); - fclose(rhs_file); - - // Check if the size of A matches b - if (A->n != b->m) - { - fprintf (stderr, "Error! Size of A and b do not match!\n"); - FREE_WORKSPACE; - return 0; - } -#endif + mat_file = NULL ; //-------------------------------------------------------------------------- // We now perform symbolic analysis by getting the column preordering of // the matrix A. This is done via the SPEX_lu_analyze function. The output // of this function is a column permutation Q where we factor the matrix AQ // and an estimate of the number of nonzeros in L and U. - // - // Note that in the simple interface demostrated in the example*.c files, - // all of the following code is condensed into the single SPEX_backslash - // function. //-------------------------------------------------------------------------- - clock_t start_col = clock(); + double start_col = SuiteSparse_time (); // Column ordering using either AMD, COLAMD or nothing - DEMO_OK(SPEX_lu_analyze(&S, A, option)); + SPEX_TRY (SPEX_lu_analyze(&S, A, option)); - clock_t end_col = clock(); + double end_col = SuiteSparse_time (); //-------------------------------------------------------------------------- // Now we perform the SPEX Left LU factorization to obtain matrices L and U @@ -196,27 +128,19 @@ int main (int argc, char *argv[]) // never explicitly constructed or used. //-------------------------------------------------------------------------- - clock_t start_factor = clock(); + double start_factor = SuiteSparse_time (); - ok = SPEX_lu_factorize(&F, A, S, option); - if (ok != SPEX_OK) - { - if (ok == SPEX_SINGULAR) - { - printf("\nSingular"); - } - return 0; - } + SPEX_TRY (SPEX_lu_factorize(&F, A, S, option)); - clock_t end_factor = clock(); + double end_factor = SuiteSparse_time (); //-------------------------------------------------------------------------- - // We now solve the system Ax=b using the L and U factors computed above. + // print results //-------------------------------------------------------------------------- // Timing stats - double t_sym = (double) (end_col-start_col)/CLOCKS_PER_SEC; - double t_factor = (double) (end_factor - start_factor) / CLOCKS_PER_SEC; + double t_sym = (end_col-start_col) ; + double t_factor = (end_factor - start_factor) ; printf("\nNumber of L+U nonzeros: \t\t%"PRId64, (F->L->p[F->L->n]) + (F->U->p[F->U->n]) - (F->L->m)); @@ -229,6 +153,6 @@ int main (int argc, char *argv[]) FREE_WORKSPACE; printf ("\n%s: all tests passed\n\n", __FILE__); - return 0; + return (0) ; } diff --git a/SPEX/Demo/spex_demo_lu_extended.c b/SPEX/Demo/spex_demo_lu_extended.c index d8ebe587..7502b6c2 100644 --- a/SPEX/Demo/spex_demo_lu_extended.c +++ b/SPEX/Demo/spex_demo_lu_extended.c @@ -1,32 +1,32 @@ //------------------------------------------------------------------------------ -// Demo/spex_demo_lu_extended.c: example of extended SPEX_LU call for a double matrix. +// Demo/spex_demo_lu_extended.c: extended SPEX_LU example for a double matrix //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -/* This program will exactly solve the sparse linear system Ax = b by - * performing the SPEX Left LU factorization. This is intended to be a - * demonstration of the "advanced interface" of SPEX Left LU. Refer to - * README.txt for information on how to properly use this code - */ +// This program will exactly solve the sparse linear system Ax = b by +// performing the SPEX Left LU factorization. This is intended to be a +// demonstration of the "advanced interface" of SPEX Left LU. Refer to +// README.txt for information on how to properly use this code // usage: -// spexlu_demo Followed by the listed args: +// spex_demo_lu_extended Followed by the listed args: // -// f (or file) Filename. e.g., spex_lu_demo f MATRIX_NAME RHS_NAME, which -// indicates spex_lu_demo will read matrix from MATRIX_NAME and right hand side -// from RHS_NAME. The matrix must be stored in Matrix Market format. Refer to -// http://math.nist.gov/MatrixMarket/formats.html for information on Matrix -// Market format. The right hand side vector must be stored as a dense vector. +// f (or file) Filename. e.g., spex_demo_lu_extended f MATRIX_NAME RHS_NAME, +// which indicates spex_demo_lu_extended will read matrix from MATRIX_NAME and +// right hand side from RHS_NAME. The matrix must be stored in Matrix Market +// format. Refer to http://math.nist.gov/MatrixMarket/formats.html for +// information on Matrix Market format. The right hand side vector must be +// stored as a dense vector. // -// p (or piv) Pivot_param. e.g., spex_lu_demo p 0, which indicates SPEX_LU will -// use smallest pivot for pivot scheme. Other available options are listed as -// follows: +// p (or piv) Pivot_param. e.g., spex_demo_lu_extended p 0, which indicates +// SPEX_LU will use smallest pivot for pivot scheme. Other available options +// are listed as follows: // // 0: Smallest pivot: Default and recommended // 1: Diagonal pivoting @@ -35,20 +35,23 @@ // 4: Diagonal pivoting with tolerance for largest pivot // 5: Largest pivot // -// q (or col) Column_order_param. e.g., spex_lu_demo q 1, which indicates -// SPEX_LU will use COLAMD for column ordering. Other available options are: +// q (or col) Column_order_param. e.g., spex_demo_lu_extended q 1, which +// indicates SPEX_LU will use COLAMD for column ordering. Other available +// options are: // // 0: Default: COLAMD // 1: None: Not recommended for sparse matrices // 2: COLAMD // 3: AMD // -// t (or tol) tolerance_param. e.g., spex_lu_demo t 1e-10, which indicates -// SPEX_LU will use 1e-10 as the tolerance for pivot scheme 3 and 4 mentioned -// above. Therefore, it is only necessary if pivot scheme 3 or 4 is used. +// t (or tol) tolerance_param. e.g., spex_demo_lu_extended t 1e-10, which +// indicates SPEX_LU will use 1e-10 as the tolerance for pivot scheme 3 and 4 +// mentioned above. Therefore, it is only necessary if pivot scheme 3 or 4 is +// used. // -// o (or out). e.g., spex_lu_demo o 1, which indicates SPEX_LU will output the -// errors and warnings during the process. Other available options are: +// o (or out). e.g., spex_demo_lu_extended o 1, which indicates SPEX_LU will +// output the errors and warnings during the process. Other available options +// are: // // 0: print nothing // 1: just errors and warnings: Default @@ -57,33 +60,55 @@ // // If none of the above args is given, they are set to the following default: // - // p = 0, i.e., using smallest pivot // q = 1, i.e., using COLAMD // t = 0.1, not being using since p != 3 or 4 #include "spex_demos.h" -#define FREE_WORKSPACE \ -{ \ - SPEX_matrix_free(&A, option); \ - SPEX_symbolic_analysis_free(&S, option); \ - SPEX_factorization_free(&F, option); \ - SPEX_matrix_free(&x, option); \ - SPEX_matrix_free(&b, option); \ - SPEX_FREE(option); \ - SPEX_finalize(); \ +#define FREE_WORKSPACE \ +{ \ + if (mat_file != NULL) \ + { \ + fclose(mat_file); \ + } \ + mat_file = NULL ; \ + if (rhs_file != NULL) \ + { \ + fclose(rhs_file); \ + } \ + rhs_file = NULL ; \ + SPEX_matrix_free(&A, option); \ + SPEX_symbolic_analysis_free(&S, option); \ + SPEX_factorization_free(&F, option); \ + SPEX_matrix_free(&x, option); \ + SPEX_matrix_free(&b, option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ } int main (int argc, char *argv[]) { + SPEX_matrix A = NULL; + SPEX_symbolic_analysis S = NULL; + SPEX_factorization F = NULL; + SPEX_matrix x = NULL; + SPEX_matrix b = NULL; + FILE *rhs_file = NULL; + FILE *mat_file = NULL ; + SPEX_options option = NULL; + + // Extra parameters used to obtain A, b, etc + char *mat_name = NULL, *rhs_name = NULL; + int64_t rat=1; + //-------------------------------------------------------------------------- // Prior to using SPEX Left LU, its environment must be initialized. This // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + SPEX_TRY (SPEX_initialize ( )) ; //-------------------------------------------------------------------------- // We first initialize the default parameters. These parameters are modified @@ -119,23 +144,11 @@ int main (int argc, char *argv[]) // argument for SPEX Left LU functions (except SPEX_malloc and // such) //-------------------------------------------------------------------------- - SPEX_matrix A = NULL; - SPEX_symbolic_analysis S = NULL; - SPEX_factorization F = NULL; - SPEX_matrix x = NULL; - SPEX_matrix b = NULL; - SPEX_info ok ; // Initialize option, command options for the factorization - SPEX_options option = NULL; - DEMO_OK(SPEX_create_default_options(&option)); + SPEX_TRY (SPEX_create_default_options(&option)); option->order=SPEX_NO_ORDERING; - // Extra parameters used to obtain A, b, etc - char *mat_name, *rhs_name; - int64_t rat=1; - - //-------------------------------------------------------------------------- // After initializing memory, we process the command line for this function. // Such a step is optional, a user can also manually set these parameters. @@ -143,7 +156,7 @@ int main (int argc, char *argv[]) // option->order = SPEX_AMD. //-------------------------------------------------------------------------- - DEMO_OK(spex_demo_process_command_line(argc, argv, option, + SPEX_TRY (spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -153,34 +166,37 @@ int main (int argc, char *argv[]) // his/her matrix (say in double form) and then create a copy of it with // SPEX_matrix_copy //-------------------------------------------------------------------------- + // Read in A - FILE *mat_file = fopen(mat_name,"r"); + mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); + SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); + mat_file = NULL ; // Read in right hand side - FILE *rhs_file = fopen(rhs_name,"r"); + rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); + rhs_file = NULL ; // Check if the size of A matches b if (A->n != b->m) { fprintf (stderr, "Error! Size of A and b do not match!\n"); FREE_WORKSPACE; - return 0; + return (1) ; } //-------------------------------------------------------------------------- @@ -194,12 +210,12 @@ int main (int argc, char *argv[]) // function. //-------------------------------------------------------------------------- - clock_t start_col = clock(); + double start_col = SuiteSparse_time (); // Column ordering using either AMD, COLAMD or nothing - DEMO_OK(SPEX_lu_analyze(&S, A, option)); + SPEX_TRY (SPEX_lu_analyze(&S, A, option)); - clock_t end_col = clock(); + double end_col = SuiteSparse_time (); //-------------------------------------------------------------------------- // Now we perform the SPEX Left LU factorization to obtain matrices L and U @@ -207,17 +223,17 @@ int main (int argc, char *argv[]) // never explicitly constructed or used. //-------------------------------------------------------------------------- - clock_t start_factor = clock(); + double start_factor = SuiteSparse_time (); - DEMO_OK(SPEX_lu_factorize(&F, A, S, option)); + SPEX_TRY (SPEX_lu_factorize(&F, A, S, option)); - clock_t end_factor = clock(); + double end_factor = SuiteSparse_time (); //-------------------------------------------------------------------------- // We now solve the system Ax=b using the L and U factors computed above. //-------------------------------------------------------------------------- - clock_t start_solve = clock(); + double start_solve = SuiteSparse_time (); // SPEX Left LU has an optional check step which can verify that the // solution vector x satisfies Ax=b in perfect precision intended for @@ -235,9 +251,9 @@ int main (int argc, char *argv[]) //option->check = true; // Solve LDU x = b - DEMO_OK(SPEX_lu_solve(&x, F, b, option)); + SPEX_TRY (SPEX_lu_solve(&x, F, b, option)); - clock_t end_solve = clock(); + double end_solve = SuiteSparse_time (); // Done, x now contains the exact solution of the linear system Ax=b in // dense rational form. There is an optional final step here where the user @@ -254,9 +270,9 @@ int main (int argc, char *argv[]) // SPEX_matrix_copy( &my_x, my_kind, my_type, x, option); // Timing stats - double t_sym = (double) (end_col-start_col)/CLOCKS_PER_SEC; - double t_factor = (double) (end_factor - start_factor) / CLOCKS_PER_SEC; - double t_solve = (double) (end_solve - start_solve) / CLOCKS_PER_SEC; + double t_sym = (end_col-start_col) ; + double t_factor = (end_factor - start_factor) ; + double t_solve = (end_solve - start_solve) ; printf("\nNumber of L+U nonzeros: \t\t%"PRId64, (F->L->p[F->L->n]) + (F->U->p[F->U->n]) - (F->L->m)); @@ -269,8 +285,7 @@ int main (int argc, char *argv[]) //-------------------------------------------------------------------------- FREE_WORKSPACE; - printf ("\n%s: all tests passed\n\n", __FILE__); - //fprintf (stderr, "%s: all tests passed\n\n", __FILE__); - return 0; + fprintf (stderr, "%s: all tests passed\n\n", __FILE__); + return (0) ; } diff --git a/SPEX/Demo/spex_demo_lu_simple1.c b/SPEX/Demo/spex_demo_lu_simple1.c index c294a442..7e8f654a 100644 --- a/SPEX/Demo/spex_demo_lu_simple1.c +++ b/SPEX/Demo/spex_demo_lu_simple1.c @@ -1,16 +1,16 @@ //------------------------------------------------------------------------------ -// Demo/example.c: example of simple SPEX_LU call using as input a random matrix +// Demo/spex_demo_lu_simple1.c: simple SPEX_LU example with a random matrix //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -/* This example shows how to use SPEX Left LU with a given input matrix and a - * double output. The input is a randomly generate dense matrix */ +// This example shows how to use SPEX Left LU with a given input matrix and a +// double output. The input is a randomly generate dense matrix. // usage: // example > out @@ -18,39 +18,40 @@ #include "spex_demos.h" -#define FREE_WORKSPACE \ -{ \ - SPEX_matrix_free(&A,option); \ - SPEX_matrix_free(&x,option); \ - SPEX_matrix_free(&b,option); \ - SPEX_matrix_free(&Rb,option); \ - SPEX_matrix_free(&R,option); \ - SPEX_FREE(option); \ - SPEX_finalize(); \ +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A,option); \ + SPEX_matrix_free(&x,option); \ + SPEX_matrix_free(&b,option); \ + SPEX_matrix_free(&Rb,option); \ + SPEX_matrix_free(&R,option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ } int main (void) { + int64_t n = 50, nz = 2500, num=0; + SPEX_matrix A = NULL ; // input matrix + SPEX_matrix R = NULL ; // Random matrix to create A + SPEX_matrix Rb = NULL; // Random matrix to create b + SPEX_matrix b = NULL ; // Right hand side vector + SPEX_matrix x = NULL ; // Solution vectors + SPEX_options option = NULL; + //-------------------------------------------------------------------------- // Prior to using SPEX Left LU, its environment must be initialized. This // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_info ok = SPEX_initialize(); + SPEX_TRY (SPEX_initialize ( )) ; //-------------------------------------------------------------------------- // Declare and initialize essential variables //-------------------------------------------------------------------------- - int64_t n = 50, nz = 2500, num=0; - SPEX_matrix A = NULL ; // input matrix - SPEX_matrix R = NULL ; // Random matrix to create A - SPEX_matrix Rb = NULL; // Random matrix to create b - SPEX_matrix b = NULL ; // Right hand side vector - SPEX_matrix x = NULL ; // Solution vectors - SPEX_options option = NULL; - DEMO_OK(SPEX_create_default_options(&option)); + SPEX_TRY (SPEX_create_default_options(&option)); //-------------------------------------------------------------------------- // Generate a random dense 50*50 matrix @@ -61,12 +62,12 @@ int main (void) // A->j, and A->x are calloc'd. The second boolean parameter is meaningless // for FP64 matrices, but it tells SPEX Left LU to allocate the values of // A->x for the mpz_t, mpq_t, and mpfr_t entries - SPEX_matrix_allocate(&R, SPEX_TRIPLET, SPEX_FP64, n, n, nz, - false, true, option); + SPEX_TRY (SPEX_matrix_allocate(&R, SPEX_TRIPLET, SPEX_FP64, n, n, nz, + false, true, option)) ; // Rb is a n*1 dense matrix whose entries are FP64 - SPEX_matrix_allocate(&Rb, SPEX_DENSE, SPEX_FP64, n, 1, n, - false, true, option); + SPEX_TRY (SPEX_matrix_allocate(&Rb, SPEX_DENSE, SPEX_FP64, n, 1, n, + false, true, option)); // Randomly generate the input unsigned int seed = 10; @@ -90,22 +91,22 @@ int main (void) //-------------------------------------------------------------------------- // A is a copy of the R matrix. A is a CSC matrix with mpz_t entries - DEMO_OK ( SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, R, option)); + SPEX_TRY ( SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, R, option)); // b is a copy of the Rb matrix. b is dense with mpz_t entries. - DEMO_OK ( SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, Rb, option)); + SPEX_TRY ( SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, Rb, option)); //-------------------------------------------------------------------------- // Solve //-------------------------------------------------------------------------- - clock_t start_s = clock(); + double start_s = SuiteSparse_time (); // Solve the system and give double solution - DEMO_OK(SPEX_lu_backslash( &x, SPEX_FP64, A, b, option)); + SPEX_TRY (SPEX_lu_backslash( &x, SPEX_FP64, A, b, option)); - clock_t end_s = clock(); + double end_s = SuiteSparse_time (); - double t_s = (double) (end_s - start_s) / CLOCKS_PER_SEC; + double t_s = (end_s - start_s) ; printf("\nSPEX Left LU Factor & Solve time: %lf\n", t_s); @@ -115,6 +116,6 @@ int main (void) FREE_WORKSPACE; printf ("\n%s: all tests passed\n\n", __FILE__); - return 0; + return (0) ; } diff --git a/SPEX/Demo/spex_demo_lu_simple2.c b/SPEX/Demo/spex_demo_lu_simple2.c index 0042d0e1..219316dc 100644 --- a/SPEX/Demo/spex_demo_lu_simple2.c +++ b/SPEX/Demo/spex_demo_lu_simple2.c @@ -2,8 +2,8 @@ // Demo/spex_demo_lu_simple2.c: example of simple SPEX_LU call for triplet format //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -15,17 +15,27 @@ // mpq_t precision // usage: -// SPEX_LU_demo2 mat_file rhs_file > out +// spex_demo_lu_simple2 f mat_file rhs_file > out // mat_file is the Matrix Market file containing the A matrix // rhs_file is a list of entries for right hand side dense matrix // if input file names are not specified, they are defaulted to // ../ExampleMats/10teams.mat and ../ExampleMats/10teams.v, respectively. -// out is file for output calculated result +// out is the file for the output with the calculated result #include "spex_demos.h" #define FREE_WORKSPACE \ { \ + if (mat_file != NULL) \ + { \ + fclose(mat_file); \ + } \ + mat_file = NULL ; \ + if (rhs_file != NULL) \ + { \ + fclose(rhs_file); \ + } \ + rhs_file = NULL ; \ SPEX_symbolic_analysis_free(&S, option); \ SPEX_matrix_free(&A, option); \ SPEX_FREE(option); \ @@ -36,37 +46,40 @@ int main (int argc, char **argv) { + + SPEX_matrix A = NULL ; // input matrix + SPEX_matrix b = NULL ; // Right hand side vector + SPEX_matrix x = NULL ; // Solution vectors + SPEX_symbolic_analysis S = NULL ; // Column permutation + SPEX_options option = NULL; + FILE *mat_file = NULL; + FILE *rhs_file = NULL; + char *mat_name = NULL, *rhs_name = NULL; + //-------------------------------------------------------------------------- // Prior to using SPEX Left LU, its environment must be initialized. This is // done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + + SPEX_TRY (SPEX_initialize ( )) ; //-------------------------------------------------------------------------- // Get matrix and right hand side file names //-------------------------------------------------------------------------- - char *mat_name = NULL, *rhs_name = NULL; if (argc < 3) { perror ("usage: spex_demo_lu_simple2 matfile rhsfile"); - return 0 ; + return (1) ; } - mat_name = argv[1]; rhs_name = argv[2]; - //-------------------------------------------------------------------------- - // Declare our data structures + // Get default options //-------------------------------------------------------------------------- - SPEX_info ok; - SPEX_matrix A = NULL ; // input matrix - SPEX_matrix b = NULL ; // Right hand side vector - SPEX_matrix x = NULL ; // Solution vectors - SPEX_symbolic_analysis S = NULL ; // Column permutation - SPEX_options option = NULL; - DEMO_OK(SPEX_create_default_options(&option)); + + SPEX_TRY (SPEX_create_default_options(&option)); //-------------------------------------------------------------------------- // Allocate memory, read in A and b @@ -74,27 +87,29 @@ int main (int argc, char **argv) // Read in A. The output of this demo function is A in CSC format with // mpz_t entries. - FILE *mat_file = fopen(mat_name,"r"); + mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); + SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); + mat_file = NULL ; // Read in b. The output of this demo function is b in dense format with // mpz_t entries - FILE *rhs_file = fopen(rhs_name,"r"); + rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); + rhs_file = NULL ; // Check if the size of A matches b if (A->n != b->m) @@ -102,25 +117,25 @@ int main (int argc, char **argv) printf("%"PRId64" %"PRId64" \n", A->m,b->m); fprintf (stderr, "Error! Size of A and b do not match!\n"); FREE_WORKSPACE; - return 0; + return (1) ; } //-------------------------------------------------------------------------- // solve //-------------------------------------------------------------------------- - clock_t start_s = clock(); + double start_s = SuiteSparse_time (); // SPEX Left LU has an optional check, to enable it, one can set the // following parameter to be true. // option->check = true; // Solve the system and give MPQ solution - DEMO_OK(SPEX_lu_backslash( &x, SPEX_MPQ, A, b, option)); + SPEX_TRY (SPEX_lu_backslash( &x, SPEX_MPQ, A, b, option)); - clock_t end_s = clock(); + double end_s = SuiteSparse_time (); - double t_s = (double) (end_s - start_s) / CLOCKS_PER_SEC; + double t_s = (end_s - start_s) ; printf("\nSPEX Left LU Factor & Solve time: %lf\n", t_s); @@ -129,8 +144,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- FREE_WORKSPACE; - printf ("\n%s: all tests passed\n\n", __FILE__); - return 0; + return (0) ; } diff --git a/SPEX/Demo/spex_demo_threaded.c b/SPEX/Demo/spex_demo_threaded.c index 64eefa86..05753f2c 100644 --- a/SPEX/Demo/spex_demo_threaded.c +++ b/SPEX/Demo/spex_demo_threaded.c @@ -2,21 +2,30 @@ // Demo/spex_demo_threaded: example of SPEX_backslash with multiple threads //------------------------------------------------------------------------------ -// SPEX: (c) 2021-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2021-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -/* A demo of SPEX_backslash in C: solving the same system with many different - * user threads, just to test user multithreading. - */ +// A demo of SPEX_backslash in C: solving the same system with many different +// user threads, just to test user multithreading. # include "spex_demos.h" #define FREE_WORKSPACE \ { \ + if (mat_file != NULL) \ + { \ + fclose(mat_file); \ + } \ + mat_file = NULL ; \ + if (rhs_file != NULL) \ + { \ + fclose(rhs_file); \ + } \ + rhs_file = NULL ; \ SPEX_matrix_free(&A,NULL); \ SPEX_matrix_free(&b,NULL); \ SPEX_FREE(option); \ @@ -30,29 +39,37 @@ int main( int argc, char *argv[] ) { + int64_t n = 0 ; + SPEX_matrix A = NULL; + SPEX_matrix b = NULL; + SPEX_options option = NULL; + FILE *mat_file = NULL ; + FILE *rhs_file = NULL; + char *mat_name = NULL, *rhs_name = NULL; + int64_t rat = 1; + //-------------------------------------------------------------------------- // Prior to using SPEX, its environment must be initialized. This is done // by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + + #ifdef _OPENMP + printf ("spex_demo_threaded: with OpenMP\n") ; + #else + printf ("spex_demo_threaded: without OpenMP\n") ; + #endif + + SPEX_TRY (SPEX_initialize ( )) ; //-------------------------------------------------------------------------- // Declare memory & Process Command Line //-------------------------------------------------------------------------- - int64_t n = 0, ok ; - - SPEX_matrix A = NULL; - SPEX_matrix b = NULL; // Set default options - SPEX_options option = NULL; - DEMO_OK(SPEX_create_default_options(&option)); - - char *mat_name = NULL, *rhs_name = NULL; - int64_t rat = 1; + SPEX_TRY (SPEX_create_default_options(&option)); // Process the command line - DEMO_OK(spex_demo_process_command_line(argc, argv, option, + SPEX_TRY (spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -60,31 +77,34 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- // Read in A - FILE *mat_file = fopen(mat_name,"r"); + mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } // Note, there are a few matrices in BasisLIB that dont fit in double // Need to use the other tripread for those. - DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); + SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); + mat_file = NULL ; + n = A->n; // Read in b. The output of this demo function is b in dense format with // mpz_t entries - FILE *rhs_file = fopen(rhs_name,"r"); + rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } - DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); + rhs_file = NULL ; //-------------------------------------------------------------------------- // Solve Ax = b @@ -113,9 +133,10 @@ int main( int argc, char *argv[] ) bool test_pass = true ; + int id ; #pragma omp parallel for num_threads(nthreads) schedule(static,1) \ reduction(&&:test_pass) - for (int id = 0 ; id < nthreads ; id++) + for (id = 0 ; id < nthreads ; id++) { SPEX_info info = SPEX_thread_initialize ( ) ; if (info != SPEX_OK) @@ -179,5 +200,6 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- FREE_WORKSPACE; + return (test_pass ? 0 : 1) ; } diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h index 8d8a8473..8c7fef40 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -2,37 +2,32 @@ // Demo/spex_demos.h: #include file the demo programs //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ +#ifndef SPEX_DEMOS_H +#define SPEX_DEMOS_H #include "SPEX.h" -#include "spex_util_internal.h" -#include "spex_gmp.h" -#define DEMO_OK(method) \ -{ \ - ok = method ; \ - if (ok != SPEX_OK) \ - { \ - spex_demo_determine_error (ok) ; \ - FREE_WORKSPACE ; \ - return 0 ; \ - } \ +// used by SPEX_TRY if an error occurs: +#define SPEX_CATCH(info) \ +{ \ + spex_demo_determine_error (info, __LINE__, __FILE__) ; \ + FREE_WORKSPACE ; \ + return (info) ; \ } -#define SPEX_MIN(a,b) (((a) < (b)) ? (a) : (b)) - /* Purpose: This processes the command line for user specified options */ SPEX_info spex_demo_process_command_line //processes the command line ( int64_t argc, // number of command line arguments char *argv[], // set of command line arguments - SPEX_options option, // struct containing the command options + SPEX_options option, // struct containing the command options char **mat_name, // Name of the matrix to be read in char **rhs_name, // Name of the RHS vector to be read in int64_t *rat // data type of output solution. @@ -44,8 +39,8 @@ SPEX_info spex_demo_process_command_line //processes the command line */ SPEX_info spex_demo_tripread ( - SPEX_matrix *A_handle, // Matrix to be constructed - FILE *file, // file to read from (must already be open) + SPEX_matrix *A_handle, // Matrix to be constructed + FILE *file, // file to read from (must already be open) SPEX_type C_type, // C->type: mpz_t, mpq_t, mpfr_t, int64_t, or double SPEX_options option ) ; @@ -55,8 +50,8 @@ SPEX_info spex_demo_tripread */ SPEX_info spex_demo_tripread_double ( - SPEX_matrix *A_handle, // Matrix to be constructed - FILE *file, // file to read from (must already be open) + SPEX_matrix *A_handle, // Matrix to be constructed + FILE *file, // file to read from (must already be open) SPEX_options option ) ; @@ -65,27 +60,29 @@ SPEX_info spex_demo_tripread_double */ SPEX_info spex_demo_tripread_mpz ( - SPEX_matrix *A_handle, // Matrix to be constructed - FILE *file, // file to read from (must already be open) + SPEX_matrix *A_handle, // Matrix to be constructed + FILE *file, // file to read from (must already be open) SPEX_options option ) ; -/* Purpose: SPEX_read_dense: read a dense matrix. */ +/* Purpose: read a dense matrix. */ SPEX_info spex_demo_read_dense ( - SPEX_matrix *b_handle, // Matrix to be constructed - FILE *file, // file to read from (must already be open) + SPEX_matrix *b_handle, // Matrix to be constructed + FILE *file, // file to read from (must already be open) SPEX_options option ) ; -/* Purpose: Determine why a SPEX_Chol function failed +/* Purpose: Determine why a SPEX function failed */ void spex_demo_determine_error ( - SPEX_info ok + SPEX_info info, + int line, + char *file ); - +// Purpose: check if a solution is correct SPEX_info spex_demo_check_solution ( const SPEX_matrix A, // Input matrix @@ -93,3 +90,6 @@ SPEX_info spex_demo_check_solution const SPEX_matrix b, // Right hand side vectors const SPEX_options option // Command options ); + +#endif + diff --git a/SPEX/Doc/ChangeLog b/SPEX/Doc/ChangeLog index 5fd8ae1b..ee528f91 100644 --- a/SPEX/Doc/ChangeLog +++ b/SPEX/Doc/ChangeLog @@ -1,3 +1,19 @@ +Mar 22, 2024: version 3.1.0 + + * major update to build system + * Added new methods to SPEX.h, available to the end user: + SPEX_TRY + SPEX_CATCH + SPEX_1D + SPEX_2D + SPEX_mpz_set_null + SPEX_mpq_set_null + SPEX_mpfr_set_null + SPEX_mpz_clear + SPEX_mpq_clear + SPEX_mpfr_clear + SPEX_mpfr_set_proc + Jul 26, 2023: version 3.0.0 * major change to the API: new SPEX_factorization and SPEX_symbolic_analysis diff --git a/SPEX/Doc/Makefile b/SPEX/Doc/Makefile index 2d933eea..a210f9ee 100644 --- a/SPEX/Doc/Makefile +++ b/SPEX/Doc/Makefile @@ -2,8 +2,8 @@ # SPEX/Doc/Makefile #------------------------------------------------------------------------------- -# SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2019-2024, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Doc/SPEX-3.0_UserGuide.pdf b/SPEX/Doc/SPEX-3.0_UserGuide.pdf deleted file mode 100644 index 4495367fb5084c56ae30f481df8a4599292dbf6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416827 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ℑ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ǚ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

Er!tNJD0> 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 F{{Wa@RqX%( diff --git a/SPEX/Doc/SPEX-3.0_User_Guide.pdf b/SPEX/Doc/SPEX-3.0_User_Guide.pdf deleted file mode 100644 index 80eaa5c79d0ebea83dd64c6bb39fa915e4a5c1a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424711 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
y9f3I^6nH=5^p0F6??N!tI;%FWu~!-dL4icjAN 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%0Dg`&+_2~npmDr{PBv|W-8f3t%YWVvS!dWn7^ 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%0Al6nSTq{4$Y2n^#q_|>T;TQRhgXr! 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∈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 kPYe8Mfj=$q|6dCL<53H^nHq)$ diff --git a/SPEX/Doc/SPEX_UserGuide.pdf b/SPEX/Doc/SPEX_UserGuide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fc41510903f608a0d9b3589fdd3078f12222bc9c GIT binary patch literal 386707 zcma&MW2|splP$V!+qR!=+qP}nwr$(CZTs1_ZS%fg-%g)%@7Fn}XDTa|wSKJ3WX@4z zR1H#jVNu#YbSzM$^UEV^P>ci&1a^j&P~6;5^vWLgCIs|yhL%dsHc<4k1b-M9py)*{ z9G#pA*cmvW=%r0;&792%{xCDL68y*d*H>$26GsAiQELNd6JZl0J7W_lUS23CXGaqQ z8z}dU9JLACO>va&OX{5kUUpOZtzd#Qc2=Nha)E5j=>haiOO4leP&$bKJ~tv#iPf<< zV+15H>X5ehWOT+tGyv7&7CFfzINU)q^d$dN%YfUX56ePQ4~Pn#hj|c4_yFc~_C)P4 zZ^Xo^akoF3N%;9oW&T{iP+JI2ln^};wv{|e|84U@&IxC!RDp-K@l5oz7DNH6yswL@E|S;IO;`%EdJt& zb0A&?-mwF|5n$p$N}M@8nEo82L3q{h_L4e z97A~!0B#}n;8dr=JV2IKl5~W%L`ej$6brA)I46P+}A-_Lo- zhyASK7DjU+b-a<+dl#4O=R;kt1m@5`-p_{;M8h60a3ss)TRO(o**WTS>g+CTaz{j6 zNzNPQ@OfwC==yxW=KHv}o;)4y&c?^3-CP*mAn__z5#YYJ_ck%iI$9@R-~UY+CaYpF zGq;ZV;iA?DLUYJtiKwv4w&UI;ixC_-W|k>iD!z_sfJB{)RBRMH>q5+6y}{V+)}5} ztgR+twg{0_U$-WZ^F(r_HtS}$WgefKX!o$a3j~(d<3urlmp7UP$kJ6~Zl<%q$Ercb zim4gisdV|~+l9Mv;vEHo?~$>YO55x$JIO7jKpixAeofZBozTyqNmfTOY||C$J26EL z_lW200h6;koi~{5NqfVtL-=0;Z6=2G33d~_Sc2DF>SLbtY}mc}Vi6dc?nT8J~QOqq|!%JnEi zL9-}MaPkLkB}m%@AK+RA;>ldzfm9!p>n`cuvt__#MRgNW9vkQTg|eMNiUuIFuF>5Y zd3m$P$Ox#h=~*%>!=qVq1NVxOMX%yp7@s}BrB85Es8p;AYybMigNA=7z;W_qhf#5+sUT1Cxx-vFk)T1HyVA|JE-glq4240T79j~BmoOT6+%A=!HgE22F zG0m3gq_9J3`BjD2neI)HVNweJFvX-!$&ZoQR2(S|?1I)cpd}R} zOOx+Kk(!z1M^qVX1?#X41s)G;*{{YD$GwL0vboL9Qv9n|&nqZ^)t7k-rHy_Un*b;P zmdSCFj(D8q{%Ikh)sF&&`^DCcFXb4>?y6eMoU6b;&^WBR=7;@&mUdAJi9iYDN4fPF zpO57q`Cl^|PFoo#XRci|K63&AR$5>u(-%koioUTt#sLd_iO#MWSfG^ zWaO>K;hV_`Tk86l8tKVa8#zMHvS*0;Zw?y=$G;!8KWrR~|5HA3tSRNR$%@eXsdguh z8?1jX8fTLu%_y@qYFWl)0T(U2o-JM|x!{_uw+jk6;XTnPGun`athYz!f4ezChsMkf zZGLwV{&CqS=C6jupRbW0OfVg;-^u-PmjK4({Y#cVtcj|PT9XTrUjSbU9#*<_+P;;lak?%f^B0lif|pg<@=``}wIx5tIQ? zpQOl0ZZzFO7aScRX;_>FRMb#H#r^&Lc8kcGus?AeE`(v0CgFW7k_G^RKRO*KU$9k# zSZ7oUAxO&jYGNVIW#%Z|1VdjG?liEp<~EsI-|rjT1gO=bZt zcVi77wkS;6amv0;n%+7pg=tP|(-XDsfJRf-pZjP?>T?EZ;^3jM+V{7_Z}%rIn!{L7MY^lyt(P;P-4U+5Wp~9BrQ^~-R48ub|z+y zWKwY3XyrK|9^@9p(3u8DA z9+TkN{&71+X<~`qWVDN{b|C$Q)kDm zMvGs-hi~kc!5EfQu|+!VRaDhTo9u~TypSStU$Vd@N4wMmy*V4H25Wqj8hmY}QP?`y zbVoM{G5ICq!+kiz)nMrKp3(MQ5bo|M&AJ_WIno?Vrd-6Xyo5A#kU+kOLgah0b@qTc zYed6FTV{=v6QQOJ_uHT_l1_^a91k952lg0c;Pn_;!Ok^TZ<6y9biY z>H_m6!2pRl*mKnS&rar#xkKp1q!b8GKPJVoi$RGa0<6trR%q zLpH^=)2#Egc++|GeZ8BctykMR*l3NlNYk&x%jz-hm4V&9plNBQ|K*N<5RqVn0Dzc+ z^n3m-qwCIrsuF54L%rOlGCq&&QDg`|d>KHxbEYYnzV`|rM_iXV;X-o^CqFc4gg`UL zVoYJEZnJ!9XAWPf7LL7yJg$KnWBwvPweLbN0cK7GZp>=k(ZuPVBL_7Z{94=UF|yT zT}eClP@4o7{<5;47W;b8{!!1qGh_-Tm<$Rj49rn*O5>cJjW0oGKPVY1t^2io6fJT| zC?T2_d6XkQl67rb-l7QO_4o=vmJ>_3cv0qsIVx=}n}pdo{enb5ZBn(#3QX<- z5*=LA`1Mrzif3P)r7r4d{)le+oXyejxl1P%@|>&J*F5io+X0C8nCN!K|i|j~o60wN))rz1@T% z7@m`cC30|>KVo$I&YVC+ut>QgXNaS2J_sPHzqkWi51>J90 z;z`-HXC67@@a>4`wzK6~?;I<&sU3m7DOWn=w436p5;@-uSA*PZ-?4#-$IrAG%qx5< zK(WK3ArfU-v?5cj15v9Ow29SO5)HrvHtZZ;{faL|z7_jp$vle}4>g$QX!~4s zZcce4{ZRS%XZKNozg)S1_AUViuBF*DHSXxjG2x=()1k`*lNk)-hDvI9ei~yMZX-A> zKsbBjvuw)d^4@P@l97#5+sQQa9!}@s%6OgwxAT!MRl(=Ozi=$l(Ln9WHcHn$&-)j+ zNTKT!j*aYZIn^GG8&>6molQBg2qzjicCXb0)#??s>K3@z)@^f=HNMhnUTIX#Bv|<| z`Dao20;~Dp19RrlSl=ruzPTd{)m2~74irtm<|gTSj;czYdarcS+s+(TcOj2ZdhxU> zPNQ}vACYVd?@e5Px+t8xt|=%2U$OL4G%9WuCBBD1?LHrBOG)3*{K??MUogy4fOm7_ zYgXqY#bEdwmIqZvG;zuz`u_p~>}NM&i&` z`_a|)fbK`ZL1IFPy8B^?cTlb?5O&-B>PUdY(a%JC>uUspgYIR*AgvCX!~T6ij)q*P z{MhYuk;4YC+zi6yDl1g5wK$Oz10hJiyu2e}l? zh_58v^)k$YT8H3dKD{($PKXZ$Ur183{b@3$i>ze z2x^KRYxeP(p#2~n{!?pDhg0Ph_c4*U(8M}`Z50w2@MPBDc%fF;CF!c7Rm(SDHE~{AE_sS;3AF5 z5cSj_>S5&4_!exbI%t=Nv0$zH(7l7 z{{XoMU!yn*#Ro4TAPOMGT8StKOpU_|z|Mklv9lwLR8aWZ%wj3vM3~vITwIuv)hu6h zyq%W~G%dCDeG%%aBvo0`?Iag@Eb;d7SvoZE%3s(C{jQ+Q%Ko4nUny4az=xTI)wvd> zZ&G}mg>9o?9`WKEn(W-~{@S#0PE=Wo^Q8xQnNX>fGBw|Nq7WSxsJRfrYdT3o7no1Z|a zd#k^8Ek&#!8G{0{h0Q!!E~pe@tG)J%JPN?LdFIRDY082Io-qxsX>eT2Y^p5fq`M-Y zh;V!?%TBs>57N37)RG*ok~p#3lBs;2pX@_@-lE6)1>1k=1|Qx+nwfe$#DOS|$8(JnrbJtYxdlb?ij$-vV1JPrUUn*kp*qw6ufIq05@G z+!&`7l+L1heksMa%idqt`6!SqQE7}tZ|W`kK4~heXIXx#(R8b9c2alkYGCC8Kb_RR z%B{9A@e1DBW%8O6Qz4ZVcF=Y^wRW>-pqRC-rBdjoqhsLya=7iwYmMACwbOscd& zbHefec(mAkF72$IN}FkMubba*8K51@h6ngFroJ{(vTe_51@PR`$Y++9Wq}x0mlG5A&IgS~k*^wEK3t-ds(t^JvJNyL!!s9IP`VIx~mgp%t5X z?o{uEB~a5d>=H@TYPlt1zYegQYa4yO@YTzx)!d}0nif@tOdQCp^EEk5M$2N$AXl>T zcWLUuY5PZ8)?Ry5!{aL`qDl3Itt7wXl&i*tabI%GyQW0!Q7iFs^88@z!8AJ|mJi)n zcLn@>f-iS<;j22Ab^Fb99Fpte+y-gu=b^(!0`ajYw83e zN&9Zm-uf-JLlcP|r!Tvlfo5kmYr!H!y@3@6H|n6e^X6uDzAH*p@)a!xCAZW3ty?^} zTO1@uD@kjzW~OGUX3j>}S@542jl!fi?M}Zp{Qo7%_ll!ZnDi#y$@hy$b5t9RYbNXA zx@=h~<)3LONQC?)_K$J`oD8cA6XxN4N)s6FK=30%pSO_ zLsxxNYd-2V#>C8kc%xGI*DICtJ52#20x$S2@u)=!xG|}%Y9T*imHN6usOB|+tgvCP4blY=#vx@3vhU@zueWSv3-n2 z&@A6#%83ghxZGPm9_a+AeiJ1iK6j^v7A-phL$`UMCrm`CisOO5m;$4dN850C2EW{I zBx}D(fpYBMV_r1ZU6V*^+&{o$yMw&{UXq!a+5cVRGO{tT{7*IRwe~+6mmTR}8kYh; zc<*~nYbD9p(vmUBg;}L5B?FjPfpyB$U4j$ubk!~hz^0dElIVavOS>?v!nUvvKBf*^ z-`*K<|7>Q0&y1X27a9#QFdBh5la^S7cm!r~!5YygJ^TA-^Xji%(`%XEjIYOiX5~kU zwxV!5kkE0-w60TNj|t3gB1IGaRn{XL`9d;sNb%7^GGcMCJ>OwC(f)MMdZtGy0(xoV z&(C(1UmBe5jO>q>V7EpgOrfS2l$9_?+{tAUyx+b#px+niU^pi3c4}HJacFS^pO(n2 z+|M!i&Yc*uh-k(l+R4vNLuqMrT2=AxTokWVgb|@ik{) z2^h@kz+!AGseqcrYi`||*2i9nIenVo6>=VAWUuFQlyHVPXs+#jolXg8uD?^t_4d0p zxPBYj3n!HOJaB^P05A^KJmCj`!kk#b0f=cNFyZ=9k{4UGVnOar5;lgiQNa4j@n3m3 z?2-78+BPo@3;hBZe`x##{EdJt4sPLA8g#}TLK!I1$Q(5iyPnY=8pRa2P$rD&O<|Vm z;?v{6kkEYAM-t*j6Ob6J2lpUa)8z`MXwLu25Hyh>G)5SBIG_)NeA87?LC+>we?+}DarKlB%+mI8=e9T3ekoHtJ;i4HJr;(l)nTp0WM~-gsk@%(lkEZ z?!4_KQhl$>$fV{odk0Q!t_vVPT&wu?V8+6&&VgAh)FKM|gOFn?YKBVKFD5jGyv2f` z_dBHQUHD1`Tq<4K>s9n|MzHDP$nb5D4R1Ryp_>|V8D+v0<5i)Pz%pvf>eoWFGR>m; zaSoM=*MEL`12r;gff+7N$R0{*0wOdr=*U|^E$#$ZxP$BUDqe-4cU zAP5D*ga!1c24BG(;xRhP#1S5%E2j_T_)G#O;)%x9K7$^LXYnV4X)T5WQ{whJjGTAw zzQ26jFvvOqvw4^>S+7r+)e_EChcI4u%59oFkL8ME2PNkN7pvh&3Sb)dOH&qyZ=jy@ zIv5$dc(qwLtYe(HXvEk-Z(gn-Z$fKrclbb14fI;x+a&x%KuR@+ZNqelrp%U2*?`@8 zd#=45_#&d;H&Ym$tEiOClYe+zlgZC}4K*#u)z4bvY&RgTsU!-R5~GP5x$arR?6qgc zxb$Vsobnn9KAZ@)qNPU-BahqE0P0B=ZdcQC@v$0va8T|`%8k&-IKGN>-Xm42{aM!u zDNqb%DhC5xMnK#r5JpkrDp>0f7a+*MP%nUeNJIMRK4CeWOY+ z6)@~K=s`%nf%%c`9Gr_aq{cU`!bLNYppVYXKnha@D#g4OPjAz#(+(DK`=UG#`E z1HKG8FyIclAy8!28RM_-;=aBHf&}CJTjbRqU0+v^j+@9A3|TBqzBzH91MS5wHp!4> zyn>eI7%rGRa2yTlAVX*)o=yw9>H^iGZ50u$XrPVVm9~lXyrZamO(CLEVI0tpz?3DO zBTf-?id>H$*Hv!q>*{(Ax+`)@%ppd(Y*M_0qf+FAwi=FvOk(EH#dA!IKNn?_>Kj`H zGat&&RQ%WeVO%ID<^6#2cuiYS|07}60Uebf&HqF>GGu~OUy7m^c=M$+ibX2utxPdR ztUB`te@Wldr&0iohdE<1jnTdq^>z$sgYrhJIvGh$94wO1qhU5TuU0m>q+?FN59PeF z`~&i?1LwGw(rE0x2Zz4sp#9Kj+8o6?qX_xe}a zwQ%cJ=Wo69@au7X_Vl*s01?Me_~NR6gGavz_a1vE?i{}a|2Hy-m{pW2xi*?ag7KyE zQk&2$%%CR7y$nZ4H+5F8z*Kb-Q5Tmx_<7l9mJ4mXi4fNN$ILgSo8JRn_h>b;#HD^d zwLI4Lp@paSRAzt)@`-X1OG)%D4@IMUlAhh;4yu%YX_5^tC$$>QCp9_ub?%fjs7`t3=Z9&vvkB7VTSFW?`?;k|167oEbsfAdJugLs)~0Vnoz7<$ zwbAxijU7vGK-6xp*Zs@(<>M?OIawa#!sNb_xW8uG9RbEPk|K2foDJ+RYp&U5EY^Oe z51-}H_|OeVTpBUVg(v0UxSv%N^sZ%Y&TpBTkJ9jP&qu4yWbZkwR1yxm4nJs+`W*pq zJ`fb8x*RqzyB7!7r-$7wqN)*D?}6_Pa)O;CvnWOs-baj@LOh*Cei&^vtu~LffbWIO zY(K9y`XDP{Pxf5WR#j4`;kotQn~bzO_{!9jTE6!|^~R3|iC9_q3U?^Tary9m)fYit~yA*k_nqO zyNJG`)87|_V)WYq;_7x>rwgMWD^76LO>zz{K(=4`Z4fs&$ox?iqa&}yvAOS zO0wIwD!CUB|J%1bJ3FZHx9z3&Oz*0Vqy;exIS2fK`^6+AU{K9;xX2dL3cXJ?HXp5g zBm>Do_7<@^2pdk?S1(uYrR`N;F8xh$m6ZJEiJg?toKnvovZE)+H-M=m;pXrBc8L3B zvXOsIFd;~K;~W(XGLipWB)m%=s$v%x=QU4w)Ah$kspr+<4~`<=Lk!vVl&xGUA0%SB z=wLY=qG*(iAp>Io9G8|>WP|}3h{Hw2ynW^nRU(dODmi@`jvHO`Y>;O~!tSw1OlUN#&P_D$n0T_VcGv{b3R*}P&WS8U8LHcbEZ^v3l{e~X8hBX(TEKzO zc~OUNZ}9nwI2M}9Hcf(YmoR77R&C-}<*A>T{IoO%z5>Mre#qjPU<7{UrU>feKY6*v zD89yjyd@4?T`f){gd!Cp{0+8Pz~1yd{fl_0>3YR;^-o=MS*g2mFIP4!k}UZw=96dm z3s~Au=-Q7~5=;dC%Fo^Tpn#RYZ)0B)Kky+R4$NLlP|Jl^>$@!QcaE3AiY4CqFTaa5 zN2!i=RvkjdFCebXN#cLQf7zJ-o&Ww}VCVQB^Ir{_f6aLQX*u1AD?dt+(`^L6_$@%|HWywQ3*TuZiYB$~7+oN&qTBi7U6sR^Wh zm3w5Li8@~ojwr+B+4X2a7|HgdC~X>mK#_MiuH@Y80imo5bGtdcbI94TVt&!en5rB| z8=w6W^vs3~I?;5z<9msI-l*b$M?rP(^CAF)imsd7?D*f>vfYVt9<<{Mcv6P%x20-T z9*MraRb?yvLx5lsH3Lvp4Vj!eGkqj7?Lo#*t^M3_h9F6CvCYs)6ks+(&nmwAgYVWE z(zcPaPjouuQIZ*fQ5cYdh$Ettys$`rIbV?|>p4NZ;>jk(1-A0}n_o!=dPy2U1|2j) z2_(>_5L!ql5GvS6DvE!67{9Y;$nt&>$G8nzAod-u6 zl9oX2qRsDkXOQYyMMUEO^b=cYP6cw2KsOF=Su?DXp46Ew8E4F<=3V$NDP=tHZ9V~e zOFfM0WTN9WQ1H<7mj|!XWMYAeUy%2kgXozQBzsna<@#nxuReAu-nfD;gq%Mgkz0 zZBn0X;oX8u@N}}RD83mag_X;cit$zmdl%Hrw~@y=n?bixp9X3x+8u zDw`>*6)jCr?QH6rdqOO@xTy%~@^fqJ)uhG7Q*g&8da{3c>T9Y?M&ac2+Ti?b8o#`A z<(QF|hPKO7i(8gvH zZUFFEt)%AOFj^K$89}@CclHghR%s34vIVard|?uUx0~Cp5Fuoy2fKWM20SKvChltc zoLOUDMgTUkk^k7SEzHlQKRqS{OeWW)k@N_vi53 zZ=!k79VdBNa}Se=vV+IC6lgRB6KBwfukM^J03Y$qrNg?E=)taR@J%9R;fPh@{@t`P zB~P2nK(n?@MfWtz%CojJVtq<125 z@?1&VOid+F4G4Lr-B2>5*jwcWOI@SsTw3D#H@s^A>AbeG5f*O;RUOzjKq!>I_v#1-S#n7G_lc*|HB6A_K z)VYtE+}(}0=_DrvsUHhAhMSKg@Au9ZiqWM1&mNRK719qh0w%yXr&d}y+4PW5BcOV9 z&U4N@CExK+X{ktLt3w9||`4S3}0>t$8r_!8d$#R$)y-4kgf6K>ll zngsCIk|2;76~h{xjjM|4tF8?>pWMQ$itdf2V|F;q(pSF|&wM!nKoU7@3{B3pejH<0 zp|x7)dqIRb^o4&=Cr$W?t;HuJfl+x3AAKVT9l-6$bt09Psmg09B5$7tsTO}FF@osA z#YV`|>n+(1_>>CEUK%PEQLxEFEztG$5Rp}4H$Y4*q9>UlnILRm;5h?#@$S(1i$m|Qu^+=okLF7#U$ia_Z z+eQ`xsY*gJLJ3iYs%`49zJX_AQ)%$~E(ff7hO^W!rz-?Hjd3m_-IyH1bVl4d%mUZs ztTdEljvb#<8lvFcBP;T@2q==x%B@5RYHiabSZS@L{m>VjJ&7hwGnw4QVcOD`#?FE= z@59yw$9=uy85kzbgzaNi;GHCInIA3V5x&uSudYcOOKrp_@rijk0to9YBwe_IkK9GM zmp^+3nZR7y+0O6Kltv4{jAN)-C6XWCK&}{ie8ytzlW^UT=6BwK-5Mz(s=HhGa$e5E zfHJ}~TA6$H!DJMr*$_e7uEwoiJw8~96QTHsUD4o6!e!%g5Pm29VaW)@;Wn>U0Ma4h zh={Ma)0X15wAc=Rfp9BWJq~mEz&P8}`$F(#KQ&Vq6XF___5X1qI%!}rj2s@)ph~ZE zK1OM9D#=6Yx~iT-M5I~ucc&)3`P+|?_DiTqj`KGG%ri3F5$c6ROt6u;j)n>3)xC9} zQu7k(fltA|NtU3De|nQ5R9B~lO6q))xvc<7h^<{yZ2o0YR)W)uY^3hovu$z@Ueae4 z>#NImISc#UEq=wC^q%<6>J-2Dt6=DKCf$CeIPIn89f-*QQUp!Vsu^qaBxFEevd*HP zkb=!Oi-;$2hL|^NyzjOj&O3?79ugH>%XQ%;|4l5 zu?D{jfLBwjpC?OvFdRwJTss#?Acy$tB6N7Uv_%{Sw_9H$u~fsSeboa?c=;s5Hw%2x zC#$SsrfG7RHgycEVaVD9rNo4wTQdmXcK=zAHf<@yQ; zO<-bFupc>Tu zQ(a(S8B}vs(Ywf$-vHTlWcB)*w#qF&$ui4Wp@p0%;7>HRHQ`klRH4JmDqUS8s7MgU zC=fbgX@RitGW{6!$eOPK1laxXC`shky6HmeUX~FpdjuRW>vC9(2L=q?Anh@95-hhLez3I!}>#kpY8M=DX+@-ytqB|di_YAt<063oI7%bN19Cbvf>j(MP3Mn2?Xxj@nd!{~m>QbAB19#RJDH6nZG zjX{92^2exp<63O-WRkGVstbY_+Pjci%(F^72IxX9-;v3SkE8ZqfS-cY-3Up3sXqi9 z=7G_gc4;YAn#F-L0azQi5-j&e1Q$M%{Qg2_aozo%D1ypb+Jc3_k&(FIT`(C(j_G}U zNSAiANm;FJFfam744f2CGF|(6MZ5ax%eaSp`y=dS!cXfDtn`UhgFS^J)(Go$(RYs@ z2edL18k!_rT9g6p<4e{`W~~4*-;Z>41Ipm?TPb#)2_?T1@Mx)O@l>p-H1&)Yxqwj_ zkr~Y1XAfxQ=bRlA2xW515|QWPa9Df91<_&B{2h-tuf3dNOAlx2SNmZNry~i*Ge&yc z;VSfJRt|wI9|1%Ae`|)e%}jPUalm-OHsO260iHUvY=Y2fv|tMHAQB6$`r;i0te1PHFP8<3)*yp+SCyd4z+@W{Ue3;-ayh9U$AMTPUi zJoO?O9L?YnN#i5#9}a+=^b!++q>_JnzaEFPzj1|Om$xvV5WB~9oz|za_hf&;M&PXv z{x`&k;eVHE{|EN~$DjXY|7T?XpWF3jw6yGS+E9IW^#;a{LZ+Pd2{kYPv)gTfoBa{X z_%(;%8yg*h*E9vX1QY#sZ>JRpFe4tqZ3kr5cfrk__IBTV}Rd{7Wo;W&Dmg$L+lfQRSxnY`C6pe zB?6Ql%_Q{)hbq|(Mx|$fv;bka$5JLmmEg7LEQNYrH2m{OqvZ(e?M|mqlvKdSFP#DP_ zu?VBs$JmWsFlh9#Cq(}cq+RhH$6HY&tI=}6&<&LPGp_0bbx+c!n{ELT)3AYy3`FWD z+t*vBD}z8MI2RQb#FK&JL80$~5>J9412dHIX$w)t%4<@n2w(zBIt9D8NzOu6dzy?4 zy>%FFvsGeQf=Q2TTb_`kSpu%2+FQB&n8VRxo&nenAsq+{A?qo1+bE64n?ld@lgyAd zCk~j^xBoriwhd5x;HVc)h9D{hgOt3Y4xyI(L9;|iPL_Hc>DK@(`%55FAxjKnHUkPM zP7s>NYKdxgl|MjBlmN9s0d*ZQcXn?Rc@%#T%Q+E*_kg$_st=1`oaQO7cTOz z?5j^CVT3k8+UQ#q(fp5rq zKCRp1$-L?NWwlCYjkmXZ3!iQCl&vmy>3Nrq&TqrIZ%fawugf%bPF1#tTy0LUe5N~~>&x@C3CtWybW0!Cr^y!yaKe>Oml zsQNFdx%)Fq;YuO4vOzUsH71Ro^^ECC_@XDjw&H&HK06T%Z3@!1vqFgU#qHGOdz_it z*tW~^b4NnM0o*8KGSVHf_|$6Dj`9)`Z$9<;X7R+3mS z6F{n=tck2@fJyL4Km4d7w{-wmL|3)?iA+rpW`CxtjsmxAw97*~N(@>+!t;Q#%khLd z?%1;aQw?oEVb!GrphB<@h=gcHV{9|8su00?FG(eX?c z8@*kgS7#r$Y;ayA_^vb7JqjR&;qhkFL20X=J9oBwCqTq?)8+U3Bkp|IbrZSV(97mF z{n*`uPbfE+SI?$(-=K8Y)FEKPLGYB`XMJA>?=Ehsy<_L|>-H+HKilTnql@xp)QsC;NeKvhT9*)zicEZ4RAF z=kmE?*;EdlTj$o8!+$2{4rOCGcy6AH=MrV)Il0dN-=r)j*VS|5+@h?E+>?G)h2A)l zZqyA*6=FxxBtrf4FUvHR*kf>0mAV8@LiqQ9erK7WAa<2I!V9C+e3}i(Wgdk)!GMuRkWcu?VPdVZNw=o&$)KNB}(8DOxV$~%RDRBJhO$Lt%P`q%s zGuqix_!*Os3lvUdSu2oGHg$E*JdD}{K&^VD(y@>gjVJ(^lp6Z5x<|0ASw6uV`UD!& zm#M2uVk^iDK*=nSUB35eVk41&bt6bj^-Utn*%2`w4ME{q+3>p$DOQ3nn?6QK^l z8Cn6vJtDkEVg^>$Do~LqEvzD^oO96$_5xoP+ zx1>@!uI|X+3&-#arFH>O+bftE;uH_h@x*OV$vmBmH>3xePVYgM=Q)4Pg}cf=A~gqV z2MFLIsX&H;h*hRXT1R5IT=g9Jd!h`R;i;xhC*h>Iyb=aTeF_jmckzFK3p zTMOsS>=wB}%vJYVCB417A5sB}r~`yptw$zQTut_PhjblrK002TUBI;qUQUP1x!z@J zz8b&VzTxZ{N$^fk$!&sHKBkYByY4m}bG>SFeRGgWuF|J&?F7&?kB779?s|S+<7Pu8L_{6KZBJ9c$)an`63D!O{!he&l|vj-+e z6r=@YI(!A7QBVz=t>LOVK$bk=pKa2h2pDJwfMj%gf|n8b)|x!Q znzSetdDJC8E%?qX>^omY@zw7eZG+7DpzPU=_xdH;-RZkNefkl(`HtH9L|^%@IM*mM z%hC07yWUc`e5zie&e1JU@PXg`C4+4Y^Y$^=9RgE{wThDAA%8;IPG#k_4v%3IT0T<+ z!3v6=M-WEq*&R-MzFeJeNZ!eCX9|vS?Tf%ypko;LdYB!~N>w+7k}~m+V3Qpu&%8Z} z-jQS(PT)-Xr^oR;54K8OGFC&1L6Z9Ty{NEScc@mJD9*#vakovb ztKg4k*_bYi9g~I!wgO6Mn}u^FRQQ-({fov0Of2BRg-G=Q_EiIwgm)DyV*gy*Ynzt|F4j<2(laD({bx;S*ppgy>`~}t99v& zQIjEN7Lr@<>q_5oyh`nEOL8jkF@2Gg9;i+NKBs5w8GE@e5<~vJKAfPi&a?ZypIQBRU5^_({JSr=d3_mm7{^w3 z@cwiC@&(&$7Z#TL{oXZ)A1&u?C$_*9eB-F(3ow}H_rrl_OBdTU^mqN);1q$+@9ltN z{8yd(ah5?&#Ns|K0HC&>t;-pqBWlOJb zhgUn3n|DIwMt=Kd!2^NH-?6|^)Q5=Xp*CwO#!qWt>BVC=OMHfV_9w6Cq0r-jUVggo zD?RdLgx42zZa4S4*-85HJf}aV&ABEdv|#<|Ki`tJIkN{uB*xP&-CSg*wsu?*Kpbrh4Wpl)A!ITr-GfiIa$~$ zqe#74OTejNso16>ZxKnrX)uE0*hiFje~v1e*pDu6`6fX00f5a9fIqv>@fvg6$$5ME zJp4F%-ej;BzLEgkeIAV{L6*3#01)kXT=#igdY}1tSUSJGgl|>>)2%iV&_b3Qh@QhH zwdLs0&inEp(w}t;CN7+pLXrV;A;_`zdU$u+oiMl$Ivi3w;+|irDKb2NA6MgOBmd2u zfJk}q=5r;|^Ar@J2txDM;y`+O0WPD>o&iM0K)je&lCW>r8_`7~h5kgPC61H*>B|Lb z^~WkIJQ5&1!BdX7Yeq=|JIdLddj9wxb1S1hmU>;q{@K~l{t3gSe%2n8j0hI44qS^8 zHpIP(SV}=)bgq+DUCybveVx|V!;mz7$w`Ukt`PF_o4HYje63)4B}Mw?qgCQIi)f?5K*^Jw3Jric`$B>OssL4}l*%)o!RZp|1l%b7vvy^@zn>?5O)qPAPlEyD% z)@$N3GjQCqkF2Z=vt2f{_p^70If^Ymg#63A8}I?vKHU8Tb(%h0P;Tswe(_FD;xy{f z`r;J%^idM5H>==-;yi8=>V4lgD|2!xvnGZ0V4zJBb%Ru+Y*55ONUcma0Umsj-|vo$ zYQEVTnEf%?eZd1O=T&E=y4vY&)<*x;G%HT+UP$v;qzANQvDe!a_xw?3cIdO$+>FpZ z_Mt4xZy?H=Z4_edJLgp7W+$C@n}~zk=}Ijy#-KnQrVfFde3^IPPbU!S3^Lov@W{H3 zWfCdO_ERpIk(=>EShHc}0kD%U{sqoZ;jx0Arp7Jrk7Yz5ou+BbcGi9^V?Eblfl3b3 z)`e&MzFz^a$R?&Zg?(D6qY!>H!`GsN_`HK8*^SDAONdTR>?j~^&L5s!sUR~m3h{RW zgd35CAs@Gw;TiYB2ByEd;)Vn8rZP5GrQDs39UAI@x>}^VS{%B+YxFt={e}qA2mzfH z^FCgcA|S**w1<*1;hHRH#?g1`SnlCO(wc?;w1YK7VNRCgvl^{VTyKWxL4K$04J(eE_dWERw z!aSW7S!elDrp~G*loi@!*5?Qe;&U?ua+zBo%m&O z+EIk{t5M@prUS0!%cshZ7agjb!jJW4-MHE`S;=f{Lh>i)R8UwtWLPTDFfcsxG8hCJ zBD@CqI4`-kA%I&C!692&!@+$MvtZDb=3bM&jt@Wn-QkH}Q!SBj0pPEavejg-9selx zImiH4QnBWBm7-#&T3Hca%QAoc`Z$QLVC&Pq2Dj!!@ctElj`>avvB(HEUlY)YxPSU{ zgdVNROK{CgaRUZ?J+3GptV>a9lLf}m7lIv=Z=I)xioc!`zo*(Zxz$36F;fcE7F#H! zy-RAphL$y0j*gQ48R=*orPQHSMdG^`WURz2d=D%rGcaSQlV)C^-CVsG_HGyxef-}$^6 z1+|Ay`DDBht2mG3f_u3I;~O@?#r8082WBUFQEQ=;tQf(evA{PhvJCk|+>0F+8YwZO zI=+!)?c7IR<97FD@S~AY>-xWmc?GTek__!&w+*Sf>N8AW#ARu}2484my{d ze4j7;Q)}2L@ch-qelTW*{<5Kh;S>e*cvwTsv%UB85qp3!6#fOzkn|8{$&mEaEpAxd zpFgS|>`~(th`m+l(kob#>+YGgL5};do;nyg=M?k}-WuTu)KTUj|Nl_-4qc)wY>;l* zw(VWEZQHhO+ctLDwr$(CZCCZaclGcLzWxQ7qs&*PK35rX+^m7FIIVR$L}cx5FKcEj23r}*1_y8WN{o@g+pG)%}U75@yZy>C!r@v z<}^atMUS&0Gkdk}54pIJMhD70F99#!ve##w{i;!5|F~hIgAktPldM}#y^yV9Q@WdLaJkY>oa zZ#cUxu4Hg{CiaphxW>}op&FJppu|K!Kp23C2-*%FS5Dpy#EtyLF>nurld&E&-(z(P z_USLOvhGmFyw44%>&X#_{@nBV%Wmx^7p2p5JG_5%)kvzab}#GmVqKm3F<`B92H`cXgD2aa5lR7$)3qu6(i(n)X)@7JzrVO>h72=s-y^J9vOd-eZG z7x)QQ>i_7|voQQe#hHHRI6(_UA7?lzSizZ<4aBpL)3s|unmiG+@IGUOFEWj zlN{z#PM8uWP|>|O`1-g3#v_@mBv|!|?;W&szSVuwl)2q1+&*Hu{PNMx_WVjn#90hr ze$lPwoapum5s`RTcjmv)dig%>4M)g(4B=D|-PR2S)&` z(&N%=x#K*QEc{Wj+s*6)7*&=|slS;GUyN;RwyRv#G+XCwicv~f}AEpEVT^wY6s9f=74T}s{CT43`x zS>*Yfs>bL~*+qlIMTzvEuM%JFj`7MTwF%>#nk%zZF5|nwZw~~d>OnLtb9xU9MU*FK z{)3U>cCF=W(eDz@wJ}#4)|UM)h@cgjoM;CZ_$_2ai4-=|L~+bDlgp~HKL;)F@UxKv z(c!`a*@**T z)2bG@X4p~fv}-NDK3ijb!7P+Q0GM8|Y=I)ek9Bc>0i^vQM2JljfCUmI>_x>%+{W66 zI(e|Ha3Oy?DBTJfw7&}^!TGnShym{Rrdp{A&+{1L8I9XsFKpl^#K7o9%C2rUJd{!` zV)HA&Mxg-jKyEqRu>|T{e$gxhKOoaBW&3=8BvE7jaFMn6p}EiP(|YM$I#dp%Ll!Ja zHQUjV>zO_xC-(+_EARbc2dHV<;LRteT}-O_7%ampeDf{Khzd>UXlIvbr)m`s)hj-% zmENjZIy@diQqg2~{z~N=z(DJhQ$g%T@B5mA5)tm1N=|IT^zUX7+IRamz>g#FY&Ur8 zz!Zb$LktZBJ>^k^NFl7sm>BVTD(RcL?V3PE?3%j2bqtc+TW?mI&@BR)3G)w~6^Bd~ zFs`aLLjuJjIW>=uwhY=XZwFL09msN_psTj@?(+jGveDP*PVs0zI24i4hmw86^#T)M zxWbH}T(fO9MO)P&mjm-0z_9Omm>EVy-I(q!%bx(W6r10^*}=mVo>K0`5kbT)EDhOX ztx;MKsISGB%8Ui^RSGGntm|Z%aW+=?>|n}6pTCw{iUb2Q*m|g+vu+rx*w_PL4J|uR z)%w0YexW%6!R#FJN2#N9gL&HX=xcVT?huJnM0#)=3p2RMJ5!JWevn>b@_ugWgCvTh zcOI&@+!u?Ki_9aB6tYGr%On=5G~2RfnQdnKN+p493G42>uXw_?D%`ti;)m)t1KC!~ z=rdu(fjePni$d|=tot=~Wq&(+adiKk{&flbV=A*fE5GTil|1{qImC}3a15SN29gXq zBj{TY5*1ZB%ce*E*!tHg^|mToUk|2fFDr}MQ__NhpNm;0lnGOQ!1jGgfb<)U+$Aaz zie0QRVp2_>s6GddcPvDH6-1LAKN8u;-NA)7YxW-@!(3;VTCQK>MtfZmhkv}@DZnG; z6~US&!3mLT2VM#a!b9Ra(u_W2{w#=l5Y^ZxtzhIqcvgElHR@9Cb}$u{%l;_j5tepS zL8UCPPb>yIY3N;V8z~)wf5N-<<6Wp;qH;G^3ybTDjb0e+D(DN0V0B{|#pu~oSf+)Ut~BQ`-SH4PoVtxJE~Y>xznk85J4- zkP6KLsl|>3)Z zrz-t5Da;v~+d3WvT9W=yv2GYguNH!7u$|HuQ?P5IdIC4_$1J(+7ho( zL0fj>UT|2!fXy_L>`uFK<4z$u@YTglNcqMHwr~kNU@x9`JQM_~4!uLi9-K|S60iew z#_dw0*v5@r=sudM3-Qj#tH(d5pdCu);u>9S8cI%@3fA7%=wZcks6Lx{y9KeMp0ntf zy|J3Cl1b~Zv*D`d7!u7F?RX4v%TUX^ikSt;+vR0{bcR;Bjk;apFh!}9wqv|R8>j64 zMoMcGBiQP7sLJEhdBO)-j}W1cz)ebW(?FbIO5Nl&gOHhkD|4E2*UVyh8q4!QIUTxV z@rToSARbn^2rhR#3{4Phr`n0BNfzK4nU8{3;g4G&R&EeO35v$Sl-_!2(~`?(5wzn| zLt}HDj)U#&PaV$F2q0-PpfgA?--%%TO-umuonEQ5amar-Nlf(rk&k0x|DTAY?LGZYk^Hqt8s$_+5|7UFT0SNm#WZyZOOjJk zvM?dXv3FB;rbs>wxv%l{dHkrt*4yU4_A`dn!^RF=ki#U&3{hlJ%STae54DGJQH$@+ zWFmVKtl1#}cQdkda;Kx{!d*Y^ANbZGJDug>U56G!-NVdCbBs%u!#L-;a%j1yrK`eR zJ>FtTd^mFXUW}u?YO9O2QGUHXbOSx?R0z?P2t_Op!edTHTKD8kY}`qILo|^WU#ryT zKaOd>(c1cLvsBj^$0L$a#~s@%6OVbIK10J@RH+xkPA4o2s@x<}P~6kWWUj$vB)I+F zwNaIBs>`6QP1(Q6HCUIbCUokl0_0{EDyaSx?5J8qiUl4{{Y$ceItOc|tEsNf7L7}4 zM_F+~!*>ODh-gglZ#~n>Q59Gxl}!8)mh^gG-$rs*TVYLN6{vL%C{E}wX}e|FPF~=V zId;L|dA5p*Z_VR;Z4%(F1?~3B{6I%E;3iRNIW8$6kVJz#cLfPjQQXu5YvXCdG(VUYzMdv<{xg}SzP6j{p_|E7>xZqL z`^lq&^Zgnww3vG*fzn97lEg1r;>@gJ8`tCgO#TN0*qfex;V5i>OEwurdcVor(dQ{b zTLFM=uW>DoBZqW_8s?Y;0m&CNd#qF_%r_S?zW8em_g}^CIqWbhYVi`Z9)9&$J4mzX zP>&rJykQo!^Ff@W$IifHMsRrb+&onWXgO}zrJ8gqw? zW34hfIWf2V<{C?6l!wZ4h=?*LMdigrBngC`>I58zo-9MPe$b+46K%wNH09C?ZLnxn zz9tr!Y#^TXq_=F#?R3;kE$t4dTezJO2ClO%18J)hxOJ(WigYYxPh75dj_D&rVSx@o zRil9x+S@07>zpmoyf`1<{j_z+qV$d4#IzY@@OVUsw0)UG&8JC!m7R^YJGTz*l`6iC znHE=_mARyElMVYWm)=HXN<)FoqM<;6Gs=XtH&Pi~;q=Pu;EA7(6i`)?4IN_EKoUH1 zSi2Xlq{&p!5lQ-ssAMO1wibPtwwCsnJ6o?CKs^vNO!Gk6lA(=XMi+P-w<11Mol55q z^WAcVB^UX0ql>E%o-C2G9ZMZn%36DHMK~w|Bd+m>=D_s*>iwl=Fm>`u?WCUa;=#oM zi#J!;Dkb||D|9h_dat~(HTwc3RCz=(mIz@!lOM?|%u1ERCq}Ewf^^8dyu!%k83qs` z{k?Uh?jSc(KpY@ZZ2BD8MHnl)Iq;uT42qrsz~};dEDwBwCp;2@P5)tT@i`VRjT=O} zJ$+^+!q=L;2T!dZ{`vekS_uyLd|^Ajt7o0ehCP*odGL7P)WbXZ#vo7$#ZC#ETP+HR zu26Evi(w|p=(2yHC95(;PC4)nDZ3;c+wVQ#R`E)Cari11B~qD=P%(awxXr(j!4c=W zgC{6MVcHu^<-pcA2kyQvj7h+d%l%l1p7EIcX*Zi2*gz3~iRF>F3|SDLtl`Feg!>6L zwBxjpU#nbV(v@ET`7g~4cp5=)u(gx4Qpjk8{JPCtMov>bvL^Xgjj1(VZE+miSOoOo z^J|ZDc73OofB;a^H8leQ@*OB|Si^&Mz#Q1u06I*8_dJ$b2<#r=V^Zw*S6cM%XIl7O z5&2BD<2C@yg~L}p-1fc$tFJo?{pP`RWBtSp4}^e$o$J4yfp}^iz7+VjKr9tsyV;mE zLx^jgb^ul#etA;m!(~%{-30T!@reS0kfHj3%_Z%tt@kBEd6foCC*u8GEnG%RP>!xU zYBzoA+d?T~r5besFyD|JEy$)VdFn$y9dH{kNN~qo)rw7;B`fP;e9 z7yd|r?ufW5k&c9dvX4&`o%xwnE|pwQgGos#gAP_RQp;7_WK{kM`w~SBEWoL&vEjJ_ zInma^@pCu(jQCRp7@=_4g;Dvf?Ojr3C_m~cBto1eH|ENe<-b-%+TJ>6wY|m5cG6gZ|{z02rt1 z*IT-?mrRoI*iFB|Rf4}cp|r(C<~+5(_d3FjSL~4IyG5h04iufOxn^;V8g1UE8xCRp z&Dd1=oNPUr**%F6a0qq&CMEX64!|Fd{$Nc5@l_p)p(z|WZdRrB7XDlMm+h5f5!sn8 zAToy%{Vw3Lr|ZL&#m|kCua_I!WtZ2zVr5+~vxuD^I@{$n7zO$45Q66p6^*35m8G6q z^gH2&zD5Ww@-W|kkom;mJN#aD?vP>JpV(3lhCd~|S*0??%vgtdJL;wWhxtcWU}qJr z#TQ=-RNeWMWOh__zApUiBHD|0i4uP+C;I4;g3sUVAfw8+>;w6*D`&OCp;l6aM`#c) z@0%tyyWYkImWu(*-l(;N8CjCIT*)2nyRMr}$$EGhx2)xD>Gn(`%;%N<`V$gh8O zjUeT6jGH&8)b(zeAhg+%@d=|lq8f&OQ#ab+-H-;eS+%6(_t=YHxGRJb0xZ9fuc}C_$MabWmETWx5!_`5BKQJyIy#F;?Z1ou9WANA_#0E4l#;ri=a;iJs8ytZ7$f zC^TPl$2$WQYkveVea;i14XR?>q?2~sd;m->K32@(_ND7w*GMq%rMcu8OUs?PQhq@u z>9ysOEo6}iE;sy}3bK4{D!1Gi7i`M|oL4D_N-Yy=-oXbz6N47R(M|Cw#Y@Ig-w?$& zLL5GeaHc^5C6TRbn4+H;^G_9^F;#>-3;~#H@KlM2+^_G)6+aTd~m?uoeAecttI_WP7Jf9%YS3B!Z= z#KVda8gSK%?}sBN`cG(f;QYoG*7>ocHrUYzZMND=HqpxuiT;0K0D16dKy z1w%w&3*dxxH8UDZE`1SkvZ1fCp&vd{(%9l-2RQ4>*Y?myIi{Ni5dx%clUHi-k3W8( zuRiGvH8M^n-8y6#|A7{6?b|ZLO8#I40$1o0MnDXDpbwDqdw0I)Opv>6@M6YR;wBQn zrSd`uIJf_;HeN;QNo0Ta<$t-HOe5{pb(_r2Jovc}L%|Cse2e-q$S)TCDZWc_`r;3v zzO(Ys;1>iiu*y)>|NUth!;OAV1RZERwfNOoeatYE+cd27$-NU`-)kDyY7rHNLZ{a> z1j#JVi$E92P-|?MkWsV796-|_xrH_9D|)e*e44R7+M!OxiyFu)zFX}W}$-N zCfrb9Cvo6kr%w|Ap`Vwo*q{1iO`$u=WPG}#Yi~uc^k;S#Jk%wg;!5z)E-0Tac~Ksn z8K^Hd#}Jr$N*}mRek1}FoMNnN8Y7At)C^G1gFp=s37`e+74ma^Vy-9PY>;=}Z&ea$ zFQlv3g%Svi7B~o@=~nRFjPh-!1vddSs86#|<^cA$Ube@?q!dtCpLY7eExhC`u1c1m zLc_Px1ih&T%;{Bg?53Lp;5Om;AB4r5L>y-O(LPPRcxRv4`fj?hDGxN54lc)b2JI9VmpqZCh2y9u;gdmJ4VGsMcpV=g|kAF~ir`e>L3^`UDCF(f}FBUon0>qnLwCZ~%tu=D>-qB+Eh=s09@-v0_wi?SLm?ln z5fdu{&58tIrZvSGb}9sE`PHAh_u7AtAT3N!(tF31_t&-!aJ+_Ala1m&uJX9kGSGzke$MuPirZC zc}9x4#+y*3N#Gdfr)B6(#%Z#Q{8Tbwp#IV z)NA`8e8`4o=fnh8-MEn%8Q=;rmxq-8R+DFL7;FIz z_T!OEX|};13eKsi#V)-zL-SPc6G07(=BWA{(aQimC~Fz&?Pn?af+cX^$Tf?MDkY)h zX*~4E;OaG3!-l)Ybff~1>zeXLxw1FG%$rpa0(otSCRU2>u~28p4A+nS2XDcU>TUM! z!3F5J?BPE|EEyo=_1(t_WHVe-G)r-=a#*Lf(V%`?klpCkY$opC)5pf%o{#&haoO38 zTE8STEX%w)Hn^BIsLV1rkM6t*D2LK3f>RM>*c?|)W2v%JOIst2Vg(yOAa{eQ$O#)9 zz=7PtZ|EVh>GBF;ONG0y;xgDd;X0_OTVYj{yCEzX>U#`Fdqd9^A_@8irV=yke@pxk z;LC!+Ad;AObiwsNp+=CYTHD;IB^#Ypfp$6}!QTF42S&_*0n-I?)3SVr;{2)%Kh~Tr zu6+>tEN_a$;UM*W<+V_Ow2OK%CacQm>eisY%k*Trfg?~i4V|ZL}BI!qBX&~91g5eDiRFLtDR1=kAMuAi!%V| zA)fsa=zLM?MGdHNDo`)klZqaM8^w)ZII_YMDlQ}~iJwD%2?=v;U!~@%pGRm-b+<{& zUZPW`l{q$jT?WlPZdrnxMq8=hw4?p?*^wt{^6NPMn-pi3y+8Jvfqr()38tQ@o>X8< zM!YZqkQ*YEb_S}du{ebC!iTn=UN8~qx*W1sdw8ENs_!K<-rfRu%3%?vub(i0M{X$D zBe=!qtElZwDWq|*)oi^hlQUn7-CjM_R-r-l;m3UGIt(x1t$z0_y7xfVa-1+jld4lDf2&20wWUzl9BuMo)> z0Pd%&$SN3Z-w}nl06|4i73kN;Hh}`rwP<2p6VC z%(fAw-L~6&5M#!nf7J-t48&h&`_gdmz4|%)-hY)_SYdd^il!o&%qhka_w_u9=VPOE z%z244iSW8s35wi+J3ww~pyYq55dWO~r#XOM16*QNr2EV#WommCcQ}?b4Gw0ej>W`$ z^lidt*GuqY6}gP03BmhO*Hta`@?d*>d~gtWFwo!R{TdQ3l%VZwwt}0j@}bE0p{V=X z6vnOkG)gD?hL>bwI*FPEiGXDZkw8NLdDEUiGB|ca&`gP8ugV?|JS9s@f+i1li8Ty- zKmu;5LVDq-GvgKy2G{M{X2?LQiF4IpKz#1s?nBm%tkU~dP))M_@Xo#jr!`Nb%Qx_^ zpZmh^=6?uE=KspTu`&P8Jn3l-4ZBToq<_cOxk6@)md_hgG%kN~hX$^(<`!V;co0CE zc{IcbM{z1%-)~hH7K!KTOv$DDid+(czzlM`Cxzk0tIa6Kf zx>H@jsu(=I?1T4ia&$Y{**S}AOea4^xyp63O~A7#m*#yc=+KX`P#S=WQ0Z8(Yl7CDOi=s;gNH z3x5rDD_ozE-4!wiDhDUTPJ#G3jS>uUYZ^Qn%Ok^JYTts{ltmh~<8+As8bnUIeqJ}E z6L+RI3S%+ROo%YdW_Fd_TuV!bL1S6(?(&byIAQ&B+V~I>_F|HRHD?vg$Rg&Xt)$qV zK@#gCGmG3L%utV6V(c!x`_KON@k5_-lqiag{;g7N6vjqP2&}ejw24F#7in-H=*>E1 zgKeg3#KJ?!y!7razcJ$a(|C#VQuT0dz@lKH*E)&{f4EvIBjH@0P_!B4s76@KT86~LL~3KYB|>QV zxdoL#9ocI7$uI-i9ff|(o#W^jXKhh=(<3-v2H5kySD-8|X`1wK1xL6gG23*W$N7yr zs#T{YGAJ8{W?hZMSBd&Tq!S1=dV@_vr%*Tg0cr1q3$NSv_2C#pg3&~~&2@RXBr;A% z6bbEJrA4QIkvQLF2LP<*vdmvn%k-OA#22`;atJk(}m^l*yej0eH^y1&eAN`fnStYsoMTJw7`s*p~Mh)BnN zxXB55k_JLg`sA|k7608BFv(AvJ)M}Z9ad@;c^dW*%T7aPChkW_cMfR%Z!tG2NPe=# z9X46Bbi4U@&TLnvZ3NS3t-l238YM$@9_U1Qa!$|8N*`GvNG|W>rH2Z_6A~c}dbJ9a z9cJ-%Q6gmi5A$_w+`jOH@mnQ%~)10Hfb%7xd z5uh+t_6FVazKujDFQPt>GYO_oD!9xah09DF76Ge1i^ieU$cnkSI~i5LTLTrDZyFEo z1J*eP_V%5bQx6@z0HT03Wh)&YE1g#i#RRZC*}l$uW-#&H%w>mhEWk2nzck}{dynS9 zty8noQodB9$_6}TS7A#8CJAzQ)J))0i)FToj$LR<*n7kec^`n@WMCQbU*_H-aG}W} zdd`ssu&Ds_1eM749nt4W=5TqKgGNMDmP8HqQG0}+R~3|jX8R2|jls`g2Wn7B@Ft&W z1|poshzK?V4q=NufhV|>h!wE!gxrObxlwx9U#73cJ^ocTRDaxURJheVN|zlQ&|OwB zyM-HFV;MAbS0vcetD$UmFRkD@IL+*^A(hRWoXVG>)La2bx2}bQo~ad#bBWthx!GJr zqihxxzzN9yfK;SFVDH!`i_>fe#F%%B_6T5Sn{+A*j(c#ivji2LyvC@;NQX?A5$Y?e zgA6tOJ-~}OT9Lya6U>hP$L2O3_y(8|Rv*VlCm#~P-)QzTB4!ACR zTVAw^^7;|N(szbH=B1O=+AL8x0SS}T`X`SxhRl^{41WQ{1M|D7f#T*d1ZKnmr_|YH zFy!k>%#FZ$EAa`nYz8aX(2b~ynExH(s;MY`rlbxcP67Nn^3chhA(Yn&=wViLY@?O~ zfk-iCCRjfLWHYowTS)>x6k0P~FTriyXKFA<^vfdzgYGNZbio`GN&Oj4jP}gE(IH2# zn!ykU(2T;wvf|_S?fcNaa<{%8k!+FOlW-|$XI3VsU7OEXM@|PoL^te3Qbr}B4;;7) zZ8N5Xqg{|0(9Q#hL)NC@x5Va7IvFC=!N=v%VS`$*Ei@$tZ4f5{Ff)T%r55cT0{fb) z%{N%l%njpmluXuvn3Ko~kMH0U4MUFx;)-5IIW z;Wie{Xhqi5zsoVFOZ#dxx1pcCaKIjCGFk~#Aq|iDCXZZLp_s(=>uc%IjbaJh;r!3r(=#YR_yp^nefwqUvto*h?z{6}oGKBFoM%WsoE6s$bZe zu*j6t1e@=a2Biq7n71?GwJ+wAQ3XwjKayVV)E!Q)_>)wk=$s&WkdE1r`*s2Xe<4gS z_|q|Am)?6pO$r^^5N+zLpKSZu({Hk=O@v$zrkspBT^;;0G$!@`Y0#ZMj5F7 zn#oRzvEHRAIF}%tZ3@K@I0q{r=A6s*Ki<&0Lm}@`c5jA|y9(*7X)#6_wSkl_qto|> zN$oHCv<*Q6iQkQ!ojpW80Knk&H<(n~l$p7aa14;yUe`wqb|S^4gZNT0MgNU_P}r`N z%K*Zf6K{?@co|eG>TE9mHFK}A!+Y^p(nx)QI}6)Oo(gvSnGI^pF{}I{fWL;x%^AG# zN4r+h+W_1t+DahokAPWNglUwo_1cq1cL@5;=2P?B3nR>W?NExEEgUfF5OW9=A?L2! zN``+!1)8!r8@11jtc{PLAbc?izoU&7YK0Y9!y&#x)bM=T#kFv|<@5V8p?jo{PVTHh zUwixnGslHKE zH_DK8X-T7BR~8IHT%QR{BOQO=`=h-jU&%IPKnm&}RW%Mg3)DLRvmCHD7ya=#ZP`g1 z*J)qm2ay`U(&$Q^2VjHm%~(t*Nf%^~3&jS943x*v)W)tfJV>#>+6mbkiJ{E`+7+$n zx15^gASES^8~K%wI=!TRO(MT}e?V8HBZy)8xj_@yz`>t9Bz~9?Z~8{~vU~QdwBxz! z%(<(o^2&f}W(awqcGd3F9uF~$!Z!B!icW|7eu(?s7sYyfkz*d7(#fnY^ic{~_mNP6 z04&@wdKTc^_o8tMe*q`t31$LDAFu8EN$PfY&84M48TF4yFDf;F-aY5}wI6u>>G{lu z*r;;%A2OJQ;Xe-eY%EOwYZatg76KW&au98ZPX61$Gvke>NfVLne*e{JrkNx-5^@K z$`(zPwu&lUtEvV)ZT-AgPPcYuCN53#B*So2Dr@qpvr*0Ll$>wjX!x@6_h8I)Hm-P5 zHa2_g-~VM`Y*x2w#^L95ae4OC44v8S;ex~G>){APS8n$HwKVFGtrEY-m+)E{$HtKi z8g{|cBbdK{81D$&vK1j!!hl(kj`&>>(ljPN4#jCyim+&0wH1{HXo@_SW7siel%-3w zZDRf6ERGm((VGyhAYPiHyKal2{MpdQ&G|i)u4aE0AMJ1X0L_lqLT8A9BnE~J8oJmo zBx_DJIn-p+eN`Kr;7*EKp8a=FD|X z&TAQ*mt(SK{7_Wawe~2yBdtZEQi8^@o6U;L3WAYgpLJK2FR#YVO-~a6ry1j#6VBfO zSiWxdkT7>JK}*1g)z_?wQMSW|OUq3a%5u=vsdl1?Cp4H_f9y1RiUOpwYGe`E;N%#+ zt?l1;tK0<@2h%VN&s4)?reZNxKW|J{wrgN-M^y+1`a;jmQ_g9LKO;^&jt^kA8z^Fc z`4vRRE{&ZVBy9bYWTQOp6HWt}J4VH+2o8JPs4*ftyNTd$WdYd0xDeO$g?!#*n8@ z*!O|stF;VhH^mFuU3@jc}yZloRCCD=~6hO^Tap1|4LD%mJBX z_(|*u2w65F$IFWo=F;hXFfnq5Z7`YrAQ7NN3QS^|?bP1wxyBiK7!}D3!`{znGT@YY ze^Q#KYie876~DBeM{7c1;OH_*2G+~4Vil~s;YNfct9aSZago4Dm}BuA#Xya?Mplh( z*omO0%2+BfIOS*ZSG1RXv|8}fbiT>0;X)MQ%H^-xmDcJnY?ci<$(-^rEtnsXLIa6m z?(fm3WSot3;A`dmJG-y53_-+o7IAbiPDCM`5*5|NQ#T34Cuy&^tLOV~lsBKJ9QfZh zTPniytTz`rK~)AJK_=f}0`agfySTW&y zqdPNf`X2K8)>Ud_Lrh$TnBo2_sUizWFd*x8`OwNXz5$s+i+=?KnA1>a8hOj`DcPk# z25SS#9vV z;D8pb>XS$4!aRUn5~zLTuN3<1Cs+NKiRZvI?%n^kW&KB^8J3|`)P`u<97jChXyE6U zTn8gdN4z@hqmFYaj4%!IG!P!$Z#j$)=V)+b<7)Y)#*(LqW^3*gv%NPIX8{Gd?HaRsHNSeK)y;+DaQE7GpXisr1R=h1*|)&|HtQvm6H!`SM%aMC zVci=41KC(ILs(EB`jLWmG6SQMjo6m%4x`!vIKAqlVaIt^FndSY1pUaoGOHpxGQ$i# z46>t6{oAo zUE3lbfFAbxT}T`+n7yuc$>?Qg7iTIOm*=n^Eq0RLZPA)Fxp@%86=<^rKKG^71V3G$ zle{&(4(Cu31vJTZHls$8bFbeLbI+SQXfuemw0{1<;sE!F)@`ZX&H;!&(Y1g=nyd%T!`0d? z7}hxxGYi``>Re)7#M)3 zx>+hb$Aoxf7TGtVMPWYeBFiBT2`nY#q2!O?$e~@$z`(gK4p&nsy6Ukf32TW(B38yi z9X5>Dt^oX-I9$qRdFVJm5J|;NM?&hZErva#0tjHa)TFeBBUO#G78MwW&23cFZ~q{f z^z%aDaSP^7=9Vr^g6!chv!ttzI9q4XR9<^0pP+j~sk*b@yw)6t6lHI`x===f-kczzNHw*{1OzmXJW+eDGRF zpu_wQEbTYX9CvyS{-fK^#&riSK9mS*cY+pTAbM~kn0wczCeCfK)oBqzgGN6MEg-K< z53Jwl-(_yp{EBV<9u3Esk?wg}YtAFrHY?A-^rS|2s0-kI=TDELe)u_caL20-Y93mV ze;`Bg$;@4V3$U$O+!IX*;C2r|Fk}#_p6&PhG1|Di%QRBf70H$YZV6vD!TD&?6qZch zmJYC4+U)21a&d5VdyXe`gkaPD%zi6nuElT4>KUj2FaP3KE3514_wnlE7yaSx{7%rh*c?bq-&9HTJq*vejhr{(= z`=Z5vU$}+wu{vi?MjTPwXGhO~%Us#gT-q7h?~S9cnBTWSW01u~=&#S&$$7iQTtDwg zmt5R(#(`=OTU@^A!xChyx3Fz8gG7jo_U%L0Pj&i&lm~oBLx|U*0CT&}CSm&J1y?qK z3$w+fT{#Tu#b8otK+*(rDCQz*)5#<~zrt~xo$tT$L{$|j$2Cb%?Iz)o48Du}drIw4v>k&sp0crmEO778&SQg&$s+|>)09rr;VJ>%czOi0|_ z_%RwCfuN~qR=v7>OCsAY8SM~BizXk} z_W~$IBT3OX{S3gU6UZ@^ONh3g26~FJ#JE}#m0xo`q`~9=Ub~GjGfAi* z#nwNp-$9EH#fVU?U}(q=jqKv{qOM%neglv zv3CI;G%t{PO6+6!i$_@vH4hCd08F(U1b+08v9wJ%2Ox|iQUPOl%~Z9yYKTMj}*h5vVL{?-a6XG7NuK^%djH6)=Ivb$jB`QbNtbKMur6d$@8< zA0RbRIyF%iye#V;1yCIaxa4Ax)V;~X)r4L!7xs+=m;BSMUlawWNam?Yusn)Tc74D2 zpzCvM-M;t6A0{dCLQ2h|Fe-uUpbTkNTY$F?GW@Y2C2e#;?8T-)jX40?13IPcq+*^+ z+OutJvkWnCfhCBAqhrZ?D$a8efayTT5+29AHS;RdrTx-jvP~%Sy{(+s-Zyd^1Sn#c zmt4Blm&$Ir!mWHQROxtXYAW@u@i<kx4y^ZR33ygF z%jKWundYa3>M$X(<) zp&9%33Wi#%*v`8YpkUM>YXt|WFxJ{L7ndW8b##Mys8M=NfAOEylqwVrFdm&rF;({D zjXrVs?V~?meyg@60HOW~YS#XJ2So;B*B_Y;(?~uZ4?RVD1%Vu{bMFrU$}d0t>=R`lszc{;1r@ggh=K8-O14&@6M;GZp?5*B@d>07qJ7gou96 z-sfvILYcE&cpv*&z~lq1v)N^j zK#$rJXG$9zB=y$TQo8i50A5?CcXDH0t&<0Dec{HT(~~Jcfv^7Z5LiYc&L4+$UnK z_g$4xna!tCAM9t1d_{P^oV7K6c;OaSS@~L{)7&8Aud6anN_1#0e$#-uN+&e1q6;C| zO5OR1SdCMK5Yhms9U{{m9(}4oFWB!?)wP2v-b}0)=ZglqbHI!r*txl3$Kp%txrUzV zE}WCFx7>TzPHOYKqc|8cS=`ItWQVrNJghCCmmJ0kCA2RdiU@u+X zG&bOSiMiEHdJ72u#BqHSY0y|lN?lYD|JEQ91~X{#OA3C_V}ZzasG3(Itu{W_zF*CD zZ&OuQh1yxkC%Yk(eAaa(RbhXe5CjNLp=(k6qnec=sh%3Vh|=v+=B8ltt{)?ju(6HYkj)GB9tlC~&x|&3QTP&_ZQKBWb=oZJ*s=m?+yZrW9t_P;NXfVk)3RJP zs^EazxaraAS}pqJ*A(6EUYC*TxTh^qzQsQPF$k7!eq+D;^miP4Xh^@$0a2#~ zb<1hbu!0qxgDKD*Ve{(qk{haMc#+FdK$GCwv|c>Ie}!b-T(;$PLly`Jqy}j%Bd)&j zhc=R)r8~jkOc$eDQ_D1*0U-gMtiaz8f4F2iPCJmaYP1HopX=>=<$sBo9lNV|=W729 z>86Gbz=+8>TyHH_ulz)?)YaQm?zGLO%lYm90XK3mTUH%zxeV@vHK0*mLX)zUCi-!M zW>%tIa0{{*<;TscAIzUe*!U(<4E^(T^izQgp7qU zX;0a^rcz3;;i;9G_U0!<``TYnDZAf3k#!dXJt*D&x3{!>YjAatuM*&8>Oc`CiF9%Q z^bK#*gq^RBI=_Hgb7#V!iGn3R^xs&DS8$>9#-4e&0oT|kr2;wd>~-G0iVj_DIl;?U z+Uzd?qH6x>e<)zq|L}yF{$FMo{;@l^IuQT=QrF)hnA^0!E&iA6rId~feLDa=;?ex| z$L>kZO=fPmT<_1>gp?7QN;@u!C>HbRQ3sMo@l21?Y(g0~-dp)xy}WOiNBv2sl2`Pi ze-*vW9D9u3Vi9B4{>@CyY#!{{eb$nPiFJAfUJAx<^AvjAU+z~97JjGYKfXQh^VOR~ znssiWeRigzCh1J(AA7}-i>>{h=s%pC-LXGi_j;n~{@D1T+rr1*-SWk{$&vZ_J^am5 z#wlmsmkn&v#Us1R2WOtx)y?HzW%jX>gOZAl=kf|fEL3)X$2D`lZtiFB-|aA46Jv~h}6)1WTht)O4A7bOo5{Ju4->eWeQ zYu892SaOxq)svQU$c&<&{y&VpQ*3Ar7qwg4wz+HD?yhaywr$(CZQHiHYuoMVN&e*g z$$2lnWL>U{b+t0boMSx0T=8(bB5P%GuCb$RU@8*Kw;ir~@!iTpgC?|LSWHBo?Wxsb zo?7Uo3C^I8wj@$DLVWwokdOS2Rri_89RsgFl>ZC=HxF5O66Yr?&#ZJm1>*5FCI)#x z<8wTv_*6EfWY_7z-YWrfhRCTdP053LGgNje>DEpV{*JteqlW$-01ysg%+LAsWU9JQ zT~PUT`GZSGqeUv}Qv;N%5AT{|TBQGvcumB($PYI6M)+b4a1y}w^iHUQdNvQ3wVXV4 zW?k%*{6ISPwPAr__PJUhhf4oZiSudL#L93%72n8i0O9EY&2)v3W`SAjdhb8hsXo!M zp$NJ|{?@ONCfV-7q+`})|IW^tZCSg?pg%dum5dM^cRMVh*^DAj%;ZtV!p|1zD^xVQ zwRk4|pk#*G#R)7{YJn(#?~Xv!7%PP3UpC_Iy41Q?KKxg2+|Hyv( z9*ncgI<=%PV)wt_3xIIx8ceE5_ciyhPd)cE*{u*ZGS@RCVJe1ps*y%8 z=}m7ecuXh&d+`gVSk>U~RHFMk2q$a=okh0$?lHua zM*o5z1V94FtOfcVx^aaZ!hLDl03Hf907e}K(b$D@#peE&tw=@Pfo@(UnkI{RS`BR8 z>VQ87fYrS)4rUtDF;UY2bgT%w_~E5PS(JtPI`xvZWvnuVq@pd`8g|F1*)pot60c+; zR-IsNIuNhGPr0L9T=~+h1QLbSy@%ExnGU?m{xGTiY}db-a8;E~8S^f8drKONJ-4T3qwZ@o zpoMJR(tr_a*Dex6?{Yv~MX0uByg0w; znz(Ku8*ql7nG|tXudWDYQ$)W5J6Xp8!ax@egA?zLKQ=*0!Z>Py13);wj0K*VMFFt+ zmVNHELI>yr(j|!MP!sDH)n!9qkOyDGwFg{Gl%bC8_I>`S{MyyQ=^C97j(Jg-qUM5B zLD&B@%HiB9ogWJZg3}o-Km^v4pV&UOaIM~5#Ws^q*5;QqIX_H_B@~37o6vx{69pk` zf=O+xb#@Q$hq8TV4i?xGbmGuv**UBC!LW*IpvlS+(uCq!JEHTc3srwMC7{RN#?H*O z^L2@445Eov_#o+TEs>v5+Y3q|V6Mr88o`sLz1)BfAPD zx^>G*mI=r`lXhXnx$x-d7_(RrJYFAHHXY;@LcfrsGHKFpx7S2pw7_)r>Ck9du?Q=) zl(;f?#C!y+BI)YT;ou5QoHfcT)#B|&uBKmH7CIc`U#2-Cl?#TX875)u+>9yX zwZ1Rm1ES7ZI0ab`YUUm2GlpbXHLYH8UJLo!x!gamEL-DOw@XE%NyYB6DwOrq|I#~w zU18Q2PhjEd4=?7fPj*L3 z)EM#>(J)w0xm}sK4K)}cu)~~~7#hzA++qt`Ceii+-c}hO@bv%}zQvF<)n4UEKLOOK zcqN2gWx+OY0rex~U>wtT;3rRdapc(7D>!Qd7yGebOkYp}M+ z$mNnyi$VDf25-U7^55&r2!x%cABr!GQpbB!Om!rZW~}?9@rj1YzhIK(o>woH#@kQz zp^hRY8L7tww$*RJWtFpi)Hm65gPr_M0BgGWo509}o%G#Bw}MpY;blrGGkGtq`6-`Rgn9l-DiF0fv-F=BSOVf#Z z;=-Yaq5$U3MU8(NqG|(I-gd&9IpGhW&}~_~oM*?Kj;R(v9>qKag7tMGW?OkY(oBgKf0@ z0tz$RmZkF6Q?-9^$GA}~n0#;8?$U3XgyRxo@6fL6d*1@}LQM4mbLCG(%MOIR+In-H zoyLlffoz*+>xLXmn3lVuwFz>+Ng)WfLR=61A>{MF)8UKM(8THqcC8OaxYdTk@wH`C zguE+6;F>w$PAondzYjYv;d?=OqUcR=L_(HxS!^*g=##z1%vrDyA({hD1M@$*-TuQC zjj%Uhwu(DS4^O7Hx&GjQ^O&W%F>-IXQ`h#w_wiTtL-wt>mB8PV;Jf*1XcH_ca1$)! z1_U`}v^i>MADg%Sm9YE39d_G0;pVXymgFu{@pwLbrVRdLyb!epXQB?m5zRN^DtnE} z?3Xq9E97He%4%45{!B zZACKJ>K_ApBQ}}?+J7I4OR9N&?=cZD3aHFlo(ufoBR0pUvET!}I@tPW-P)!i_@dps z4ImB?S&Q>YtQOeI^MJ)OV!g?X-9wc2Cd9-+?IwA9*He^U0l!*9_ci^EPdQ+Z7MYv+ zr#Tn2i%cDeF~Gr@=J17yb#EE_?sMu3EMj7{;Py|8ttJ z`v24_t*Y)JO401M8^(nynH#U$7d(j+RJyFnloKE!)sq2&0a#P%_HHi%BM}hFJG=_Q zfjORWET%5PqHTdvyLsQwj*myGYJg>lg|85$ZGqK87^DlcrcDLN?yuLD-jJW97S^MX zCC!`RU?cYM`g;1fdkAE!-pu|)SF?L@AhB}es^iIss_;)f=}6Po{~WIWJ3M+reai0f zmPq_@<_s8Z{QK$c%JOb_zZt1YbRALH6fRuAuR#v4%6=N;{wClykISR7AX>lFuXazd zl0lXYM>8b?V%d5@tBA7i!@P3KMg#3-vCx$ly)M*8e+DMqbY$bbVadQV@t|HNmO z+atbpP7!b4Ie+$=x*W$YC=y~V3R^owRFgO(_!bDgenRuuTPn`HQV+Xmz}i%>6pzx; zcBH5ut~Nq#P`8~{DNfl4`kX;~zBzYnk5ew( zlzGBJK@j-2a-}W(AGg)9Q*sSoac=?j$S)QQ4P-6r-_>X&G}h1DRREGDePj0Y7g?Ev zz1ne+h0Rhz!4f!M1$;M0;J8^nK5u?UKtU!4uZ8{~=$-ccKXF>x2bCUNl6KQH8 zwqVPG;${cs6`p&*@A$UTPB|<8{38>z9G=td)1@=R{?(B+EJW^i zpMo@5P_wvs#bsvka#t--Rt%@cujqT6h|Qg^3C*$;_(k8RyxXo0H;qpglw5xnC|0%oG$9kZ2Rd^AlVvF2+sD@eMXPYxI`3>peI zI{l-Z9Oj&XXt!8w&ZOS z1#hN_B0b{kzW8#pKHUR68~g%^CdHuXa7{ruxM_cF0NV2b1^ z*qYG$m&d^kz(n<`#MK7IsT0J(!K^S+9K?WDe<1_O1X)S@n@-^y)--eeRXG8X@KgwF zy7LIMFv$DLqD*q%`tIq`32WS%J84&wm5Cq_L0hgIW#(l@PL7>oEC@8LITKXH&XN+~ z(qGK$*(FGE_J;A3`N;xBZjIMzT1ReXG;qQrHlLBM09@cf>^9556K;ZWDz12&ldB)- z6G}s`q5{fA#5;-={gdj_zBa!=FC30 zFpwF#?-FMc_XcDLRwptyZkjPXOMw7|_^B}h&CQbMrea2>#Enzd8>+7H+cN#gPuZpB zw1I7fx%Wl;=FKQ$9Emw&sv17nfMj03A=w(FdiR|3en|;hRG%EbeJoqs$j@#3b+~gL zT5j~G;QD!oeC$9JBRJxSMAPpGzT?pFG+K+$QFUuJS)Jqx$vo)RZy-&mb+Y0NF##<> z;TboD+9W9=uLYM?+06f1r9WIG;kD^x< zFGYUES@Ap`=6QjVnJT4f@~SSp^@A4bQmBA3f298~H@c$TMxQUp>IC^a6i#S!4j7;} zUOv@g%$arDtV=+0e0<4;C^(TD5fLqF6%1yA_mX(u+G~v8*Owa*W#%=s`YxUAgb45U zt~v%pPoH{hePbA*VlZTP^&*k>)~fYLU7#_{+wa*tOya_vDNR#g%Wtnd50GK}IgQ20 z*^X0b8e0b42M%~z$Ws)ELW%r%szlNwx2CJpf+cX830(|Y31&o6%&p`+($ddodUn9Dl6 z>_b^+8Me&>lvT+!Z7;8~A2KhEt81uxZlAig^rGW;KCmy}O`Txa1Cgjx(YcSOuf`|X z>b!4pRr00lG!=ZlmK*A#{Md0L^1X$raZ0%qcK9jq1S5GF`jXbv2V$YvxJT-?i`j}6 z*10O3UKlZDz`hD=@u=`K#4Po-<1Z(wXK))xUh?IFGN)bzhtYnZNb!&IFS#F$g1to< z@2R(TJ=|z>K%rd@8Q{JDXsIDZQ1y=52EE1Yy1l-RQH9A16%e-y7@sYyH-TxEc35ap z^Rx~OIU$>KKo6;PnQgkk(W@m9Jpqte8p1vCI|7=Jt#2N)t!U~f4L$3q=nA3sT8&WH zsePk=gc21Yx zT4Ny&tJ2GgeA1JLf`~gUrN^hO)y>Y4-qG%PyE*$e-PsyAtQj6$M>6Bn7>oC%hbuGLX^U_XW`cl3?TeeM1 zji!h@tGv*P1|+g6>8tuh{mKRCAA+Qfq#Rwip|4xq{_6gAf}bYXCafUnw^kf+$H zK3~k&)c7O3wb_71v0i0CCKJtJ?4N~v+%MTYgo~)lxtO)JTWJPhxLx*q#vo4qf23%SC_=4e09`{%a=Vua47)}dU3qtb%@p(nPPSrPgQy?ca z_Y&D>IstT8$?=WFN$80g`R%nsy-opC1bDJy(*$J~T7>r$3Uc4-yz_zPdu!iVoAjvflB zZbf*^mKTCS>I`1tfz76SXC+;^Wc_T~#;~QEV(ct9RFRkh-R!EvABn}hr~epL+5cl1 z&dBn=8>G9{|3AW+)>4J=`9>(H!-7jI____7y&td>y1&6>{mevyYJ%s-(@7?#WC}{L z1Z$r=!#E)&+{rua)s&6t%;iaL}um#%rT8zo$(`BOb^W@p+ zZ>!GRuhDDa*$WYD;{EL^v=zPdM6m1g^_g!8x|+=qRlW3KtU2XDJb!d)@(6Ukb|ys? z-Igx+H=P`9_5I`&v%e1d_3gs(GrA%}J_WCOa-xW?=~iRfnMX6{p+iua zXb|n#)X=b5P^G|x5HruQnc}YT^E4gTue)%lS>~)#rSK46!kVq3r%y$XP??Vx?NX_Dfk9em^%#O~7fk?Uu+Gnp$w}Nw4k6LCUFYzVghzZ76{3 zx;P#l%M*1u_2{YYa%+*(8xQ|3$2}f?p%gjmi_u`tqVDLmF!zP^;T&I*twk zReTfEM6X!aK5PoLs2mvERaVzbT~}>$5nc4<6dLUUcl%5J-J?Pk1kvU!HtS%NH$U0( zGyFVyrxh0&Lcs6Wck9StC$AU-bErTae{1(Oq`n(bFp@`7QMj-GdSPCzY zTb^wYLY727B}KB5pkEZ?A8=bX&k??CJv(2^;hJ~CaBvMSfep{%-m^HV2vf24ZmToG zbG%<=T%kG$S%Lgyj7&E3tc&`5M6^l8l2rUY?25@So&py$V*qdEW#uEslR{}}vb__k zIUP(Oa5`P9HGl;$5^z`;fUq09AB4BlVd!mOgw^hu3Z$SM*y7$IF<5R+m{49Cy^jWw zioBkpt`)&|DQn$^>G@}J<>?-076ku7@=Ovs~1al$#)MmOZ=7g0AMB}~7SKym2 z$^Y7`qA9S)5H%n6gBqrKCZs~bLy*d&={g8u81N#l8I3=Y)SNp8G#E2CFvzCdRN|c# zP7Y2I*U5DtLR+@|uQDJ7C;8USH2b}|*oytdGliBhx=_?Enj{*!ju&MA8mmrBl>p_^ z93s8C15f7k3@%v1DNpE0MCQ4X8*dv7uW;)_6#nB!J$C-Gc2zuHKkrzcd}gCA(^u00bJm$R1Mvj3p{Mb%t94J2}XH|OhW4~76nRX245k%HKba78M1=4 z_3OH&qrnlxo$=c5D8ozLe58mw>`~k72xQi>TQs*#CHKv33&9*Xj>n#M!pZ;RY+AWJ zUdorfj+HppavN{<9GrS>LXVqjpuyY8{kF{w2os|yV^+AaZwo3Z?e?;Cq}A7vci8aM zmxC(B*&yhR|K9fq3G218+yLYq8E+P zy--2gE0Clt40AkTSZTOAO=$;B+H8boer-av7-;z=QW)~#E^@JH)lTIk zJ3^S1GPnZ?!rP#Kj)lPIQS^-Q9_V@b+;Tw_ZmN|{HI12DQh68{K9TGUp3j~`19$`2 z5Ips2WHpLUBZt(DKxeu<2+GP zHB^~5yCW2Nn>Vs(Qu?|v>}M3UU8Mx1XFsl}gQgChA*ZU7lA)bcnMTY|V?mt{bCQ-s zu!dmwv_|>yni`WHq))U@wp`|@kdYOwkg>A_tIWL|-hP`s0xd_wU8*MeIQ`a!L-VB>qLZXG+D zrS=YxxCl29Kae9SXXEe~i_fRHrrD!g12XF|Gx&>pNEyiqgz|(DqlcVz5*YMNJA0ns zckP6yVB%Sa@19=pSvRuA@ z;{E50!vK=?Lq9QWkk*fJ)MNGIJ~qvzgu%~ohpP#wU|?A6nlGr4Nakf+kSi6BTGXnX z;Mh^HHELH`qQ7_RNL9_9oPGZ)3lSPNniULqVM*hS*hm;5=mjUO^j0rJ|1W9d8l(FF zi$sp?*cToG^*iNz&9Br_>u6JEsayN<*_ZFp<;Viy-ocfjxZD-fF@MAcYHzh@eS2>H}wM08`WPR?&j`NSg~Di=Dv8*yqUs)?)JfL zJ-VpwS6|`RN-@aPhE)ZHV$rc}SNNH%6%T`Adny%~f&}btTGf~z?L%(Nv=?}dxt73} zJPr~6a`JqF7GPPvN0K7kO;@EK3Gti&J6YPjcc{~|wEI3s{175gux`Mmj0Ky`0{U-! zx5!Dc|C%KK17XI%$nrmT$rr0`+8m0)c+aYy%F~{QAM-ZCgKlZH&@3?9~K%i*G z1WS_$B{XjPc#r4*TMGyv$wZG7N@U7%6pxTB_@D^q#sB2wV&`6FJjimd7Gc&DRS{P4 zI4)QxdPliG$&gO=AChpzl#@O%=CqwajII3a{av^L@vA6|peu)$aUVrm z3BXlWSRdIwilJ#%@cMtP_rSainVw+GwG9`4(%hRWasSvnTl*wUMtYfhr5d7@X3O zNr|TSl5K9<(3)u);tIwlK@=h*Y##~i0-k>;^1B56J(U67cTo%87rV!!zZ6-jRPS@b zUnaxSem zfI0YhyRg0}rQh`~&VDfiy|-(5<(tO;h?V z^gh1V9tI+|pg`-?q@LKXT28pqvEX}!UxDHcHxauM<0ylg3X3tHbsl9-gJGg+HxZp! zO-q5aJ8?~i%L<6$sC?nrUcjd)4l#>2&r0WPxC$LdqnEKe3LU!^<3pntV2=*A#AJrQ zPlG9mGvJo@w5{ys57j*ZBMY-;1nEOnP+yX6PG`$U;kOrCRE!JfKv;O{__Io{#9CeO z<34vC@?ezR%<9Z)+hLBcfP%zXK`$$x=EKX+OWjz&Mj+^@Z$MXBNN3n@J$f=HW433& zba^J&6C93yBn{dM1r2=&6GaWrGSdTt-8gD1Y$dz^UdVd@E*V8%Km6beX93B(r13#NE}Id14bY zpY+VwXkMIQ(hXi6qb9V+UDgEr2iOzs9N|BHogDvn+q9Iijj59v0Rubx|D4GvR@=7S z97FVd(d`$53S0X+NVw!F_D_7@AhEdw05AIGUZ^12C!7*fa<%vN^rmYo6iI(LoFR)b zH8wUr@F2~niVNG$2)}+GzF*qbDk6_l%OmYxNGFw#RdCOP^{&j9zAp3W>geS9s(JN% zr>iGRG;k+QX^>!H>|?^#XJzZ=e)*93BgaP-NhcPJsq5J&HEra2zf%{mgzGVmomLSaOZK(2sUn(`ej0vDW-Ff< zHBHq(_i{6D7@8nTV~vk2PWltQyGzp)rR}KN{$a-(X{Q@s5-}5LR&G^r@8ng725=#EX}jb7nASR~t-5^;^xj}!SrKfI^V(3}akb;TJn{2g zD?Xgrn)*7%5zJ@5_rY(`6BPD-dkjN@EzY~?_Zo#!w}G7opc3YnDEMeugz)9nU8z6% z3zj2MTuOc^5c9UXU6A(8c=Yysdk3bPN;6fG%9XQM-DWmcjPE`(ZKWC1ZjJ6Ntkjm% z8zJ&+t)(=HLc5zu?rp~Vr;0sf+uUo7#`w%@te(^VA;Clnp9I!_P;RZd69tqk_cZdb zD1dp0wI1o9%e6`{7l8C-h!BR!jb#9ngkb1b;c}l8C-4#$JQI(f6ixL_#J{7h?KV|u zL>oy6Y_4UtSXv8p_R+$fq}xT@xWt$0Cx-*DPsV*xV{tyXGq~+q^u}?3dUx};35%&f z166%K)vV)W_1q7K+I1PvLbZcnEhi>VV;q7ocp+*J4^lKzwMMhPc3CSm&s zfS%`byrB_;L)4UP3}C+1*J>y?fYRAaWAI)oxsYP(9H)<}tAGLpuUWPXizR#zopV-l-sQHOM|yfC zaM2RDQ!@aE?4@!(c^rSNb?c?WNG-bucW9>LjFju=14>H!C9bfDt7w&igvqk5y+@8Q z&j$r@0NaAF`Wye^q4b3h-*4x(+*EjQ~`;>$MM9!nMTeNjh-r;{QE@(!tXaUw7; zxLon%#WI&*RIynYUM3e3#tHgt{iO(JgT{h}_~)sRYC@=s$_5_UQt^}K{SAzWFfSBV zWbgxj5-as7Ke(DH7Uz{`+S~3Q@G}a*27vgy^xyOP>cGmg%V`o8@&JfcpYyrx0L<}dzMiEUJy@hj3mLJ|H;#Du0p=UR5$ zY9Q$Ok&o1X=f5(P9RDSCIN1MZsz|rmFRfV=={G|uu-79e(6obo4ZSJkuNC*WrQ^{f z432V&3P>Z*YL9dlp`^82+nesapGm146YN9O-kFu2ot=J?UOaCtTzEtG-O|?PMJFDe&paLpnMP%v?ryWUw_T^}gFO?v<{)V5SmW+>@u@R+d#o2-^`}iktNVlb z!})IT$g}1n0jV597Fo_ngds4JwoDbaQhEr92+3G=cJRJkPx$Ydk0b>779@Cn_mPAo zNTNVXGemK(rq-uRzh0UswE+@IxVWN_TY~W9)i7P}f*GhIpKwyxk}$l>5v!#5fTG)` za4zllQ8%O9XdgS7B2^^WPFn$W2GJ(U&t&fTaR5@`lzNgQVLy{e8TZc@?=H*E4X`Yk z#O~GZ)bSsAZ_N`4gM+RtNHkwc7v*;6o9N6}_+%8L!M6qs)U|#(rVkb|=lLv&wZxU% z0*OCCi;C#VkUtImgrO&WEE&itCGpG|Wy1ImFwqKNHf%dAhULKVuel2$6n|nlHO&Xg z&9-rk7~C2t(|MTexj%CiAQqT6j^^LtsT+|J4zZ;P6i)H46%2F~T)<{=JvR0hZ22RE}N-E5RChArgJWWUp zIoI-X`;4(>T9_AB;MT|s1sc{8Ho!*d=ya@m!yXDH25@D%u@;xF@MGRYx6_U<0N2^`rBkccf;3j|ccJgcRz zmTfS-H1y&E0;sgZ(H=`7Oy_?)ioigeiERj*MbC%mJDf5nbr*y{l`OWk2L_PCL|<5C zcIH=I0~CjPhR`QJ10Frp^~9o<=$VA_zuioJ_CRtrj!@EkLg0-?UA*>dHrKe=2poTs zfq*0Qc>&OicOAOCLBWNPnu#bMcp$4yLNETlJnz4Mi5=*mySig5@Nlgz1~b zmbBg;m&&Tf%y(r+!160mZWLZuOt6y#5m6rMZ(oel2UctuJlwaDxO5chjPT{_2gs3f z%DZH`%^@>#p!k#wY{ab^hHoKAY$}<@f)#LpGo#;*2tbev0Kz zfsp{u*F88k_~)d1vjV^u%Nhbx_+z>Avfet(^5nvbOF~LFL;Llj962=V9@UKfG~1|T z9)xUpyJGlIH@z}r`CEg#5O1*)nY#-k)oor)0|@qt3W?WJhIQGx&?Va$amznong1fnX9hX+NDnizhPMvnFBk2{k?ioQ(@mO zozHu3@#}|*66e;pIbCq_Yrk=VATTS3P@u3eF<#SaUg-Ef8 z1DHgKLmak?hbeSfvJ69ON&{L02KLU(TR;W6pL9~`X?hbeuEj_}CY#sp23|fAk~YDd zQXGO?9aL=lM&7T$MtSn%v5~J@_9L&I-4zhmTOXCCSni1gO+KVt%uM(+r$92y5#%aV zgQD9(TzW0P5Bqrf)T2Q)O5odUzxO{~##jfuPNpLG?ld~0JOxg%;V86KOQeu*HnX^h zjfn8{a8Kny1ecBaZy`;yp2s_NKu(5oEcVpxBLJ+^0^3+)Ad%B5jK*DAh|||nH7ek3 zgWszKa-&V%t&#$yP~QbDejEe-092lTScS7OCXN23$cA-z2!blhmLZbK;~0X~Ww~x2 zHa7#@3c#Msb7TwF!zj{I9|2v#WUm`PH>ucz%0OCSP`&t6O?*O|z)>|kUo{WWu(jl3 zX38gZfQ=~{f?zV*&gasf16vpC?k#`VeZDH+OG~!c%_B~u&lZ3+#buAiY8{uRpODz- zpJaWQ5hbmryCZ&-oN^{M(@(sr(#MhM4%iN`biL+slCOiP1Md>_vVaih%bN_W{#ozS zQkh0b`YSsxD{N$fGOv^sF?PQm2BRH;@=i%aPA6F+(16e-?o3AOLrE-H zWGX*ZPNETw!q=XR;idpxmR}$S2Ji@$+8cL12I4jfqNjJyib1}G3&^rxVBq#NIk;@= z-f6xrdXb`N2J)Bv^0taQpg04Az1s0UEGJ!8ft&+em&2^bMr@aJPYG3o#1ExV?Qd{!bRuA9Wr3pmKl+}Lk%QrXWiBjhY}#OtBYK~xJ|12RdAutuFLxuLU1;}@ z13~Jo!Nm>D0jm~}k`kHUBGvxzmSza43uPR~VUa`d>;ER-nMyA_Dm*Dn4`GfBxD)da zq?|k+Lnsb0q#Q6(je;V=MF}KGGjP`G$Q9YKUDn-h+=k#{Ati3{O}T^p{6_;DM+q?K ziUN(iMv#YIkqYJg6CR()*tceR4fr|7$lPRz;bwyR{)7_8fr<|ii25ShMz#sd>_$Kf zV}OX0rP7PX4PaJU%@|<}%!^=(jL6$DnH+WRBr@p15Yd8B1Q^oC1B60q?0YZ;1+U8u z)$;>0q^I3ckPRd@;4_p6B9jH*Y6|}lOzOcYhwuD z1qP@KvARoTgQ^Cc6UIvv#r|~*fO3!|gWL+te@v3lO_lzm9vq2S8-Zp@0)avZlIs6V zKs8j?s){}ke-{}6fv!eB)+XXL4E0m7w{IgN-_O4;G)|34OD-n_M~1xh7b>Qrm{ZOX zP*g?-+-~;Vf?j>*+$&w$UO-n_>Q16LP6|>+8AUoAuqRRs<;gvy0BZ0KbAkpadCy%0 zB^)CSgB)QjE&f}V=l3Jt8G##IW1K-^U2^V!s|uF7z8>`rGSC~>y;v-Es(dw zzgaANa_DTxB3>HwP19hnB1+RnK z+vumU7eDR4U2HP`K5RdISs08ijytgY1l1MX4PJTK_jY8)l(Ow+{mmmp>bp(0U@ZLCbR)X~yfVq>POQGIz(e<*poxX^vN>5Rqa+c?4^ zNW~wCJQ~uOE#1ZEckbv(XkE4%Hc4AAHCQH<_4Sk1eFK3jMNaOr+5^j;?;gs>uLC5NJkaE()gOTo}QF(c0QX|WV_zQ_6OD>s}eC$#KWCNMR-l%*Ul98;vu3HR0 zZWFnPPcY~la%ZVaW2$ynDvw~XtHaAYqcw3?^|+$)pX%Y}c-b4MA6ervl6u;c%krf| zkB*jXO0&cAU*GhttytfjADapqq(8Yy08c$wbar$A$I)8Nn@G0HKox3DJ}ZT;SM#l- z)6_LHu$yBm#Gdj*navfXMkw5g!qoLQwr^*z-})>+`|mdPy`Lw*$2{rUv%bHlWL@Ze zyqs_X*nU1DVfQ9HjvuX{*tM0(^)(rrl@lRk+iV3Q7gi##z(^Go^@z3^a$?PGSxciI zW}mk7sglFx?FVLbtrpNOqe!}AtK^@os2hj7XCF@8ZEuhKK3b{~Kx$|M6KEjYNcbcq z3G$rk-spRk!!wW3sxfj&@sEGmHCyQSGw4SAaaMxY++^TBYLnAv?w980=OoSK?w6NV z%Fm6-j}s~r%u3g1QI4`SCwLmy69kL-%(%WP!qKrfu@mN3(Rx#}m4C7Y7wQum4(htW zmr@5+q&Qr|Hh=sA!8}qx3pX3}#>mxgCAuN8KQ~ZuYpBSPv%`#NPO*SUE4Ph6>LDof z{pEdx!HPIbg(ejm;V62a%392_s5|QR#@|nKMe>&~1kcbBaXH-V;Z#2M4IOl{oD<+Y z?3XS*mh3&>&yjz4H&q{UYDb)EYDZuttp{=k{pS`m?f9+Ln%YT2D?k`yyb`spb%U=} zD&Z&bGekLV9|u2zv*~QGaXP5+ge~LxpgxWA`+iI`&O*;R$z` z^c?ZY3;D;iEw1|zdHM`^+2D_qm(nP}YdRUreNr=X z+pB(*i;-~Cr8<}V2s50>=pO7m4(Bp|kxTq(-Xd$>Drx3yeK=U6H7{|IP~6IsfTc0n z_Mj%9-)M_$l~;Rds1oPa8FHJ8=nzRvs43zr(05Abu)}BG$Ic4}?HJFUFNy+^d(R8s z1(5C|nKY#*2;m6f)iZOWR~nKG&z(PA(J0|Hb7N;_NI(sh#E~;|=Huj`SE`;HU$76s zvc^oJ1+Uk6`9u_CKu2cZ0N9Zt^rJoIH5;JSjGL-m9*Xm#MT|4&WWnxaonOOI!{eAW0E? zf6y0>H3MuLQ+dV$B-drQi=7y@Gp1cS^obs7AyUKWonohS^n11V$%2q*#yh+ zar+C9yA9Uuc5(fsvN00B87fFm)Dp9*MSv(!7&8T|Qu?UESzt11$gWO`KizP`ao;?3K6G>Tb?Mr~_eEr3iEq(@-VTCl={U zj@>%TqiV+|5AVKZX-63`GWY-!-w_e2TP>7({d7;puZpwl=+oa?l*g=!hp>ou73=q= zHANSOx5Ur6s4q63u+QtyBgRLqbYM>M7zw0%vq+%ci}2aI^#&tv}h;8PFcq0{XSUI~I|>H2`R1ap4n z;3_}gE)Z?Ht*SzFEo|>E+~V)dD6_@GK5;5w8+o2mVr;*dr>uyXLyS*0)yR@_7ASg3SbJ z`X}aueFJUT+{b82iiGTQjq2rUyb{ku4Pu7W7X`7i~by6br+mrTek@f+Z zL}clB?AR+J1POD7XVzEl&72>0Az=UfA%a303W2i4LpoPF8~MHu`oVSts2M=pZ+B|8 zK>JFD9_7JQO?%riIND|Si;?AUZmG}G9pmp$bu2NBd&Y+oEK`QW(DC1Hh5hv`Ydkf5 zTh&H1;&vBOjEly%=n?k61O*IicQ(2GL2ljhytJrA)R>){3*E)&>Om4W#UjiJt*4nM z?1RS{=JlaX)nh~N#D#jOZfC%UV688!tNXgU?QNjz!vmWPS{s~4)8ifA?u>M-M>a3C zcDIH;Rd1)m&G0F!i{)wKk*#AjVAi{9(9AKO)9u0tX`4y%ff7hUfclQ6!I8RpQ;4Aj z-gbIb<8}3m>$I9=u3|@NmT8DOZzdr&So!cQ#Uhbg0YXhv0IY$$bTW+#Qf})I6&xW0 z2Oo)YA8|zGb#YSaLJz`fLB~pYoYoO=P9#_YU0c3eb9`3U0bB&i@}5KXZA8pT)(eRz z7%f>(Jj!W_Nc9_d_S@I~7v6QLz6o~9nDGLa0sU`B7Cuf77z;WJN*Z?Q-eJ=WNPwX#-W4Cj zxq;118aQ`j*wXFFYUf>&cON)$^r`~*K(C?rr}VR{Tyj_EXRb#@a1;pyc=Y_v3YG}z zg1<{p7+banpMnKO?+V!JC4r@ax2uC`Bi7Q(yUyN^Umr=fh{dfnbpYpgIGMSmi6SA( z%iT?cBXq!SYK2S@oWg0o-PxxC^bTGA-7Kj4XF~{a=_dq9gH^~#7sUcO`3d9 zKYaZ5uWvk9WbZfaGGq(ptoEd_ED%f-5Sx>TVGeb<^!`%n$Ry68QppMD3|XPlnMRT?*G`UPgU@DY5$>h=~ z#N2=-xm>awzd2NhpuJ%uwmQu6)8NiLg>dnkx!6exi14S;D-5~dxEF6R2#^X@*fahLJBa8d%=0aN+C9{5&jF=7_VXfxTlit%B zlLCcd*>>UAy?RdiaMi`{U~GgT!_?*-5wgcYn4R@Xf50)$8y>hgBXKHq)f3i$>EA}e zit}CA)~pXOxfZ@Oz*?+unVVGqEZ+nu?MrEbyhFo%!i(bMB5q!7+RwwS;Miy6x#)qk z9#DN}(ZhuMV_hUJ79sZI06MYxY%g##73OdF=Cs$ZaO)v)P|AyAicV0qM`o1`n&6+xBq2>qgZ?J(X zviv3m?N&9ozW8R;5LQiM4~TUoeEduVz4=z!a`hdL)(f|EmupzlIs1t1s`_OkfYhQ@ zuaO4z8OiKZ?DM{UzFe=T_}Lb2HWM4%M$~-YoecvCi32N3Hy{LB{zBbCQ;>AJEAmRs z-$V8W-Qb?u`fbFg=u9X7{rLgKIfXv?4V()@1pD7q)_+O1m|0lk9>@RHXMdJdl%z%o2Qfq0i zdb9MS(_zBx@A1kH-tI4ZzHZ;|+q>o0=j*P+)wo3Ej2rDhqVWhNvbH>3R{6|eNs^+b zg?d4L)F|UWt+D#K_QQB-2qPx4U`heai%_lIxqAOew$dqR4PZFK$qGa5sS^i}_EPmM z>ViA3QU8eACWuS5N|MF%0-9a!ZufGxXyQ2`#+Z_|bd^01*#|v!7(QkT`z5$|Uvufr zBIeNk_FB{GpuMB$GA9!>EjF#G4Ys|xwK_{>Ix2C<#sBSN;np649={irLICWSB8a0F z3*ukNaU9{)4qQ9uAQLZ0dYwku({M+E>%!$&Czw@JQ~|D&$sjHkl19(KCut#R1}!Ql zSfX?86|pvxvU?qebJ%^EGY-g>wbyU*k%k};4E%Gabkx18e%-Y0(R||UKbIgm?To}CLLrAXVMK!O>QyuJ&&jVw9H;_!KdC->b91~GB&sW!tnLdYcE{{Aw>h9 z`X~A%jelg`ja|%2A)^QMQ%@Qt^4m!Uu57dTOeTp-VRi&8zHQtpm6^AmdcJQI?gW6C zz7?7+^>V+{v=glJ_e6s^165LH#{!<2SVKO~FyIVhmER+OZViFleH}YTHy_-1E$LkZ zRKpvSy1Bl5aS@~SVtmM^AjHAVk1z_BIT}fyib_xsa`eT!EQe-;z}Ista84(s5_Haq~kIh1^KW$pOjhP zXcokr$gleD?tQ_MsiX@KSenwPo<%(uP$u|FWo1 zeuVdxx1o6(w>9QF%m!q)dK*o-%Q<@-K7VH^TuVst(r<|spKX5#lXGt<0XrVUpU-7p ziDo?K|th%%aj*Bjz5!JJb*23oWw|K zwEtl|x<;K%mXMCA!Yt|%ZleP}L++nO+u5ueOpe?8;%F7ETEKO4Oq4geU?UJDMX$D_ zNF2V@Ax^*NCrS@<20AdK5eIu`NCHdkj@IUHoNYpSGM99PBjk_Lo5lc2m#{aeFRRxX zMGXY`YNZfqD1X>{eJn}`$_FR|XH%*Mp&Jnl@SB3roYHS?F2oSaH-=`9))b}^5-lTe zxga{W=|YSTp>#0_f|bv~KvW~hX5H23T?D8!6xK8bIGD&_6UP%(-OUUw^#)KqgN{>$ zHK3a&OiFr#L(Vb-(UyT7mUISGphlL2Cg*|BzNYpcv1joL(!VdF)nyv$R;L;rwU>No zF9M$MFMI-$m_$4Ns&Pm}8LmkFQ^$yW&+!=05{Lxg->@Wfal@1-cUD?mzg3?DklTHn zsEquY0fQh{R~0+QF1QcdPgMe}-)gkD%X3&0Ae9&*4Ff8^9wVSLb2KM_<Z0NcFfl6zp>j!g7We(h{h?_r#!K-_LpSs|Gu1$Cw5EQpIEWm@lNkQu_$RQXZmOan z+w?7j468udBFa;S{)?E6l1dVNEcXS}c|2;XshNQU{f}@+?fR6Y8*y2+LcwxR{-XEG zU`;2Pa=0u0PHjCY9z7#9nk@jj_nBe%pPUxM1XlEDa0|I*&l0;SM+|L&0K}=K!)3|{ z@e?$@Y$?c-k~x~jzm0t~N{V@3kUe4TrKc30(Y-cfFLHiiMItDdeQpPPhSOa{NHa%p z6NFiErmAECQK<a9bcrq*b#ZYy_N;7H1=KnQ)pL%})1L`?vj*(GERH35@M>)2 z1Gh*?OKSNs*@*tT6J3QM`KZsuvc-<4vEp>VzeMnm5)`YTo+IcU@^KR?Y=hHb{0!9u z#mjPq-J(`U7P5`_^WT1pRT~ww2u@=FvQ@)9`iv`KNDjEQnqfPfv?kuk4vcPN3=;yW=5W<_ z-AaQpP?wLS6`l6u{<$5AvNJH8+;DA_6qDM&K8H=UXHMAw?PKmh6ZUE0)*5Uk zg$(5DH{`@>fg1?$uf=|32pTE+X>Pn-f9n;C96N#-xQCCrT`1-q?QA&;VvTazzj4_AU^XIP%f_}JKSa%-5R|oI6A>M|A7I?=R=Gcs7v;L4?Ora9Y z2&k6tH-WBIy9~yVRtDT{NmSvD@oS~c?R#JJ6#K_48msW~ zIitC0Wj_0oof|%lx`ZlsQNE4znrtRqVOK^*S>b{2dgj;fIR8a*G5t4Vi;?AjH@4KJ zVtE)aV$?;}oGmk>@Hi9)w4dRL2jJA%bn z3MbBe$ZZ(@O`dM@CtW-`Nu8qgY;xfiGH`a2`^SOJLHpHt+r{OKoGzWC~%%O6Q zC3?yO+xf>d(r*QHZCTL9GN+I;-}3jPCsN~)fcr}RzPkBKvpe-;FPYi#V1i&c!Qhj; zkH9~lC)7)i-5$jcM}AsY(ZT6<7KAjbv|8!NBsLY;-OvlzK6&g8t#=|gF-T`wkc3?k zQr<=)J4QXV%1``((o3&FW4+qHb48*k{LrUOqdDIL`gAMxx7uRrMYL1xh|(buSF#vI-5^HvGe*3-gWl2AyXDB>&cm?mX=n_HeXhm*xwTR`f| zHHf4bB2VhNeq0lzoaR3)=$a{_ILn>iS)P*+Vlf;QvUnwAq1wCoun;%Z*mOH-IY)zp zUf!MkiN?{ZQSGrRZAqz4V=aEaKW(=qeH%~BQZjwGh~QYT=g_)NxR%O^;n41C;G#DB z2Z3L)fgBkY?YepWqnpJ(EC#2)Ovf#A(@m|Bbp$lM!m6gqOc`j~vYGbS8MUv7R?4O& z90`RAqaWmQ*rg+_nEAK3GEEoH!DB+`tB&qfMheBr=HXQgMWvf97VGO$taAr=ZFcEC zgxFuoq5F;05Ktuv(pZ6N8fU-mRi>>YF}~A1O^KAU+RP4LHy=J1-1`{!1D`Ed`P=8l z)Yre-ZHH2tZF;HTRh1SI`7D=kip;;};!zNfLMKWm1T(Hv26$e8p{%smAFNmfb*0ue z-y48hksdAav6@SwPvMBH_bT2}Ka}f(ONUQ9EL)c}h8h%OG4Un9Am)xy#~US4fFw`F z#vcVI4O&BE{R5wp9Ha4iG8xpWy0;vs8J33x6QqTK-`D3V$Fgyit>JK`e|gbF>Ej5x z5r)hunS3DLh*$vaJc21beqcfCPWbaA>rhn+XF!Hz&3q^FZ-sk7tRXaJ(LVU)^f|rD zd!$O9Ao%{Hy1S!C6$y3;H%tpR(5yOHe?*9*zY~-^#ZvWsR5*Xrb2ZUA%Di)HHWp8_ zsb#iQgr+B8e8tNm2d##M@6XfWoU?>ydyTvVIpCw(&~zHgf8g75reGzc{OnW65wr(A zvvfYl(`*#~#ik@KsR*&V^tahHv-27WX~e**hWlcqPw5m#-QPCUmI6MtRlR+*0AVu; zFMZeb-y#;B`p~>?MM)*1m{(cthdMeYI=LFHV?&+DiOWhG4iQe}#XSxU-p(we-Li*N zp-qf{Ux{SPbB#!xt%mP`u$MAGKvk%$n&tJ19!Ry9i$yp_3LPCR)5Uw4ONCZ%&!AOv zwz(9RAG&aA20qC(@$ZYCZ89M{osDk>HhkK>KjUMt94aR~V$}URNdrTWb<;rv zYx$~Ur2a1gCYp*oTsti^H_L6ZP8&1cSagd-YD@27cj#a9b~LuKwXRh#zsrr}Hoe@dSuh2w&-#?RpSsNg<^Lo{8sQ#I#?= zt3X#V@4q7rCxnzM&}`p+nk>n)5;EoHwSeX8HWf{t(=5xiheu4;`_n5)rovocnj|zM zd1PHa<*^q@x^4z7>tCpwW=aCsiyCQ!WmO(AL`n=0Ae zA|iRRjDtDOwp8E3@;cbYfI($2SSzd>z*lD*9MbRkQ{|y|o;oFpK9xW-YN`zoXi$te zY<-v9uU1(V4L^Ct8de_)ohiGDi?4YShenwVf=4sI2R9cY+eO{%rPx0NFjeGyVLK3v zkB%QJV4Gv-Yl7&W$1xH) zOq;;$M7Z(c>ikmbo^4EO) zKz^ZQB15MLl|aC1?WX@1W9T2geq2(S}q(fya zXBN;48^OmMS}lXaNnA^yp`|QAbVPZT4l3FPofna&^16-td_Xi`U`+iN@`v5)4(hnx zQH=)1f71~EZPbOGo$G%M$9`rG|8qd}GjkXy*gX=^xb>VsC*LEJxC9_eW#`TVvxXZ<`++SAkoTR3lOW19Cs^04{--YuCaIEF;(c=O zVjMfj0;e{NT9y?xKA&k<@%Q-UDns|IIk?{!k^)Hrr)P~+b393(;tz~G^>rA{yfd6c z3_TLrQ1(z~^K*mQ?KuhARu*iI19^K@H;FJYXsQ8@SZI3gQ)_)!S62Fu-Aoag+?n-Q zKX&C_bHl{t$a?ECRE=d_<&Z1Z?D>_(3Dw0l7F8qJc4MGxl*1#@tZ`dU)i%yG<#NS| zI6Uk!M{Y=b63|?SxU1snCAZhq%-)q9QZH9N6oDZ zXd;*7!XU`dB=x5yYxh9o5iF>s50W~AFJt&B>*1qO63naUn#%k;21zG-zqKDwBz6A* zS4C9#>b9O15=czx_&Tin7Dudk$P#}$ewXq~%ch)FsHt(dS=6o>W7_WB&GEfQ;xP14 zH>KS9-5VaJ>_JienJ0aHo41+;`Ak_FbPZNus(M3SABX9<$~iOa~n_&&`>V@Rw(qLrMWQzp2*h-V!P6U8l>v%W}yS zd4-HMY@gQmu${YX=Bs59*PM2iB?~lwm!?BS`M7Pz9rrO7-A>LSi!7wgroHh$ni1Vk z_sOau+rz!uGrnEiW)bdfU*1E|106U!h@B80VDSvnDRWdcB8Bbt|E;Qt9U-TB9ufL_ zK2J@9G1@*iHZN3`Dws_ssemr8i&r0K>ve;bXn?~og;lMp!~qp~x$HOMORmDW1x4nRoC%xLVCEF;_H5wgdeWS51Qv zls}uf^ehu)kkFC^ZUJSL+W}P>otOE#Y`A5TyE^Z9;WY#u+@(KX_i6WX31aP(^QMMg z$L10fP`AsrJ+uBdo}|Ow5_l(6O5<~}`hb?=ZTrM(`%KJ{G#Q}5yR>Cy0sLlH*Tyf_ zDz;lxvF*Fym?l&$K--WN=rlrrk&k*>I?4Qqynwg@*GEq%I_J>CkPm6@xiFq>2YaD$ zvbEvr^)rS*XZbh< zZN7w^eZPa8k5FJBNyUL}r8+1Jd(2?_b%?3p&L1INJ(+hlOFbOyOfSi(js~{5`j=kF#)xH?DH(mt*3Mndyj!u=~XA`e}{ylN(H<&=ZBOYhi z=2+^=1`Bl>wQX7a!bAl(AEk2sBv+6pbGnz*=OhAcgE#fZTpdL&*?z820nIKdwx7HU zo9vW}SA5NxtvrJEAn!u!+$)Rin-qXMI7{&d@KG~E+gKHHZT}RFIWE)n8?3|}`Z!Dh7TmeG|dO?D-F=%<&r>Og{=bZzwkRFO7k8}>hNzCkO3K0y;FzK`hLBb z*40Sm-B}CNwTRlby1Bu-_H9$CTV#iIz{}LAtlvjR^&7bxknY3T5mE$4kmpOD=i0Lb zfHR^^3V?i{5jUp`j})TAJ3H1IPKTk)|F!!B2F62)j|*RPEoa>c9^PxENU6P$zHmx5 zLRXJrNsc>HE(!dAW2=_$7dhpEj)aGWy+FSRh$Vlb(BiNiYl3sV0u~_h4DUT|f(>UH zO^56|(JuB&S7IL3!!jD)~XXhe#^UiS>P3;oLZ!7#@HG5d!47wsU{6 zZt{CiJ0G_6g72c9c3~N&$Fku6ympgq0P?|3GNnT3X9XOpFtTfVR`#Yw=EkwfW7M1u zNL+~=o=^iG0cYX)On(KOP+Q;BBT3?@3QS*{74kdZZY=wFxQD70(5IK%ctTsyHIbN9 z-|M_Vcy8RDkZJiJ|0>$7 zLnf=I`5l|T?8^lolqJ_I;*I(e6xaA1dDnI??*11~7%r*v?I{c))&s*D;yd|eegs2l>J^PUe9yGT1Xj6;xE-<8_2(>=BbeVPBj!G2mc5CiU zTu0k=toJM|TdG{YjKkAIXk1p4=E%E-^EFybM&hy0B; z@GAm#X1&ehcPf2{PP8CPB5AdDWhUbhSHD4Vgj)W~IUPIm|B284|9Ctb*Z+L}KB=Mc z9|z1gS5HV^kIHD_DpAHW0NfPPl|3Nd_!7Ft9~G-%A%mDUo>|O;_w`Y05fU++n_@{s zci_sjzN)JHt6a43J?yuD_UHT6*&!}D$&f?|TI>}@{82mxwq#+u#{+TK=k#Q?TlKa~ zNg!n{S>j(=_m8jTp!(?5t7%YuC1|iuGuoY6WHXkjSRg&5!mGV`xVzE)sl%(-EigvQ>bF@W? z?Qs)&ZVBp)Z(?uopbEGQG%(18k;)T|9A~IziLB1RSBtrc!nZB{K<}TGSxUr5sJ045 z_9jNpUWA9A@4k}}|D7mU6OBYo00x&;tc;aPzLIQ^lQNJ{as?j$IhZS4VjYu6@vqRI zkQZ`?`BP*+hs0AE0q20k^KoY^-2jn#oOBBO)jkozHv-guss5asmEd^&r7WklWO z?r?ug%y2B_bcvzcZr#~yp7Cc zqNgt6Rlg-f9^N@FX9`f+a+bc#qgvMLR;6>@qH8*w$e6su8-t~g&ytT1lpzX|@N2PJ zDcUcmqP#JehPRMb@N$0&FLLl-S8S$(Ur$R0+CDOZFhD}YmKmaDHiVv(C|~PnvpBo_ zx4IOnAGmnC89azshUDlXhvQdQkg3tNnMP#mzMS6Yi#$Moe|R^l1)6p)>S5*Hyp}eE zG9%=~SKj)RQ3}Zl==fE}sdq1ZSF@_23wby+0viUo>A5!D-RZ;gJEb&kX-=o^e9e0> zk^QQJ2VJOmhymkuuF`JebFBKXH;r5OVBG{Y3he9jA2o5a68l4?Mx)LYegyPckLd8z zz#3-F&B4&U<-3K&kPkIEw$Z0K-l9fAaET6Q^v1SQ3RFupOOIe2cJLKr+>0#SPhooB zf*2#x+}y>F#DE?G28G9(E`OZYz@kz>Df-|=hKp6FL2v*@3_zm@+<)DJ3mWRgt7T10 zkk7#9Xe`1ma`Ht^CXY(r16X%fG!%%IRzmV)Op3@U#V~&Q*<7a7@Og!9AB5rcbb&mRl5!KPikrpXGqE0xO`wjmWC8*sZI z&2Q$!o|-m}A{XvpttK7)(v9NW%mC0VKvio5uvMn3UByq%b31)69u$1V2=fl&%qbj ztOwq^m|IT827@p2u-xNy$f4KsB0>rPj!IM8p94J*S=1A*x58&4TB99VSCb&AXM%*! z6>7hL>aQpL8Q|YsGRCWX%p7k_3MNk8B=Ya(((ysSTDelV2!afLCE-U2D_zXffZa1c&KoQ;d)OvEt3Qt>bMs0c|nD z3kspR0J|1TNk{DMMmEKOS5f)3@ZhG4aaKb$?uP!$mhTnYK#s!3=#zB_$|Eg)tBXbg z>%btHt~*lBL#FS5a)mOCkL|3Z7!BcvX%I?uX5(7F#TAb8F6Z4}sr(^)Q5YUC!aa+b zhiPeeBn*ecgVMBVXEYi`&ymeZlTY@XK-+DO%KFnF{jGL>+s_LPE~Iz>Zlms*f?(HO zOxqf!TQnf%)xKtf#r9imnrUpz=FFkV7&Jo-VeVwaB?D}<%}aX311g}AL&uRG*@*YL z^61VbMN_v}RgtI~R<1*~Kh61i?&wa>FWkUAISi4l(@=4PWgFC6n(r(}??{}EQ;0#b zmT4E5aqK8N(e0e}kI4Hf^2ew*C2QWD&63Wg07H>j@Pz&bW>+zjqR+8{;(HorMihtyMUihWGxqgj9>JT% zHG-^&=EDuay@VaEVjJR~wLVjh4VAW1o{y=~&jOpQ-J6?JCvdScQ%Y3)b4u>eRQbkE zKl{A{_8QR4^jn&Z%((^sj84wTHcbzSqQ**E$hGEE9mS(Wl9(o3B{{PmV(~EZRN+#q z{gNd`PV>d#j`7RllhM~EI0O;cO3l}5&3S4&Zf$RG|DI6f=8w&_j^8xXvU(wMP? zMzyF08>JMI?}8y>&#y6n#VHF!;1v9xpqGR3?Iu}>;hN7$-`E7BI)8HmUa{(E0rX68 z>(Pe3mU%{B29H+_G^R#W3SKly<(u0TkWnC6?(l{o4nIyB2s#h6{RW|5M43+5J}vWH zR9=@)vh(Gy*X+w*2s3yv8IcXuaTro__iJjY`gm(U%l-dUGsZY zP*^K56RsiMxs1j}>u-xy@_nV(s|z8~_La1Gd@qDVfTHrlzfY>=#Gl$jWXwjQLgjqU z7{?7!SpKQOxhGyl_Q22%w!>lbQ4-0z4Mq#7_1jEyH8cwv_@qTda-VFkSuwNET34^| zq+Zb!AIAMq`-WqQy0N9~lTGxSFNFQB{?wg-_RtWot&0ZQk}lus4=<(Vo3mCv>TQHu z9niSDHwHGLBL3OVw>q}Rd3C2VySbs0yOgcJ>_>I{D| zzVY=36vN~fhnqD?y1*yUJ;74a&1}1@FA0A`t7A1O`E}#K#h5Y?N12-x>LADOKaKx&G74)7h2MO-hEn3DwJY>$+)F5s6612gX8HtzQ-If zZhx;sJ>3yhv0>+W?Ni419(BXkycpT}lvm)x&%E7C(EH4PZl&?b@9p$u^}l$g%v}HX zNCy)a$N#K4H~-Uo%#QXm12|KtJwSV%q-rh5!Kwu?Y;NiCw}ryfvTfjYr5N3;)9a4K zluQxfx!o(}3ojUPLYR);Hk&^%5>B+6?#jvP?2!NeD7QKZIJu}1$rS0MQNTmyweB~o z$NjiDZHp{9c69X7>7ksR?<31KrQLRCc88A>*PGAX=Qylw6S-tD^fWmdmxA`1m>Fx? z&>8K|wDsT3GlzC>S}dkNuQCZ#1s(QKo0{}aBx#l=Jdyt%I1=jxrm;#a`cO)UB*{We zgQe0ZY^V7@WD~i%d~)SU?r2}fD?4O<^yaX6x^~VdUdK;;gFc>8YoeG5G=&Qq zFGj#z<*BCtP?ux_l9b)!^qxb%5K6%{%C=lJRz}3zPs~gP4pTN>UE$cMPMXwv+O+Cs*=$lok z=5pVIB5=F+$Tjvm^JgofT82|lts`3(AM?_x-gme3W8Hj0Ux(69mv&4Ad1`(G%~wB? z6G{^!H?mlX-L=#JF=p(ePmO1CHAR1WY*-qpe>Ss~0z3F209%yA5t=dLA>L!1)|Av% zn_*Am4cb-8vSZWr#-qrXTPNkdu6F$D^TKmCSF6)piWkl>)aJQ>pG=yBjH%GEh2)w& zf8PVVB5Y}jv*dIB4`J=XGl90MVjmDE6!tF>BFuA`ii=Zwjj3_ZroZQgwt69Irq?ru zM|-E8wy;%iSTxtEcGC%nw(&%(M6_|yzc>?_eQ*b)kL@uIh;EImlsKm>9BlCDpMHng z!~C=J*?+1El=_y2ZFji>tL)&6qj6FqB+D`)OqK9;I^}s6*HgN{uJ}&0*z=ZdZ{Rx_}cIg$$Gx zu%1y+9$zb*hs5#oi-q0~@oRH#3S!T`bg%x*DAUGs0@}j&-v<(QbOR!O16B7S5HVn6 z$gpUoJ(6o)em0_qUZ%m*cBv%wgvu);aKLwi2>4JFE~>8Fq>;0O&5bWBGQ48=*P#7k zM{M>XrNavE$Y!0XD%M^?|ErzFkaC$S%ez#!aKj&X#ThaqACzl#xl8m@s`W0WVeCAO zy(oqlf{SG&n{cb!3sVW&%_`$jCO>GpM_s~^lJOrl==*_i6PoDr*n4BswScT3=d3gk z94v|a93*2BjI${u`14yDb4xc1Wu!?!&f;_P^0^6Dq&-qklXQJz*^%&W%)H2=QcdW4 z+dm^;R>7f;b8L=5luFEl{w?Gb6G|PaQ5p@;F#4WEscAiOferUG)dh*TCReiO`5-FN zic{GxFLo00fT8mLKE({{o&n9nb7)S!*<+5$m?fcByOx)XU~ztjQj8K%?w)qp|fa1wjmEj1%Gr!=8X2 zm6jvhgG-lR6e?j>hrBsNC;lV}4B!twW888giXGWe-l!+I4}0ojn;zs1WZw8i8NjQG zX6NUkE^Rj1M)RGHfIP57kHFtc2u|q2iqFL+nm@Y=v#&ulF)E_~us(5X-|_#_%=m20 z!t^a@@?O3RKAn@Z&Txbd)eWwp$4l%Xdb5JSgtB5UE8!d7gpl?{b%&YFaJ%(l*R2zj z&Y1tOwl#4eeHOKcY|V3}w&o4-MUok=41J3gqQ@-ME@?j@{{S|uKke1X2~7wYU9dZ}>j^kasBtyQT_P&==*C0CPO-o zBT6k9Ei%zaonb98cVw1%-V(4%@T@x4nT0t2VNx0AkWApoXp$lZp!(hvSXc$G%jUiy z+a70Y|9M=Jq)(^S{Jz{ei=;;riM~jM45oyZ7>4%T9VNm!@5Eo0EO@?Uep%CkwJYnV z@$t6-7mT@}(M$}aq6LZnuA$S@l@A*2ZnK(@sCz*Wk5nr(7&2{u2C{bU=d_0>SxjIr zt1K-81aIYnoW`a=8*Ou-F}m77a=%!_f>-qU)BWr$Jxlzm;9e$g&7 zF1{E?44g{T3|LYm=WMO-#0*tjf&?d5!$aJ8Sn(<)`UN1*Yr+i$gmka-nOhg__t{~q z+WbGa_hM*j>;;XQH{2ga9=i0lO!ZBo&`7tol@FOO;Fti%hW0O&gak=?Lq1qt8U(2! z6nW(nuyv*Z*9^a1r>s+~#1QEP0 z_uACJdYQNHa^I^XkJagU$M8f`H=d(Y1BUzo1-GdlIs@ObFYsVR)g~HF4JDm2nU18pp9Q7$WzO!{4SRvwGyb*@7nKSnk1oR7mI(+x!DY} zVPIE4^=vW-|E^V?(~1x}0{0P(mBeKQ+f%YF>6XtpuGvg{+fTg|zKVfXGz@BJnn_qE zzp#djr5%ZRYB`U`*ecjGdBn@Cd+&1)?(y$-zJ6<(R&-2s966y}em*>+yapLVO&F%K zZNIDxM~NyU1neHAj#r$oX6D-J=5~8J9ioa_fCkiz{tSlWB)ZK`>3@7 z-RXebP40Jr;{|?Z2y`?!sA{01LFIEp(&3FqxX`b&s>3lmbrtTniD#I@sGW^d;iR9~ zaxn$Owm3IW?J5DRKJdhvG-_&K3M+#2Q<^!eluCmmUnVYp7^%YDG`j5I4xOOoq7#M& z8E?>vADA2MEaN2jyIum*8R_(8(+g4Hwyhs5+l;zt9b{vfXF5TJ)0Y;I3F#}M&>sZ^ zJ7i}n+P#V&%4_2pFDn^F@3l3iUN{tkT>=6nCCEdmrqTKbc*R?Noi;Sr#Dubq2US~4 z#Gp}6O`c^6w1ixXdYca0?|j88pe%EaBJ%;3JM}Z zCR)rDV%B;O1PUdH?VXYqDneldVRf~N;k!SjD@7mPZa7b3XG;GNn7pj`o@8{m0n+e; zbMz?Y`{fU~1zb?Pg!oMEW4{e2Qh5z=fU23aUQQFYU*FMs+7Im*qaOrOTQ-V=V9f8_e~M zEGxrR3uS~*;Vy=B8L4ISr*yB0LVRGX=!|8BwIQYKUxhi9J~fxHCcwK^+GUKuMzaMB z7?HOHg8AB8nj5uT!9P>8{NvNnp4bQ%d}elSj#$~J>K+8p)hq&+o2(#s6q>uxg=v}o=1Dqk4`pEsT=EQ-Y z8is#+1h*p0EG3YoYeb<59V>j=mY#rp%V69Zp9p$={KMrFusvN z!L@?zS=r6*g7aS#8P1wDQCQ*X{o$|?SxCLY+)6?qdsi#5>+Izqs0DK<_Y&8=@KYJji{|cTkZB{pysb52f%0PF1d(?>;jP`KB z0;&*M{h}kSqCJwoo`R-W$T-y#{+717%s2Y{QsMH`7bsGGuMx~@&7*m zX`ZrnHgP0k_-$?AY$9r6WM^yw!_N=nGLgR+^1QRa5`dye|tjQYW5Zmf-!CBQl0!!c^yCQTt97Q7|Ha=*QbJ`h*b+ zYj-;zt)}zs=yv~wssxLJ^t)Jn!v+&r3rts#w;01MbFf-UsBeAy%GdW>l9?wRDOeFY z{X|rc-|qvlr0vz+?fx=UxS=@@mInKldij-U#ICdb^^wD_HUJ>Nz}qL%_>!M^g^^&N zt=0D8crQmda^XPmVzMM6I2a9uv9N~$L-0W+a$1ppqC0em zuU{$P{c`q{t53<%B&T=rPmfM@gx#8!s}%*D8kPlwixknN<` zAZgzQ2MWjx1Ks49RKb4=$OEBvac6DBXq73&uofQWOFi|avyR`rAHh85$h=q`hK!L` z2*($F+t)VdOgh$&8B~1VtrN3o;hqnblr!X$hAHBDao=eakE30BGt21_HV;v|D!h$I zOF)cBqnOzH%2+){3VFkcy{NM2XVIbxs3TU2I4k%&Z0`MAk5ssZda(Y~fxs#94VCnb z{NP2**!t0Rd)e~`at;K3-IZep1g!3%roK!ZZNgY9YH~6@jK&u8)%omjdF(nI-^v`~ zXFA5{D8++Y!35Hmlan}SL5r-2aN=0>n>Pcirr;)pvQ#*<=@jQsk!0L#&QjFj)vdd& zL!}mRoNn-FY){A6Q&pyDUzN)FnPV&5~=VS^3Le7V9?+3oFN-A4OZs2Vc(Iu_p{WERyBU7^G% zU0@B?{B_H<7G0zpym%T-?6^@5x~-K22!@5^+wgYw5>(huLDSF@nlj$;MFO*DdXoW2=ocW*S;?~)&N3_^3xsykEVXCs0e zrFJma*#35&LWLHByv-~i-On!s!RJ>z8hrAoeijen(88=(R_p@Fb#vz|wZ*Yd(O&yt6 zQln2ykxlS`^iGKJ;8e*C(PY>g7ZiGXJZO$16gm#oREMiLE8oc$24=Bkdzp?9aLh*`7;y(ajmah zZ>5|&gI9_J(Mq35x0oxmP8Wm>){%$CS-UN!(z20h72FR$F==PyxgxSwqk8h*1NM+ez=rVwd>B{_he+pIz|Cl6xA44DCq9nl&tKWVQ=rhN zgjI>4EXE3{N0X9_iiBYW0Qv-6{r4{2|(Efjxsj^mBY=gxY{KMoK@eKepjw~AKWeX zMt5hj(d{G**NAI&Rex;`GrLX;t>0|b;eElcHuHIOaC|EP3lFh#hoyf@Xc_1)GKHOD zvt)lMSxZcxH2PTfk3dcE9tSyD!t*jkel@=vrKErfmgfWe9YhYzZMtL zW0m&9CNx|Gsxskeur!rtg{K#v7Uzhj{t4|r8zPVMN3h1jpjLV$Ic6RUr8-L&zYym0 zOwi%a1l^`POYjj)0Mq<5zn|9g*NV1e-6k6*!A;9-DhmFI=ZM-&V=zQjLKBe3$zt|5 zwOAZS$ebfTi#~2lNhQ{ZHV6t7*R_YSXNuZ*hGD!+8h(V; z=f^n891A7OXr|{SYLS`4@4-vDwAJFs%W8#Bkeqs-*tFo0PfwPRUw;RenCKoSl;#Ff zXr017w-BHZ9^uLB`x+v$D?`f33||Mq#{XEz@eF?`Iq2DmpLUJYISf@0>l#bM@9UO% zyfOt@b~?M)pjVr_S-5t(A+xlz1l9!znQ}3L`MboVDw9q^{i4!fs1}ypapJ!qj3^s* z#(4hUakdEM8hvOtW}^XR5&wz^K3gk}|586XDR9<)6{H%{DL@k2>-plA+1`lF(1{~> zDAQTTRP=RUZA_Bd^@^nt?TLx1#`p%Ww}D`{Kf=IYguO{N6hH?FiCYf($8RuOF)Uqsb+4K@G^z!@J>6&$uofCeOq=RFO>WTTf#>%E2mkDeodIYTNoFfKb z_)=Xz04Z+UcRvYr?3n9fPo*#Q@y_ZAwFc6)tp!I(M-Or)@f~mfq4l=$QE%Tn++H;1 zri=BKe?iK^hvjqh*0Kv+(=P5FmZ8Tq*LS9gx3q@(?tIZzF-@c2&cr_=}8DjtZ z-!OI&TN@yxX=qg=q#~5f0b#q#o1i=7v+|ubR7tO{s$(w&QKKif!eW&(ep6FP6e zIbX`N;Q{#ymEyyl(CZ%P=q-*#&u~-KHuRYPaMEk+anmeC#lycY^(*jgoV|=EcyeJk z)eF@f3Y$`8!f9s&dqrs#GA`@j9j-$WQ}f=Q*4A@-XLSA<+moZt4!oB{G?ACW2oN+% z!3myd^=hC_IW%t=fmDeLp1JchWmgr#L6qchyfe{VRQ#E_l9~s&PLkWgeZ=;DA)1n! z@VC!x`=e9a#zM1v$)?@WQIEe{VUs+h`JGXpx=O)za8p7th!h5-Jz zJg+P32loM-X8jDMFx8ZQMnl+B+>#=fqt_?j6w%>;iLC6i2lu(3FeTD3w6lG7BiKLx z)S~Y$A^%bA>RZ_<%1>D%p9J;p@jn7z1Kq%ySMz7EiuVRkM;5$D+YSGiTX5`z&^(`% z*XP{Y$<_$JhuK#uB#%7LA{C?9<1^=x2GAm&c=8;JCL~O-*iUD6MUn&$$rs-)rSp{lf zZacjt;EPC}QAjq1L2b@@nQW$2`o;HwzZEC7JNgNx*yVqFIT`)88`V|>YEEQkbaIod zC^^Qen1Zu%bb7w~<1&kr^RHj_BzCH5ocX=n+^M32{%1Si{okzRZ%^O*w?)MU1Bb7# zM-Mg^)jbiC3hs?^sVMWKLd=%7$I2|sct$9^J!oosnVr&fxwLgm!S5(aTCVSBXbHK> z(eS;B%MjYY7HJ38*V944b^qar+KajETQO1wug7babL%AHoL)QmsY&8&A~XRr>bG~o zt%)PN%2N;4pwkDdX1?m@b`sK9IHi_O4KfvpQhe+bDJCP?aOPJX($ZQNQI2FOYpv;zk)GhBW13Ap_B4gZurvTEClZ-H3@4gPYDQ@L2XaIdPXDVo2SAFFotfauSoV z=NN2?2ql$FJI*XviBiV#`1i~H_4a+|y7qT)SfA$`b+0%3UlnmkA~&$7!%Ts4(MH`< zAY-0&78v^jEN3RO=+i8;BhJBn~Zchc6vxd_6QniJ%G1Q@4%FtNJ znM5=d6+Z7bub1A<0vX0{p5S@6FjFsVWN1CvZWAL9L1?g&DQJv%@YH{Wd%f$l{A&zf zR;ESDgA|NZ3X8Nx&`?B*4TX_kvMlR`qEP~psC-ft;tk_zEn_fEXC2Z1%~GXmX*rfE zW{{K1WaOa%w0@`T?Kg7f6*6gg9l87RJgK5p)C2>gvSgC{$&c?*QA$AuBUe#v+&GBt z&nTq*X_6StI+5)}&D6JybLLG|E9CzE{3k)c#ip!8(bBa0r=uc~ z$4qM3_xSlIzb<-Gb!!@68O9TEGydH*@>@xYyjK>5tfWTXWkS(ST&Og!28lyE{6~>s z3|zSYWOAH&I*&eK492`$G=csw3n~`|#m0)x$XE%xk%H!$bqSu=LCsb4k0eje6I-{x zrrrjMQbDGea9s%0tv2~~#<@0PLPd!d3Qo@~c&)j;4BoLGdu|xFXFr7yCUVeB7E781?szOO?r`-}@3r-Y zNhUo2MvL;Vk?7@I0e$<&b#yIDEYuOTVd#^j%Tmar6@Qg}!${n3lSH@2#zcBIE#*!< zxN-Xw2LI6WGj9s?t9fsaqzzeCll)A?N*B@C1rp>tx7Y0-hdPdOt}%!>3rx`k#qh9F z+;C+b9UHMp-( zgY9z#oR`Xc${sTeTaVQqMK}CRK3oYg1i*@$JGho;$&3kE{5o|vDFaK6O=+pcf;kR0vyjfc+0I_#>hYMqVFZMOkkhrUu1XV0c2`Uf`n|M+MM1HRR zxscrOIFHHNOe)Ykm6^UA?pQ8rDLppcteoGey<=?-uO=)yeillGMCKTpegV~3F=`f% zz~+$J`aZapza#o$f2)c{h@cqt{d;ib#rO;86GdMMfs$Rgd55T`gc)BxmQe-?198s_ z&OAhZZ>mY`sihW%D&TkY>5|+Jhxqg0?1rX_`R${&?QN+4Z5FojfCg-7yS)g-x|5<_ zg%q7|9toug?bDJNyKf@0pB`}j>_CXP$ch_}E)@>*61dwsdq($E)4}rriz7@lQpKJm zL)uw7+ecV18{buVI~&|3wju7X@GqU={;~9mmu;@3qvdiHRsXGY4@#8J1Td5mt1yyh z;gV!FAI!)cBbB3>=TKqO^+(j_el|HmsBL!#;M?Gzf~(nLw;c5(1H4?1mMB4tg%*Ws z1$J;BA5CuPZ>{zOs#AE|S0&pvRwaw$RT`*Er?~mG@fb!Wle>+p=SA%;??O?=$k+%{ zFvr`Y>m~9;;(#a0pFpBX#U&b}CS3b|Si#HPq6^NKmnf8eIH|5Njg;mL#LWd$^-|RM zYGk8XEd(xi{Kv@ac0{28n#-bh9mJB$sm7tQqP+~iCmjJ-IL!R#IzCw#92jIoCLLv% zZ#eUy9$Yx-yuOPz73#>N|NC$O*_^q0A^li1ZCyyNsQ8uH%?^TTmKtjc6qT(eriqIG zxJQ&4jWg{JHT*YFgM7n8N|Kq)0N)TSKJEgV%DzNJ>Lk=2ofHy5hnm9Mj?be?7-ZCkxkga9(=*CI|MN0twq^Y6;wZ!^qaY@EmOla5D)lg2 z_&o9t&hJQlN1j?~@&EvTmeN>8=rqyKs$*SiO!q(lZazkedv5g%F8n zJcgnhy7ntve23{+>f17Z9BsaoGI`q`nM={P_>1SffOl5H&QI+7h<14+g$z31Dy}&X6H$+uhV#4-{?319+Wjx1aHkIkhJo%#}Bl@Y6a z>T9`ZBJBaK{x8>yKMS>?TeL0-d*N{(ovJEW(#J3uHi#uVgaH^~*pBGZ>0}BD8cowv z7aE-}9+;POK>8MSPX@b-RiyUktc1b)(U?lzq6srhaVJGB(uL4(%MlHb?9$Xp{S0H0 z_lNsZ?}zEPedOwWSXUVE*T~`#T%9CfG*EiRxKtWBT5ieHG` zNm)Lea{RHLMlK7(4InWL+eQNv<7hhggiT4gpendtP9%0{+tJ z)%kwT%#xW|TrPHO>pTR1O)9k=J%8I^c7lOU-$GEzQMb9&5kXf9TxS<1^yCtECMOBcw!25pA_5`Nv&m@%thfC zSbbGxOWRtFbBtRmm9HPb>5-omfZf7#C(A8UKFeF|f{njN9R*tkbz3VJaB2Cg)aF;N zBi>TAbpEh+1Z_F*F8e`--Z`dn#fRT+1p+ME=w?)yFBd>D~THQ^}aIo}IW^RM%@@q(7Ey-y?W~j{kg!Ie|3_&9ePw^$hJ~%|w`ibPq zB8-*km5033B={j}US)~S;j~2opJ1vNncZAw`ZL-X@7+50n6?!N8ME;*Duc-8)FcXO z!mSp2AWPNivh8OsZlO1~F!Z}MV!v;qX}@bu8apIUAMUr<4p|R;pPdi$wC%v-=l%j; zMB7I;&Q|Zt*?OUGP=96kW!@U+)qyEM=cPX|7<%Ki1W*SOod?$x^4KDE1yCy_Z*OO6 zc*nt}2f3_+MD_9)5iXV{k)|2v#>kwYIBzaX9K#6^J z%EqJ?o}r=Z&d7(j&}U3g5V| z&}bl;$;JpT(B$ifcK)I{;Gztsqpzg}ApvA|*5Acb(Gd6JIuB~P7 z(p{;5(_l{ljnUg&n+T0XtwBf8;utx=GOA*L2_Ha9mEYx7!^n+_qZ&xZBi+34GS_eC z88`|EO88xzHNc{v!{L8?TN@*!ZRk>keA<;%yK9IhBWci9`KNmFEP$rgaYGP4EmsEx zE{BEVBG*v;kQt+Q#;HV9g=sKb?_j=Iyu@CL(E#3`E%grr236*Cp$I2rX&#s)jN)Y5 z%;Tkz(+ivGU`qy#I^6pbmE<5mPkr=#zP%neG^>phQgJ@x5+*A}+06)6qFn8~pu#GX z?@z{}NL%8{`uioQ_8STtZ8L5I8`K(5VcGUkR;LxHK#CWACYMX?7QSM5S;Zr*Hto=4 zWsBvau6n}dWW5tj+4WRpI^*Db-R`-yfp0hlB6=j7b_Y%5_44(kzl&5PiY3#e_g?gBejo~SUIX(t=QEjgP;HVftpP|U*GDqrFi7ITbGDtxj*ISrRbxjiqqalzkPQWz}#fW zR?Di1uE$mzO%Zo-n)CfYIIHjc)3HM$E9(<);wU9Hi6QUL*<>9nScVJD7@iB=CLTaA zRnO3tkK|5*W4<8pp6So>8i^;sh*tvG6cFRzOW(wfq z4)O50UJ$|J$;<#!@roF9dtK2|=L?oBS6u!-9$na(|4;QdC)@ug`6Bwiw@v?PY&)zm zA^9Euy&+AEh|F1$*1jyL%rDX5gvn^Du2cenj!h$EgBG=2`xfBkND;~}vL;lTdfN1O z))O$8=|QvHDZJgXYHSySgc8m|g3AU<$4YO5r{9t5(Yyb+tGafDh^jDIW6LkhMB@zq zoC4I{51#s7aCc5AwR+U7>Dk(oV26m<;?gNYhtgjy%$Qo|*G#G73nwG(x@}&M+4k~b zV;W`Nq^{z%N3J}frPBM>VOezPyrAyxQLk7tgyI(~r_fAjhC~Kss@Cc7g|tG+9gCw; zd`XuSFE;G65#UB-;0RR_BCT@FL;|yC1vqWAv@iFB^~ zIyHdm^d1B*P$VFoBb5rvN3iFts>==JmLs?nDRgy59j6*u2TVZrvX(GI;cJKg!C6?N zw!(~d#J4(O_inz{f>~JzfVYdH2H?-RM$p5Rmx%T+g;ul}OB$gRN69cDk6ZEWqwK>N zDp^zO(rox!iqSsTLDHaL&sNy({Wb7zTK-K zRcNf+%W8yXq4&`d_!#NxK8HGGwKiz&TDZ;70xiX|#eIqe6-RxAFx0EVjnvKdsnC#zA!%u8d@VORYyKXsEWqg$2w=q>7F4D2!5^beX%Ut0|f6kgk~ zM^4-wm##e^iV9pf92E?To~o1fSFe@p^e6zTS27H^XI{<7{o8K@IIdYk&oqb#*J%~h z{o6qrbyAi1)0KT(Qtv|CzcOdNc^>1e(Y;F5TP{-Jp0=7SZZB@ZRXq9PwkMHQ^8bp_ zj_CJ9L*k28@xBO}Yld@FpzwMWS#G20s#ZxebVG`e=tsk!`o1nfw;Q1xA?l1`_{`M{ z(^{;EVPzOhu&%B>l-bt#fWP|iJ>B!AOV-xZ=G-n``kuiv+K9Jjl*YV&?7Dt8A30oZ z=f!ple*+zr1m^wM)?xoYw+;&vE7Sj0aZrt==d#~)yV)I-)1?#%j!YyJ)H&L}Xfmwe z{l})#W%7W9ATx-L1MN>jiZ5r**YlOJuu6*6cFAZk#Ex;D!HOdIRxqaLcJ7CpSAC08 z!7#UM3d)xAz&`-G{d$&g$X@eIY^!L--hXL5@@!gpNV7&5v zeRX>L8UvF=pqNa3K#U|Xk(?Ywj0YOe#(_a}a!<+YKA}OAy6>&P8h!?X;gZ5m(FoV2 z+nTfVs(_pslmc>sD?WWrdKgZ;WBqFBanl=cY}THOk^qTv6|$K#Pu<2G?aEg8R=e3L z!8R)w_VJzn3NsoZF6>WC4^S05R-uTIb(kVgX5qnT8J%;^Y%wHJfbiO5*_e`A-4MI{oBri5Cq*cU&sSU zsU4hH0eT^CY*+2|*)dU(KS*hZe{bfO5|51ovDjZ)nwfJM$>&(v*m$Y;M~5Q^Ir1 zT%NZ1+XhV*Ufg>WH^5D*4jR>z$*Lp8S22wrw{IO3?E))h!Wu6uo(Xfn{Nar)&sXqx z5zJ3}Hc(ThK3HQaEhF&B`y=p=fpMM)&_Nu}AqV*rl+ zb;l(6Hs>-b`tkR^An+lihTW3gisT4oM0D8xx|^R4Yz|^&qJ>4hv*&fYak0E^V6gI zlq)`NMAJA4_(pE}W%aLG7|#=0mIPV36)s~2goP0U$0@t$Sf;#dC*S7r)`&l4W_Frh z7mNsNI&0q?%H-or&qpMUVJjrISv15_ zsD(1*eV!TyDVhOG3HM7*UBK;BF!)Q7lSkcQz0p3eQatM!YbYIpQi>5{=_}yZ^ViYk zGgPF0BwG2_Bap@x-@`nzZWio>utrB`g;y7;kPJNFgx&8iIyI_ zDmH;Ul>9&UgWB9s-Ir7A)aDgOH3Xnbq-xx%n#Sub7J4Aeb!IRZf3wW0sq64QpmHy1 zi%SXzs5z`(&+vZYITt{G1;F^&+(chu3n-whY4IJZtTDu}*7g7Gk6DSwq3+}?QrN-y zw&u8BVh5Gy?_zsH+CRmTBT8xRwip~}Ma_vU0wM<_;%|gBv`l^lm(xGlDpJ*$T!@kK z{A*8|n>$$X;r@Co1D~0`IWw0@t}bXm+xQht&*=F`;qh{V-KqkcRj|+pSzcF|^G{r? zS13VQ2cO%dXJ~=l4*gCC-Rm_#yHdeMsP}8w#}?mACx^Eh_$EQHkQmQiTY(xZ{wDH> z-x00_X4N9cJWNPK1E`b(2HG5|dMXyw)ym%qc}&>^O;~KiPi&&Mn+p#6J2!iYOfK@X zR$_E;R19S1m;=0vFrz5{R-1|xC(*MiBkT<}7CD-Pd4OzRbe&_TpAOmDjVpE~f{>kA zcejcT%_7kIA3`v{U6Gu6I>a?HXCwI2oCvsFDX>nVjd zSepuzC8D}E7yR~qh&>dXe&9*`>zLdZKPj69lbync;C<2>vFl|KR`Y8$)6+B>lSQ{{T^f3rWix^E-O$g(r}TK^Js^Yp-^>?c z{R$lu1EkxKG<2!$r2EsmW}kkiiaR?fbV^ zUQ+ibE(1l|&3?Fc{M(!~C_yDdBbIEj*)iENS}3s;v+thIhf`UzTkE|_(zrGpSUj}* zMV!CaUtbS|^iTX61o%+In zwOX`1iY`knLX#xt{1bO5N*C|$)S&WTZc~Lw@9B5lg__O zSse)K^$IGP5fd4;#t3)6mDSSTbC2+FQzXf5pgu~wY8&&iV>A7Q`PAHsTp}l~tFdtvzMc_Q^DWBw81S#Ma#_{!Im20}vw;8ik$Vrr`Y>S|1q-5Jdos7z^G+ z1FBf-yi+2;C8kIQy47)(6!QT{4$0850!Oi76<%IHb>Ag3R6S#WlPw=qH1O2SNu)OR z9#F=;S||=9ycoWlDazbh9K8G0@r%f(yu=jaBvOc->=gZ~Ns?7;V2y!0X6tM7*Su5) zT4|yw*x&bHu>r8!CgMOl9Qr7_9sA%xECLKQ${txcD_I8Kew5#H+^a(VnZT1{snfJh z`{^=r>lXfR_&}Hte*tS+P`%X`h|Ec+D9a}`OLY`v=A}_OjCV@f+X9ZmtBJ__`esXqov(*F!Qbz^=q9*ygh~&C7E(t z-jjYeg<+fJrgUiAyEDXQuab3QdK5rZCztKl3`<_Ex60yHt+}FlL}Ern@vd8}KTdiz ziAZEW(sHqXJZA2)(02;HpB!FwdC~|Cg-|2c8Xx?1%j^$z#<=n^iV-@w*FSAa1H02N zmfy;I)Thf(NJB|KE=Q07N?AUHhrh)+uNEQYLWd=~XNRx!RyIdX8i^)4MGu*tz9XSC z5ps`rZw{U}Lnv3;|UVl5tjdt(@gK z*h9Hv@BO8Ca@Z(X+3#83@*(!pqD=-!QF2`cug+VeNI>fm(K1C1!$qPW33bp;puJG( zzaxp!evg-P8DD^TiT+}hO)mB|FXz1vyt4=sjmSgH2oqD0aCf-dtw)d)maA?1w;mfp z)?zr-Iz$I{-*V-`pd^lz6?1M_`v2(9am||AbA1VJTY}Q)} zyN%;o^QYGB87$$qs<-%W-^MZ&@QyNXPeuN?=akT274mr@&q}{xJ*;1u*6!J#*+FZd z6uUgBMyWIUqSXb+N2x)lf4vvuE#KV*;*|mAt3HQZHw;5wt#d0-4--{$IAz0$r#bj* znY1be(~j8?Xng$%a27PWhJEtWEgInF5cc`=7?@qY#H9?b@POaAIvy9cy5vvul2*s? zH5ZMeBrU;S7>Ls*_6Nj@nncDn^DgMBzJo`F#NKm`w?o3T_mO)NDf$n2^e8(?wVV|1^L6mK1d zsu2$}_`85M6F-6){5VM%X=(SS7;J0Es+>O1>?q9R@i8Xu=r~oKgnrBI-x1i{NHKj& zH)(x=nK7&*l~wo$2no>Qz+;#2In(gDqrf?h1$W^0?Gbw@fUnr`Tubi za{L!=hmGlfo&DbVKN$o(DF2f|FfRgOtU)Fo$pZm!x;S!%36-fpIH{=NbT&^C6dbT$O7_RKKM#CKln3( z$ls}s!7U1;K21_rl&kr3O)_N`p}$tx&npLqzbFbKg37z8tdz#};KQ7VZ}m~V5!`?=bv>}cQDdfBeoZsIlQ^6(|d zhLOOLrrF#vk#)$46&Fq+eG3doS{HzBCh8(OL5rgd;}0_PrNMu^t3$M5?_d_PSHyYm zNj*7~1Q=ZtL`e%J_@ZF1#vMfO8}l*Ea}g2BhRC3_WG+pS$w-=dMD)nHP9Me-DS^h2 z7}+xFag%i;Bfl(r9#{2ZMv7;zfQnzi=0agh{vFThplJTg8`neZZf8CcviJUI%toXZ zl0_aUHF;%vc?hhP`07?m_y~Y0%u@@*iiP*QbWIJ;193g!@{B@YgBF0(H(;#rj&)TI zLJFo8Z?YT~7e8N=*Jl{bMk)g;7b^J`rw7P#*8fD7;-5Nes~C>v=|>d-SIO8pU*)wV zQ?LwTv&94wRL}Y5w7ajs^QJCoWU7CDgY8kle@$i-rJ1=g)p5WdLLzT+_w|zr(u2P( ztTpv0Ad4{w_-PQY=J^OfIU?Z|>Bm`Ir~q%JZ(%?%LQs`AP07~AM@`83EMqwNWh@5k z6G}(K@ZZl19~C4R`AbJ|KCBs`1w@X0F6SPf*3-;`s24rDfDA(Ao4i-qxL%~vp zsPr3&S$?>|?7kY!%%MU@?Jrh5$~G7KqK_0^`)OJ-1cb+xFUWWH%sY z>K^U&UL4=(S7o3rgca8NSWT5vNoq*Y)k(gx-ci!PSCcqb>f||iVn2~XB!4WlSgD$& zdk!APyQqj2#+K!$Y*~|p4MM0|-KZL&Qh_$iKkX{t5*f2O;Db--6t&!h9P@%REi=%> zIv_S7r}wwznG< zSpo-E1!aCEh_(5kX4ofdI?6sE+Vz^V=vQEDB!Seqhzfj+1e>K|OcEO@up(!bh&RBk z(m8Q^9Go<-Y_W7~B&u;G-W`FL4xRE8ZFE#Pcsd16iInyFh8>=%+~64KhruDu=(ED4 z9?(>}MbTO1(1B_$X(g5|JKE|WsA2H20E-eJvDtY~+N3ROS`L%_ZCw{dc<^8d9-)|x z^D0^6LWy`H1`Evfn;*Q@XM%K{fU>h>B4lk};nyVsBZ+z@ofj^tKrs@bLo$&8MW7KP zl{WwuQ7Aw->+Uzq5sIqfvm>q*6&DU?;Ixf~9L51RlYSu`mJv%i7<3854tm;Zwc=Jw zGbyz2lhQnOjyhHZHy;XnFKfcyO*zs=*0BiUBgzvk3xk_SA7YZV%5iT2zx2&%w$o^n zURDq=@Y~sf=47C8Xf9!eW3kHc0JN9~Q>@6M>A6q0G3i%~e6wL|ohnXKcHgd$izlp> zHptDmmoLY1_e}T`I|n49)}K;6lq8540UDx(&P_wa#WZtCtqKl7I(B<6kJ?7E&^PhQ zr7hEQi6%!W3FQ30T}L|`U%~5Lv0siCA&5coIz$XWiTIH9EJC&PPF1dnfdx?h$bTrJ zJC+YoW(2?0JHuMw4{j$|9ORY4=^U&qy{QJ?2TTVoGZT~xQNw|0N^0&aMv;RBxc@VU z!KRAzSpIzPFP?{gs)=iLIqLBOx?uRVff&qCul&6ch&1UT6(8J=*XZ{jd{nu9AEMzTRDl<;27@)Z3oW97GrP)&iNBCwwiO61ZeC*@%mcaCVL8V8kQ z_xUQK0_7sTU%q$M{UHqRC8H=8o>st_!0E0nBuxjltps7oq*~+*TPtECLqGK66@a!~ zwTn%zc`S`bNOm4gcvludZJ8CnK9_~a3l+)pF@Z<_>gXhKz{S4_WuNNAYC6~-Zxv> zJe|Xa;2`=&t(N*+*scb|J&do+qv(^1gKeV=a=w+78GSB?R$hkm_G0%**TUUf@Z!bM zB-+8r#g;v=tTbVPWWh~Y&DMOQcch1#oJzfQOsNgh&ZH~ed7yf^%cKpPtN`khFaOxR zU{6hmdRb#mr}fqIYkd>(@84GJ`UDx&TD!V_a*a?mo2B0uZg0Yw6Q(?lkFtdoiq3InL*u`|4;6GL&M;AK{sn=nrjr zjajhUs;=4|lB3z5we%Z?Z?x8JsPl|(p5c%k#Fo9Z*+j>pQXVMbjk6Sz!@9RT(3FT~ zreGC;4E|1^V=A^9K44^~kOPW@CPRd5!J-El%_|XBpvGP_QR5>o!bq}4;ioO zp05uNKiyu4l9fc$1F&RxvV46t^~KfyUH~nd4#FEP2CJa5(z%lTd50^Xc5@XT@{`p% zYVkve?2-A&YUOF=e{V({_#s3Z^{SbBSw$$*x^>2nu*C!fcSOj6?h;e5e3}i)L6$8_ zKqhx^=h4a#6LDb08+yG|FCUVC(bcY|@^b1d#^P#H_J=A*Afifm#v#~o1>VS{nH?ZWYl_-@pvLF7drrbV7J<3Jc-T2=7NHDX172Kew>v{E@M^sY9yub7CX!8vBV88T> zYHG~7Zi{jJY&L432jV?W41yuryK`I3zJop!9{M89UP*m>BVWJucrs+CNVb3(8+OF; zvPUGV!)}bxes>Qgj+8q@cjmzN-{voCMJ(q16tm7puZ25T*7DA=2luv$%BDZdUlCr( z4pB{(?pv89f=k^3TN^Lr<*@d(bQ-UIn{POQ&qEy?ZS87DQrik^U~=-lz*(Y+th#G3 zxy~Fd4|Vf$um+`(dwNl8ZO$`7Z>xqBDoc>H94#Wd^Qkx`wCHoGa|MPXdAC<<@Vcql zWK8EEwoj^u?x~K9N*il{uR`Kbm55H|YOyK3MQjdaGISqJw_I;-C=+LQCtUiEF(jk5 zuY%8%W@ctxWSX`#`ViTeg1v#_)s=iVtpfNT7NEt9`ofjg+iRD$vE6qn3v}qK-9x$@ zD*Zwu0LOrwOGt9I8H1|#w-@K=rpfa#K|6?zQzA>2!0={dJb8hgr9@*;gM!T0=i;UM z0u4yL)v;RsuZ%!*h|x2w7IM0`g>BwBf|(KJ%B;z@ItXC zkIN3RRU#|=cOOhM#7XGu6_ch&=Hr?1SvDmjZ{j#X2vQcv0H7fKK{6pqGr47{?V%i{ zXZZIQfrQpcL@IhTa6AWG*Y7qh4EQC~b_@@$G?6IN>Ciw9y<+cY5H#>h>g2CIpHfD5 zJ7@*{ok!RRl?e%wM{YQbs=Hqi#S0KhFp;yWHGIN)zO6865?egtsl{Xee?i8XxRznw&9|CIzUQ^k^eho>Px0}NX25MLYIe{y zejv}Stslr0cNf=JW-GzO(#F-V8_}*SVb3dJ-+3z%D$rQMT~JNJ`fBACb(7H}4=d(m z4dJ=SsMheD6BH*$6>I^mG`=0|7H~980@#ZYa!9?4 z(S@0TxuR;po3R{}1vm#isb1V__aLS3ewx9P;E)ai5H=EVPkKER4?8usospN#A`~?i zS+CLOTvx&#gU6^d{D*iPD{CJ|Xl%D&`9k`qz+*Rd=kgCqaH-U3q|`hN=o4y6cLn9uPuncyNN;L(nqg->(fIA z`e8FU&sG=R8qO!6V2L;Z`(J`cB&>Ei2Z|qPJ#<1!x z^_K$pZAW@}7=cOugi${MmN`F@ zYXt;ZER=XfB(1lhE# z3cUR-55kNoVJ)eHD^{wgj7&q>b|+nmlfi;vxLxTjW3DtSye#A%;!gD3-NQKX)^Bl` zN^`i(?Z18gYQ(N|Ql<^1b%elmwkvyenisdIC&02LB>dJiQZZ_y%En*?^0QaC-^Z!k zJLeKelM~Or5MJn0Xk5R39j)7`I%Kgp^lw}2ro6C^zDh7lWDAQsLrs4mt{qrL{zqBF z#q=L#5eMu4K1NGh%LSJc#c%mFcsG-v0Qm|1=LEn5W0YPexo!LWkVbJGX;}m@|+| znazQW9s+BoIK95_q7a!j_bG*<&_aqJ201J)!j(#IM+>9k@8))Q7}DpCHya_7KR}9) z+ZPgnk(Ipt9aBW^^UfUwttj^}nY$qt1eMlfi{B~uI$3El5EtaAMvhXD=`bK-g_uLf4r=cC|I z61z+Ie=5_?O91O9fP->0;iqV0oyA~Gg3}Wm@dWSu?2r3c!Pv2TnUUZ6wSTc;TnRY_ z5zK0GTj-l{y8EMla_cl-_S5b*w1M!u8F7+%-+UO|4D&BgC$pUku}u+5BY;UhQC&;% zr4)BC=oHohw0Kua-izy@JifOoWS1)z10c z?b#w{Nx~1dfINUJ>iyo?1`I^(&)E6g^=Ql$gA}urNX!7xi=0;YB(XI{ZO3-~rV+Vl zVvk1`2He|wv2z}gj^kp`UWW>1oGgB&^ni0u(XZJe{w`2@Q-Yp(hs7dSBtQr*AY zjp!#43=}W3gMQQHOttn}M|hRIV}%-}!ZJ6t9$Plph9y#w(SPWZ-{sTJq%#d($wXK2 zSUDx`^;nGC>X;Fm8&Vk(>Rr6pu(+oy_*P33y*haL?sKV~4mC6?E^20UP?fv`-HykZ zIgL$R=p2$)1<6RISBtDsW_^2NqreepJR-htKmvnL(@(6t8JJf#Y6VB78#d5X?jD}` zytn>9MKfBZRSRTUg)O|e)#LOhst=j|TI`_%YAD;=Es$4BxZe_3zHZ$4_Om zw)W{S5qV%g{i4)r zRvf7!MmJYLtjCT_><#M5LF1lvQT(?)ac*s#GwrARn~IeBwY8deMP9$1ed(@oXb>cD z%kdfsR&cHQ&gbk+I|^POwVXN=)3nTzACb%_nu6TB$xpkW<$n%|E2OaP0A z@=%OtvfJH>y%vQ)>Runz@~c0trh00bUrVc{iJsBJ$V1e3JnG-K1`OfNHzXXGNF$wR z5N;F;QmzZb?%NB&@&L|At`-ZxN=OU$d%#$Epyc6MVcd1eq5sq_Te>1E9HRFczH+oe)*ngo96&(+k)BDchqCl zU!B?+pG?$@OUJ0YJxMP-udK9sv@{YH8kTBoquZx?aB2M9Kkw)2qaRuPu%ojHqYT~# z+F#5B=FA4?ZBq`)g-6-jn^Sgq{1^>=?!1W8@@!oAw%%L^YZb7nLJ)uMK>5C%ue{U) zHN~Tr;{io5V2y?&B6bR_br!Ad^Xe66sL--Fp>rh0L*!hB`*-V$Gc2jnvfUbEh7Ai{ zMr-G+uEM7ZpQV8-z)%1pd%+AdwAOPd$wIodyEBW7ndo>2SlGt$rtOG9b;MMyeNTNbITqUNN(1SGmr|}dd{&am^R3S zbX3@Xr-?e_jzEpHFs*>3c&cgo8{;kZPrMYs)%ncn8ClxFQ!vEBx|Oc9wo@;^4dluY zO8D2`kBixd*?w+*gwkG zEQXF4A~#7(uS`?WOe91+$bz#gdU$z+aa$mtd?Kuq?A}cZ&y{7&;<4t6WEVtUF_y%K z&yvA~=4Fax--5N84`#nU0oW25ev%PJJ=qeGZ92fuXI}&K1Hyet4-Tw>$*IiS|bcAe+o*iCp$o9Y$`9o#XU< z!P18V^USSZ1xtq6g%3;QKa#g^2VQ}s^U_2vR@Xddlz@&(;XC4zMK(jqAZ1aIJvquK z4GC9_jxdv)Ls?8TWxX~7q{EAm;*!-BLZ)~};R&SbL?fz1ULdNB#ajJr1YnRkYTycx zVh$y?|5(ol8%P%L07^Sa?Qgf2HBb)^fzVWn`lr&NaI#irL}bJ*nJ6<4`Jx}#kgW^j z7*^j`i^frotw+idJlm`FYrwQ3Eqsuaf6uVmg1O8OmISLP1f6AZsf9cb-8krldTsVk=LJ>w$=9SImU_r)b`U{zUe=Kn#4$dH^)0 zxNNd8EDip{YZ#L2H%x1tbj~2nY0fBh%OH)ZJ&E5PLm+tOZ zVyroBh~4Mv2Z}e0V;IxnNS2OAk#IX&h&Q&Yb{@R~f`t{heM zXPlj#ePD%b$D(`Hn-zY1cjfTQ9n^}a3qa;tkSVi{q%%qv zy8!908+Rp_=%*=*(8z&v)&i39vlRdd9%#S=X&mV2>wdfA{Zk0w_1D+Y`+4SPs*s4Q z2U7}rwkt3~yIaIeyYuY(JNtd(?mXtZu!(xSy%o<3S7k|i>vsxDkSFmNQ5p65Agi18 z{EX<{sNVuIWwEh*VMk~5<41?YZw({pt{K<2@pswJ?I3`90gXLXbMC8-tito(eVq@9 zfp)sP$6Wi>ftz(l*+1MRPXKdQZI@xj6W0+50;fuTK>a9NWU)RoREjYpBny#`C2d(s0g4P#29c-^|sK(?ZgQJbf;ck6a)n zhgWlwhba`Ww9KnUTeWmF{-7&g79Nb8S6>poyKqb&&a5zwA@LoK8YSUmkYg#>@I?Hh zr-BKe-pn}06y!^$a~xVM#LKT=VYsK_!ke~XS&uL<%nx+BdvNu#{&z$gR zIF3Mc6jM!zNKZx^$cMdwWuX=Z;?y-YSVwao)WLM=ysKyL{xMyn0|&)W!8O(or7V4q zQIVOd`4us8NWldI=4~>h_?wd;FAIS)7sFjgJ%OWkNXqdUw2v6!OtF|O7}lJ9%~qOKuX?%DvR52$Y3?zD0>ex08mBq*ciY= zH@~WHY)R;`jCk6e>u;H7W4CGWcD)2+L2?}tW(VLSa7QR-DI`pFvRfc53j{D8vGY-O z$^}DBF1FWWZeQLb&Y0fyr#RBI(_&-o1Hyz%l^yqULbY?!MfqE)RWm|F0M*m%ocrh|A$oX0=^?z4bm ztA1lsEz}~~Z7-9$GGmdTyVx*sdK&vy{g0waVl^?6{=Bx5&s6kC>foYi-GsGvhCQsW z(La(E_H}3e8Fs!t*!jRmaS6`;cC~4Bd27TI3(!2K2OSgWCdzmw);D2wH2y)*R2DuK zv4e-=+4@f%`By?8EpG|wws7-?H&oUiRt#GBGN;G^hjSxD6W-*3&ZoQpzhE6m7VtJA z#ga$$vxu(tH8asMf&qDFXqX`Nh7>~e25?%iuik9_A=yUQf5~!NiZ2>ZDf%Wy<0=YA z4Xg4K&$=~pjl7Np5N?Ox(VQKjSlGJDYUr}~JP0@D72^iYGZ`P$iXxi! zWCvjD4g2>AeQZ)DE;*@;rldmok65IYvwM41`Kc{bk$X|og(Aj#HWucc2t?gpANXwy zsg|c!m-<)yX%>e$t#U3-9m%dKy>(lypsAxEVjdrjv?$KWV#y(^l8Nuo3#}u$a5av` znkOySZ|hUYct{^%``@8weYmv;?bn=Wa7uU)C3Q`Z8=R-)aU70ojasXTdEA6~+*~!@ zr)A`c8KU8q!>uM)y*cEYnt)(ENbjPlxZTggyQRya=XETa7sni@|5ne!kb)S@B?(%? z%@$?c^9s<9O8_NT0`#VpJ=AgH-){XD>TCw~vBUmOkLh{yt-WH_8D#^=Xe0sb(@A^Wn_#vyYSlrZi>kvDp#2FVt@{blMLc%p}mn5Xb{J z0B8}0=w_Gy2{wj`)Y781>X7{O*sG=4O1inzQdYvV@w-XD?fBd#RxN>|3p+_FnxrpD zin3NM2*gnonxq>E>bpqRprl)gY2ud0+{`&n0}ne;#<;m=RYzlF7pG>Zfqb1i4Zld# ziBa2{1~Fi1F#OFRDhXB{3R@ABx$;PkeEwSibd|x7TS*eai2*E93sfrO9U7Jak6MAy ztO0*a2|8{B04fDsdP+fc+^>@Y6b9{uq&@5v07B+G1O^HS)#_QnfmBgd62~H(9|8&8 zYJy!r#1fIENI6SqJRqgkAEH{Tgqt=%VUPs0;Q-VgCI>W5qS4)lp;8N!8RBXLdMoLQ zK%H=6FmP(vDitUz1ACgwV%&);eFy<-n3aM#+c==tO0j$Z;DJia3BWe&g(HnykzmYp z(1@9;fatba7i!xK5)8{bpw`c$1jI)=8dfnt%W;rA0HgDpbV;Ps1QXDBfMuH(6Lp31 zD)CP(QVxKZ>X2lOE}(D~3F?#t{A0+0YE^Jbg-|QrQy31oDHM{|bvd@wpaUQ!@! z7eE>vr_nuPr)Cm&hMbw5{R}I(8IwjguA_loh38xVHDH_P;3wc6zx^Qq_Y`(Uy{9`P zFDK5_W~23XH>bnY-08&R7LDuU(+wgY41X-xlr;@^)+C+bUz0)bsgJp%$Mby?m$kCk z){FGHGmlrR_hH;@tu$PxQg{tBkHE%+WVLIz(GG>0Eye`Y`!oZ!M9s9|=+sL@WnCkj zMPe?lqY40vvQgmQ=5D0(PJoUY;96|pTyLPQtLbW{f#LAa*sc~%fqUd>Z9>cyT{gaH z)9kM?lc>tLjpk_=P0gk+J`1>dzUlSnnS(L?;NzvoeHWKGIb1##epdVJmC;7q3?}kb z(D_F3eW^L>Y5B-o>qeZTNa~PhZ3KAThl59p^MLPWX&7vIaz0OAyMWC`=}SzR#17jo zqCqT1^|KUdD!l{b2@S^jY<)J^k_ukIWjq4q{i7Vm zO5D+|Os9BD>NcV2gJKd}ek5<1+gFkYLUwizndUVgvKUNO^N*sdYEv9p?GQsU!?_&e zdWk{n9S@uc%MCpJYO)3InbO{-EU!P6E9e5PK3q|=XL0pINN3ly9**5ZQ}5WdYqo*W za<0!c$CH}GGqxz^2>IdjrTB{6RJ_u^mok3ngQit?joL6;sZ{RzHbt8~p`3 zmz1+4JBGPPp&Vx~Nm*#~{;vTgGHvKFoJU8EInf#ivgC{m3AMO$EC-BIxz6}G@P(S) zi@rP~cYyLrzER7GvP_vOU-<)yk$mZcQy$)Bq09F1g;MK*Z~t)T3gPB1u$_hsfm3@J z32nPy#X(A!NO$^sZj3pxe;95&8M!i4V_Xl6ycxWn7@iW*cG3*hwx3EwyFH0BVwFLm z&CP6&T5{*MdS|VfzkR)K;hH_Ah4bp?`*-aZFE@VNjM)PIFC`U2|D$8^dY|n2k$m>{ z5X;(vj?tJ;SjUP2H!H)w?7+sykNeHsQb>f^N_Mi7)^ctGamK zyTgx5;DR1hu&DjscO0Y3ol=+d^W0gPp(c#)sH!ldBM*IQxM=5>9@-`c`GAnvYFn%l z-;h0G$eQ0heaF`>0lV3#)!+7A=#Z|57CmE`8NF$!+1qW{kM+u`ZkKVh`Wx6b|p}JhR4BxN;&Hn7W*ugDjI4Ivb=gGq>N#GrV~B*ev^iBgR?uXe(#mz2#q$mm*SycK z!o;niwwW{z#>^do2JV`X-d@r`xqrj;?@Dr~mYM3Z;1B@hHepyQDM=1w(Y_t38v1_7 zx=*mVC4A@uuV6bj zWQH1W!?o|A0)#MtGmT=yz)d}q%V3TL)5KpO_LndNJ`Q)Wx8|Is6V&vMwt9Sh%IQX) zLQGf&fPG=qZjQ< zwi}2hj#7ZvF8}rk#tX88xiSc8A55i5%!Za_b|zbLWCcS*c;h*Aykr_!N7we_A!QA5hVQY{j7q?>vlSs69@?Jkf&HD1YA4C$a&l0z9 zP!Q-xcaH_`D;8gUb8vTFXJUim^17Z4V3`N%<61*2x9T>P#gSMm#DlR399V$!`@W~+ z!*FOHDEj;hV>6pDZr`9we8QiJFRb&skh4~;s}+Ni#VRJd#9RRfE}^|U_mJByKZrO^ zFsBFNdGO)L{s}O2+u^b2(RgNgJngpd{nbocIhVz4@QCE>;Y=%60|ak;)gG-Q%Ovk zTi*|S+*!ywW-daD-Tcg>BGTm{=%O8;Ayks`C`v+y+oaBw@$oDJQ_*n9I`{>0)5FCr zENH{o_ABru&lx>noxZ_|q*FjH_2_i!L<+8(-IGCjmO*+{a*Kl$ zE#hb(`F@=yN*_@wru(kJ!U8*0cq+b zVFn7iejkv70E}*KtC}0d&N$bN%dP6#du4_~qc)lmwU3S848evP_5u24_K{s%h!3VSmfVMxb186RJAWW#S zVejD{k4 z^59VO##J>}4kCh*HA9(#`%$GBx<>)=RMw60WdRjrIE$&sq8-n2_MU%p*Bt%m*|Ms3 zRXny$V`Pm)tH2hSus1kf$YXp1@A?z$sdoSOcEkSv5efdc2*AY7#`53Bnf%ezcHU@3 z`kyp!PNc!U6hW@ri0tJ;i(K-^^dx6_It;BMVtG^Y*H}SK3m-iZfKX@j zupa-&TsTGCx9k1a)Yw|-A!6x}#8^?bXi5XcUfAiW8QvF{=l9@Sc6M}Ix$^X)NaBKJ z(dyy*)Nt?C_yfM4zOK&CWB$U9y&q4fiDdr&+-?HmONUVHxFUJYS8Iu>AkfFJ^Vl}Z zbCN`)UdTl`_To4Yu58i69H_9@)d))b9G&m)LI#}v7rjzUvK#`5IJHdP`;8~=?D1lZ zf^6sVxOS~09t2@#&=OTA?{_DK*-%V?lR7dV6^d@xN~5Ovbh70;9W(H(!2@MIVnoD= z-&7a1R6a@VTOd{!QCKrK(Y#O@W8C?XvLFeTp7u|&`!QIxXKa2xwz{)wdO4WdDlfR0 zG)BRgs1n973zrM?(hPD=>9zSP8FzMwp9*;3;jo}pMMz^(+n2S4g2yt#OkPgM{`(hV zVQ6BCMuU$qlN`#zN0Z(`KI5Z}v_oAOo!wepSeHi<55pKv`Lmg!Z6*cHkUy=veUdE- zc-&u-%{KD6ow=MM#SqoZ+%{OJYG+dm4j%io3Ons}`FcK#-#g5dr}SE??!Vc-M1Or( z>%Cc27&xSiPM@RkO5X{GW{-j0VnZrU3vw3I=U0jX6xJD4BBNV$d z*YcT;9ol(wg@&7lv2pEggE}okADXA@z`QyOw%8>PzNPP4!YW2uKKo#o3AfukIbs(v zp++TVI4bavw3At1ZBo{xm1LG&D_)s3*Hoc(qE0{c7|N5H@1l7gxzW32XR5PIE>|wa zeH_?U6MHaAt5@4xW73}2T;45u^GuaYp6i}j(v2J8cJ!>`i#^qV>o&PwHarPX7P!t^ zOmLnr3cLYDdJEjL-l8jUxcg!y2?)&>wdg;3#DkJ5GI}C)DF{cV*p{l$FK~%qeF?R# zY!6K#@KQz~)gpdiPqBNzyB^5}JX^}|pL9;~e9)E|B~SJKM${8XZl0eq)rb=%FH;M6=ANKhVAdBAgjLGiX2-GgU-L(Vd^J`k$6=5`E`qVo|XSkEbBO~VPKIAMS95TcMsawLg3!TmX&_(a{U zokA)iMX$z4zKhMfsG@kyc^sq#r4h5NC6S~`lIU@dWW3;xJ4XbRQIg(K=Fe<$x&>O8 zpx0nA<6tiI;5gBgdM6V!8JrCe%mTPQ^1UB@bFCu&+$>^S zo{2TL$!-mvrG1-eBke=W^k#MqP4qlInqAD<*k2xy?6JdIG5i_TM+>&TT(dIS9-Sas<3a{Q!PVWfPazqr~P^xM&s22?nK;)W@lDLq zTl9JE+>7|SeE5tXc9%%_A_U-8@xtGM|7{!E)BgJQPDJpb7zGWC6ElK4`@j?8unIZ8 zy*L5adxtf=xUO~j0}rt_12*P|oY2rp)#wReO@I05u|NNJw?h_`qwcx@HW=0g=x?r^ zSOX*lStVzTEP>yA;Kp7PR8lvmhN|GwxDhjjh=PQ+On^)F_|!&nOaB0CA`lR@>L3xr z@DBqtT|{esaG@QpaJwG0N>+cUL?wQmw{cQMoeR9eyvUi}R~N-#NI}#vR?%6;c!9#K z`mNgBgONM-2oO!J+VdnUfN9<@;48t>0E^dSZRKzb{fsnmKW;g`KAOuK-zrV3_BM&# zX(FP?b?Kr6aq6zBX9#S%Z}<>rz5dFjtZZE|tJfjfq4ifVPOs9~VxFljz)V`9z~jEj zO}cr}{@lw=qc(l`dT>5(g?5!mXM=D4ZnfR~8Fa`=_!b2=yiSL~;m2~o@J6G4TAsDy z`ux*-s9509R%@LPtV8ft_VDa$fsQt69=2|$%fVlu7+Ca}*&Cioj*K3iP~Q+qroOxT zf#Df4GXJF$=&*&-Y7|m~&sF-V$#V_-)aZ0Xjk;~+2QuvzMD(q^SF?h?boYau+kFSU zetVA@bCZ^5Q#!~T-i3It4;UBUI(HL|ey>M1>w^Hz=@bPH`9jF8!2=D1 zx_ucJ)vAptv>jC->@X!g&2 zMuh-}=$Rqc#kDHM#yTWL1K%|bS-7;uVrT)!KZQx27_}%snsZ%9PanPGY67?@e1l~0 zw-T z-Vv_e?OzG${iwB@Tp1>(E?AQV!8PLT+rZ4A>9l^BQ(gkrMxevby57S-}wF`K{Hic3*F;_60sxvSI?E;;=Q@Z!nhtbZlD$7Oh$59&IYIv|0bvrquRww#_7CAixqPgxU&oV@?JP!)L4`v8QuqNNyHt{ z3}!A>AN&-GQnwG_4X5A&slpo%%!Tr-2PCfO!AGM5a1L$Obr0WE?zu-e&iCug--0vX zUW)6q)`mmt9pOk&k4BDm+Ilc;(9G>zPv5jQ$lO($?Iz_^J_>?w$f4 zo77y_k>u|sjpKw}WztS_QZIJ@mNz>-ua_k&GDRA2=Pjx0&ON827gqAWk`LC8N3ivbpqDnswGh9qFAQKHKi|gd;ziz-5ghyWq{$(~5T3p;Fvvh!W95J44kq z(z(v8p65ahmm}l)wk}~*!PYG_S?uM~YMVKbcjJvU*^ihmrT10pT98GBZS{>u!+)+4 za#hWFCo6=!Kt|Nbc}Hdv6C&hMqe_jD0W#+y8aFFwKuiUSn09cs46roiZkTx3OU)8S zfWxCSSrfr$_(5oc1x5?2ZQ9eOdCXI(P^5~WWtS0S0?C(uK5<8#1QZ8kTjK>-Q2+;# z_5H&;!JL7<=%pAVZsFNKmAMi zzATCRMv(zNEqcTnW-Cc}{>9w_L`rY0nH^B|0b##(xN=apZj^1ag-rdIO(=*P)5U!{+m8r*IChQ5Q@f0L3VuqerMO3It7qE5vkFj zv4U7I(^i=dYsL;46-V-5$2CW|nK;wj759PlQIFs1sH2D?cLQ$$rxrjg0V=Z8=3~(} z;H$u~QhEs%4eNJ0Lu<9tb@fhozgEdy(#{czkL}bwDEct1$ViI8?=ZezC@^gS(0p8; zDEcGvd^Qi&N_77xEZd$ON$E^Q%vzf+(kb{Pz9p{~d&TVu4Iq1!&blJfN|Ari7D#&) z)#Y*8&kZy*Ifl0~=)udlx<0fzPjRWsaj64>l~Y@rsC-WJKuG-cihEIC-b?{gAOxrq zIKLhwCAU*{t5$eCk>Ti(mp;McB#zlV3)n;QsAxv;NEqH1m;f~HORe_2pT~s2^jRX- z3B!%PTv-^f_=r&DH7l4Meg+`Z1E>$kV5XGyJih}uI>(}g3#%ci$ z3fB*b7vo5aO+x#D+h1&l9blD*1NB^X-#dYB`MFfz$sXkE8`Z>;K82NyU+@V*pb!rB zvRZ_6R5w#eo#^RSj>V9!g5_K^t+S{^RT7=<%t!q#-9(rh3$yR>{43wkka{D*0!#PG zP6~VzdL3+m@~nS3xn!ZZ*>X@|%;5VSei_$q(B$7K7wN<4d}}Ri`A4^-tTcAvd%mGfcL-`+ZGQ~?= z#rXDdd3ygyjABfb?oZ7yE%DAsh%H^3BfcYM{5ZS2ID5JBNOgv@aAsQe@1Bm{xZ55M z&KOtj*6dg4!N*$GJ`SHnV*xDBzo2M>D+KXKkv$~#5+-0rVriR?MoQvv@LrgVEJjIw& zah1?3P{}Q`JVRd$$unLH$NN(53Ca`-xMjVF-85kGXhJxXkY74)6qyo5|3s$6OPC?H z@X@Gv$rpSmAPMI+{R}$6^V&*SVi5w@*@(=A+@^?Am5P{+A^f|EcGAS1AxXF6jAR1H z{tM%b|0zlO=OahR=l*POp&ah`sc!3fefA`+pUnPZzna+h{&4FIq znqk7@XKK)Dy1MCr+i4NG%^Au;$oa21%m>%AMR~3$M<-u4!w)YC3i#Ugb#pfrUkwi{ zSR8zqk>N;SfZ=){{KpE|*V*UNlc&IQ<(`U0uvK*8ng{A8R1|e_i@B4UEnD|%-Zrhm zbN(dLPA#v=9_{=2RWy12B6FHRc0k@Js^s1Sq1Q|HL`k!m zMykt-j?9WGQl+kXV2=$}o1OYdw+rtu(puhr0y3kR8PsGY*Wp58Gb{-u%2v;lA8aIe zy~-oOPPl-8J(PXk;WHo#tyhw+ati*l%6QvG$NIA9_Is>p+#H)To}`ADNe~?(NLGC? zWzW&6c7$+$OD(?+v%0@rn4qzVCFGVw40vpz9up!zEq0Tx-{~adbIhVp%R3iYeQW*+qLfec3=Y{0bB`7NhvR^mFGMZ*!MNkWFheFEF&+A;jth2740juqP*>2!Tg$=YBbU4-H$d;2x=Ny zmNh^f8Ap9|Fh5=)mX@J5O6hah-Lqo@zgl~o$x&&7j`tWuA_|>Bl+_X0K!6-^^62p^ zYN<@Y`)|35$ko7DwDsMvmC+x3Y)7G1TbdDjY#v%!T{)Ftf$&kX@?SY2>fE`K7b>3p zu_Vy)Ypeb^iWx0yx!diy+U?{zMss=YLSWjp)@F}bMy;2$+GDt?c{FYT?j}|;R zdp4XxCY^oh_`zA9hj`R-&e(URY#ZYuoDEt-vYPcp#Oumh+!t43R4^)IsyP&K*kUy znlMC4Qh5e}Hz=uzR2KfIV~4*#X(AEXKJF4A03G?8R|L8PQoIdjg0rvY~phkq0_ok%%1Y=3;rIZ|jmkFMBw`#e`sC1Jyv@q7RN zQ*^);>7Nii%$Hw@9;I)AYBvlTbnb?YfiN=6RAHD1g5PVlulLj7|8abKc;_akLSbHZ zAkSieq(+3)Leb>Wr}xu#(1-@YyVYnWX_PBeC0e~i$M=g1g3- zcuDQ=9QGIEYH6W~l0gs;a>Oi#djWEr5D3^xgv#Psm17G;UbiAcW=%~GBXwjVrr)yO zG*0%uLTLn4PwH0)FE}&?DNUM`;?>xl_58VB+DM;BjS+dh4nN_aJ6+QD>iMgcMWWN& z<0ZuajqJdnVIBCcHsDb1P)anCN*H>f3zr=`FqO7o#!g>V%3zpI@40HT5Su)2*j?K8 z?SNrB9|e}5<{)%>6jgPlw5pZnDMp>2HW1dvQm2&TLsz#@S5ar_t-jC+2Sbz;(fC9F zWU|jIy{)6`r0hs$yE$Qd!8C!*MOe$U3GnSa1#_w8IGhqC*(B_44{tHEdB+G0c8iemM>(LBIUCGWvpA8R zcB=FHJkC~*+J&1brKJZv_U(pc8?RbceNmPBWGhN~3gtvuBq#gmE?xfYc%@Zl19xM_ zbKG;XhPAso{uquyMw>OzzPWm$>+9*+{*U$8B;>pJt}M-ab(ga=Vl*-z=ZXE|PB$6h z0J`Xc+johbdP^Q_Vju_4D201PP|c!YT3dG6t>f(cIw;ozg`pHo!4i16Y20)Idpn-a zdDcN0@l+@`YR0~7UyGz=#oy<*)6w+k-C*R_7;nJw)x(-7;(P#s5DgOF81IEGNQ7_Q zEfoI}a&_n%J++o>M?OABQ@=5cfy+PoE6A{jI~L1)C6{ zXs7Nv;!Fse4CaOBG4IX_-F?%(@la}XugJ4{`vYpZU4U$3%%Hl&y@;X@_ZZ_L!&Q29 z2l1G&a&jEa3;`zvo?xH-g7I3fJoe;nFqCTtYdM9j6P7@MX&jM<>w!R_0t(gSgirng z>7SN;Bc+OoGZE%Q9-3SX>YEbeS()Sh0-6!ju~d6T6?gqW9f_*j@h6Bjl05}_W_yNy zGKAKyr=D4$;l%qhP%v_82$FFUDzijh>N(jwHxq?Rj}S=UMHD_X`4zzA8EII#)X^@} zm>h@^fb4`_5ZahH$!tsKCea0sd&sm`E~~ ze8;$QA4e&80C5+X4wtVtV%b?8&1G~O-@4aJsQJ1<0}~J2qN{edKyH0hNL-2zN441^ z^ZxD*#?+ziz$%*x$zjSYP)sn-FpNV zRWNSZ!iD{+0%qXRf1nRyo`augW6!Dbp-IqbBkxdx0ZTk)bgcReEc+mR3q_+Xj91o= zRzUB~P=kN%m~=NwrMR(CU;V?vTP~EIdfU%TDI7AZ{1;XJ;3*&y<3ty+Ru;GKUpdIh zRUd~j@fzAeCpWIEIlo78Ec0SsqnBQdONjC9 z84gjLyRo8V!W%$C@VBf#p}0OM`t5iE>09U<`KafuX$axldUp1#pAnc;PTRKqI`&&> z`BLAAz0`qAv$6;NNZmSJ-b&2yJFfZ#4r<#dn0JTTk5H(&Uq@A!u{Tv!^WT^8brNMg z)5_)9%_ibby*qTTkk@KnV)fELRaWn@v4rcH%i{~BpIR7?$mc#FpBsszQzegu4m^S> z8@3foO2Ko`+0T#rt_+}@@n~znx;Q-7G%&S10WF1zEsBGlmT`Yk!PRM_-2jQEjt zR%U;Vd`vhNBWtv`3t?J-%d;v9$jX{;vA1&=`@_;|Zz-~aS%7g|-=xFp>9*Ee2<+H-f5_lG%kR({S&mc|!@=DHA@ju+%5<9lTxb432Afr`Jf=92 zf1L_Qvx{oZN6cGYK}%oTo_?yGD^z`>I7RTb-;e4G2v>l;(SYB9)6-3JXe=E>39uHo zJy?4!xzj%6Q#Kk1!I$e#`R6oCz=ud}sLpM}_e()c+YJ4PG6eCT@nzFjK>GFP@7-R0 ztf<@fV1ACykPtD^#c&bBOJ4QL>-D;iS>8W@p(6!^P15g1uX!DqG9h~P=zW47D6KF3 zr?uce^`USu|JQhAx0bg3W;^PyMw-zU0|-y7CtCV1IN7XCn`Gl^1R7-(1lm*VxnfR2 zSrU1p^VI)_lV@=Whg%NK7b~&IgO2Bf8(prYT~8$XH$Yi8hv!Fb0`!DtPK$=F4y{pR zh{@2+u~GB0!{@8*A)jvh)2Ab8fQFV^cUX+Z-}7fMerI9vBY*o7I)DENo_~I_^Fetc z9lhM=?fKJXIK5tuU+?ql&7BAjS#g~qkz%)BQ4#SMoa9m8qW3W!)vrZKpS1d;AvtYS zdv?H2wiCo*^a+bDGulf0NV8>|7mAUD7%kg&K71x6+0EnsqK;Hs#ZDlnc5=ij>l5M9 zGFCS)JeM@9t||*(-=><#ntyHZ+j(qS6iG9})PH3}YDAWt0pX9pz&($fztl5T zo%BZ)5oye!%#$f;45PDa^%z#7e8?$(`HarG87tiB@0frH#??KOwMEsISqln;iK|u} za~40#TA1FUI*W4Zx2o$=@2c4rp6haeoWTPu6QmQeHubNWFf3!^Bwt=}hSripal$MX zdBY}ra#!Tq?O?CT3Bpw^Jc&@BMlp?ZNpB#9FE7d z98sK-_N(X-8ELA+UOrTJo71qU5<@`6Riq#7KFKeaY1T#{Twsq2JBFetIN8eSU!tMX zBl%1E?4A{w$_?KqF>!S1!tj(c!6ANiQ#-L3kN=yQS&O}YVXFFBNA3CN%VOrz;PFJL z36afaofS17|;NY}e-pA8{ki5SgGI<@jFZ2t90N$@C zU2^I?hEhILls?<#`bfe-?GQOwrf6@R%>tWgkwIm>tx%Orvy2}(GR?>y7v zIL-wD!4V|v0TpIuQ;?xjE#64KM<_@;gnh*ayI>l7_U9Wo5cR;{4F@B^TY^?q)hhI= z#U((4xi)}b^4ggxGF$?o{KgV@3kmb5mN{P=&(k*EAR1 z)93hXfa6Cvt+xOaJGt+;i|So7b5(c(>Z6bpEAO5Mc=12{83zC3bJj=zMtH1w(0tzz z+=Zf)c9LCFL-2UutRSsJS!SE>(f%oKadEjSw2djkW2(u6BPdUk5my*@YYW8@3w%B}fu&^u3EI5NbG#qJBe|WQ>rCC&|dcCDIE4BSPT?;{%GqEUfm3vk}y#* z2|t>ZX$WSrG)(}{qr5o{&P)mpEble#kWX*lTXJ_A#V)iZ{3#*;<#np%ZYlND)%gZ;(6_;n~l#6eEc>`k`7aROZmvJ(0gQKV3RkaoOkuPRgk$gE`@ z>OSA7;VZ!V_56NGik!nXc!09Du`Hjt6FluVkW^`fx$oU`*z{skcp0@Y*L0UH^j`Q8 z%$`l9gTCGeRH%+a%#_m2+Hdw8DC_hk7ghG}W_Lk}L(UwvGL7F7uk11tLsYOCR1zA} zD7x+MzX-qsnB;b(PZ_H9Atnx!>5%Kp8vPmW_kNmg`y3_=1@ovUf6+EhoKhyal!OgD zV8K?}gCIco3jnht|HdgkCtcV33gZ6(wf{kbH!zhsYW16lgQ}#xx67YC! z&^>_?Ym)cBvhg#kXuU`h1y19ImPfx$jfkWn8&=Tsntm{?y& zO(fjQ(vaVN62Bx%@soL7Q78XA)?m*!t07cKtDF8=xeM+Swg}D22g7jPV+3QRBP>Rn zFv&VLS&4YdE-k`~^uqE760gx80$0yd)DQdzXi=QL)wSs120iQ20;uB1&x(TDr@A%! z+-98kKL3CRRo8V!2gi_k=J61_-aasn*vc_(`>{UOEB{p+b>JK6o9UxzPjCx#FcwhE%7 zhw<-3mdEBCR8b}1Y`Ca+7OLknY$BP!t8MW9_)?;|Aaon0M6Le{6u_((?tE$xOWOD9 zrsvk+)ZDU**y{9L-e_j_;o)6jC4)Js#mJ(hin(arFU=J`(6@t4NX7<4HVyJs+M^dQ zGswIpP~)~Yf;6TIR|X!bbAUUHp{Fzn_1bsucsQt?TGK+E%13Aa99xaPT*rleqzF4N zPY18^l0yWr#?!wj7TdGwI3K7hw)mt6qkvtNfeQMcAJLt?^GW<4xW|DxojPNP@w7cJ zqV24b8+`&jIy11pI!5^I)0$m?mfkURfd2dLrY~?9Araz4`{tLzwt<@ZBXn-6SG^J| z7s6MzarTS03k_cP(xqB(2yjxCKKD$bDA_|zKiXrpGHTu{zNli$r97 zOzzW?rrST4d~^a1uHGT=Y&S&@tYX3Ufs)m_j$dW&a>P002Iy~9eP;J z(7kEJXCum;y5Xy6%;G-<`|>mUE$ zv`|^oH0yg)Pt3-#hlxBhejcykq#lHFmOZrr%xsh~`*~2<(nv!}7|GyB!+wdvgRgr;$6pmlycO4&%J2i^7$?a`LA|?t;m$El_TN>}>>oI%+jz+mQBR#CQM~^(`4lFsaeC(rPO4MWzPX0UHT}Ut1V9*4jVMi z&9rQ8Wn@1}Z3H+vE(Av55O=+(`iWT)X|H)!+C3E(=4HzDw>i7)nu>u|O=hQ(er(I= z5XYdj0N~Ru+n%4`Q;`!~PDJKN^M&mXyA9_{g=|F8BvU2L)IDtkRCRYWF3NENXA1A! zYBhs=ox_gdYJO|bxyFEl9aX=(7Sv=UTp8?!K9|&x#iS|h38CYB#3(5l{8e{&&cmPy zsnE-kRCwDf+FS(es4BS!Rnfp)G9X1E%TjXCw?y;He0^b#y_}^Ek9nki6{9%ItoF(- zch1h&7f@(&Lnx$-aF!rvV;dGdJ@3~HG3eK;uy7;;S?3$m8e)Z%BIT;Wizs~IK)i6H zc;dv^t&{%TD|Fif=MJDu$voOBb{QCCH)AG<*oNVY1Vc1a7^#+x9GnE$f7 zC;JQBjCEis^Q3BWF~c`p4VHmoxMy?P0Jgyw<(UF{tphznqM4J%d@zuYL)irq&}`9+ zL<0m6ahvsGDsLlM4C9x4kZ*mzhp%9BE8xceHJ$7&8X(9wm=`8v_6M7N=;y7CLQ<3u z(I5U%*c7mJgD=QRE$vaH$8`@-OCzsKOBGB7C%pa&2o@nZuI=fxnZU_|FOLr5QX)-P zzGq+&@G?1SaZ`r+@d8G#@1||^(B-5+#I_~3i{koJqF-2V{p0?!-C0-fD!d>L0dWN^kP%bUjipgKJd6!$)2DHazqJSH59lom zQYj>d{(KL_a0_sf*M<|33OBs}qV2UesesuUc;qhwOEsi`5Z4{<#G{^iLP3T_JhH^$ zS|`-SVqy2&DXx(>wemCE%^7qW%d|xfVh;o!og@Ug2g2VAH4x1c@TwMyChWQwTcF*n zmIe0}z@3tZkOxo&IetWZ`gHr(CBjfp5wu%x2(@kd`p*agBx&;Te553UQN9UnUZ>Fr zTO*qs&|P3Kr3y5)iZI6ET4@Z!SU_6w4dm2dMi|}&%+q{hdR6sLe8&P^!-jKfg_pQ^ zzDigkN_H$pa~ffNCa4T9w3RUBP@?Yg@#G`W#L6wlu{SjKMIlVo{F}G>Ul)w9Du_mQ zS@P)6m`=Tpp*Su5eSAn71Are1Uf&nxosWOPkHAG}%8}u4hQW>sLRVE8IOX7T1@g;5 zU_!4r%7RPr<>m{m@EJpmsOh8N&e3Mnb-Na;P*oN>)1>4@R4ph_5E9=wxO1P^4lYN^ zoAtN*NVj>2;CH0u&u{@T(+ecBv7l(hM3rx6eSv}EBr>mf-uTdBkAJ5Id1qJXABEgl0wjJsT)L30dPDEPR{lO;Q=t#+3i z?9W#}sXhySXdfe7&$8ZRA0xEsh<%S~`aAZuAkW@Nu%^XY4p7sF zN9iWQ_t5WnEE?MhdK{2rwZxNY0rNATh?D5cikCbOq`MuL9_Q3=K#S;JP)|>iLo+7| zdYR7Udj{DL^%1X`7`+SL>NKqR8ll4kukZx^Ny+Fp#8-;r&`80odZc?EvG+{0IN5j>p=<;gO%DQcT+xq9LD1G(&>UGfi*G+qg3 z9NNPK$#5y>sQKKe9)jMJdQAMDm3g27cM7tLBztO!5r} zqhH<`jIIPz!=WHg+oK@oj;0_oFu)$9{BR9*YnhqwxtX~HEgg8~^yf^~4jlS}EnwwV z+Tf=C4bU>2-`evp@t*rMg4u1%-27{P^vMs%KO!|ZW<{f~Z9$whFNRA49KD|f*LDh! z(|oQ5vUATLI+j%k7Xy5xU#Dsto#&D{-~%d756D=JYca*c56$2GHumz8GVh!{imb-U zgGUE%%`S`w{{b6kh7%V?OlP@w;m(u2hH&C7klh&DfUQWG&E(B zHFX5e{R{~uKLwzAf#AZaO^dY-b&wx{=x8+&pV})nTEyvdS+{uRS9bc+PM26Zqbm>P zP84^>=S1WHzxh6RU$S>n7%a@`VPJoWNXB6fJr%(hiH(;PO9AEs42x56)E{WnZoP7% z7$qV<`~L63O3FxL3;Zk$+>6njYvZUo~TJyi#S;qpKyW2k&&n+J zmEO!Ndw-LbeCT1F!~0~Yh%y{k{BI`O8j|=1js0TyNh<|m+M*_z-~x6GWGpe;vVm?) z`0;pV>E!7u%_KXVW!@RntUUa?r}yJ=y7HQT$5)gx>YC4EYII5I!Myu$E^LYEcy8+c zXuPep&xrL~Ud7!2O@D=isC;ZxXBjC$JEUVY1V6{C?J zuUs0c*q3RE!?I^+&-8Wppo zy#2J8%7IFgMUCj^=ye$>!{?;MnxIjI*kU-Ky`$j+qpo&MZ_^ua)q9u`?Q71d;O~5$ zY)^uca;VZ|Ma%4jwdqsUFrcBi_yBZ+&|B+(58owjxMJg90xT>Dy>9Hm>um%xW`@p# zp|!QLDa6tK9S3q^7?6y63>ZM)jRzl<%Dk7h^sskh#~_3%!If2oXE`i~6d+}C@nGsp zV;P18vZ5;EQN1!IcgnP9T{2qLdP$Djc-qecg-3J%6-kXx2F5+&q|6*1bQ6=}@RG-n zb(GD`HW4OJ4Ukn#`WV&=$fw`suqRhyj4AcL?KhyMkD z)U$sYx!Q(OjUU~{kIbui1_r7`D3 z+d4n11{5sof{QeZ*ErsrI;z6*QK{dn-*e1EO%Fyi8emr0bay~il3Q{(%KzO;N@rGH zcc(Ci|LDbSw!!-C$nUj20M*O+(Q=F8JGPUg31=3k!OjwKqHNcjj>e4UuIEnJejG_h zHt^lf*6z(fl1Tf2_3bZok#C3KHuoUD-sb#3m{nWc6z7uv?kwOL4xQa)1TVQRJY!d)RvZ7o*}h z)La<5r#OOVPGo4Kg-%EOpb!!Xoc_)qsZZ`!kBDV~i!|zam|WZKl4&k-l)uH7oYZ}@ z^%YdmWs7LyB=^+UOq=65mcpD0>2Hc6xi*X(xTTJco2Z*x#u&%tbJzL%9%7Bw{!o+1*~UA&A53x0 zeCfFqY}Vmh*-g?0YnI4J)wEbHf6W+TqJ@Q6>IExhJndyu0zbS$P1XBU{SBiK{x05I ziI@4oB}zwxQuf_qAAwmr)T-zSnUDlBTw|GmmDRrR9I6+)e%V2j8!%9@UL!=H&|ewT zca%Ohd;^O{OaXyvpjf~;;$&VIWqj#qzHASaK|elQnQ&|p6zEVMTX+Ifm8?UYSYX(0 z&^j400+Ur#1Dl<9bNb3SZS$4d0=8WPbR-e4OQG3r7(%q!;89e$dJAwYoQ~9QDxEiq z?79uKQLf;hQ|(7UMY12y<3i{?7zdq(;WOVKo};MnMi^#_P3_E+;x}>1*EN2#0Gjk8 z<>Z!8K<{Ua7-f5R39Wg9%1ELt^+f=!l z%7DKJoqwNR)EsYpEfKXea8jd!;0I}Xs(*9u!XY#eHenstN5UF${1T!kVPTJOoflvK$Hx6 zFRl6qefy@91!9viwZlyQpp@e#(m_1%@m58wdH;fZQTWzrtcy!}bK8eCx+2_?hd59pUq+O`?i5`?Tno2)ce zoZ;%%5UDt(WF?+jC|~i7Z6RLx#OK1xa^ufC-1Dj9G5TS^#p!_r@N%9GR9xWT*%qm{ z0AIoFRiisQl^4^S8sw?B7&<$xA+tI$uMj$a`({#e07>0L@JLGKUCIYC(zBaYY<2oO z4lXb$*pq&!Bq|>|?Y(Qz7AA&#ejv3F(+@#fC9zl8V{VH2cwodFl@L#_wRU7H1pOLd ztWhGgq;AdkbF5GC#f6xV_alcdg6;%4vI`N9He9*1lv#q=+ANz;z;-PfJBN4#UdgaUOlpKqAMQ6z~X!b1faO+zS zRk1CeWTj#}B-=@XuQKknnw=P^hn18KugZjv0t8l3O@|IBmA*{n#|84g3RA;^QGwd> zmF`Mg*8=RpGh5A@%6UW^zV{{TO4LSXn3@%0`aEh9w%qdP8x?1eG|4k>~rIQ&Ht$c`46*hOf2mGyDj;@W8JPaH)1!$kbG9uPZfcq z*L_UfZiwKK2VHS!aB6u0T@Ani#S3X{NgPs(d6?hctIut9MI((?vB3lMs!Vt2ODp7Z z7<2s67v7@QURD~(XHwFc#j2FNeY-QP_*Mpxn0s|+c4%|I?VsM?*RrBYcIO5Xqe^05 z_fJ~s^}26W?ezFR&{H4xkErz?-gj2`KY!B!(=PDycuqQa8&wd0b>#tDOUn9%=+J7F zUin<{CSFU*5JJs=Z%Pb>DfdA;PGa1Hdl+53Fp-%Rmen6O_C>~SpHF1EUuu{8h99|9 zo-Q81{MP1;G7g3rX9AC>plvWg3Bf=R`B!BJ^voBHBn4ndg?i zW-YT3D{PidI{Q6HviT}HHes$akmxQ_Vnsb)cVF7&*zO$ELuJWLAZbDSDR@H7V?hydb$4X_S= z9}G>g{?xJOwilP~jnE%)4?I2os(5rTdhvLMo&pDp2xOorB-UEqznZRTt9!yQs8+N= ztg;|S3VFJ6pywpz+(>pMUVk>BE06<#-S{*y9Z?0~5yL(P;^Z?z*aw$!m`Pt+e~JjY z9xDOv2oM1;9-BwY%ai*dpbUc`WMhZsqTWS*Z^00Q;!9^h&e*VDqAF(mjJ{c>=M)=((i~ZjY2p@qG zu7N)6or67smyN@ui<0#c@V>*S+L+qU;-BOWqFux8Ct5qoe;Y9HO+27kJrhcLKoYlNqGJkfSbT?aKu9C`rhs zH^gz&g1RXMebCXiuGK%TQ1@4e&cr`waIbTPkS9^Upy6%F41THU>U`mMzw^DS-`Ki| z9!o!6J@WdZ@bJ0&{0wD)^5 zscu=Lqx5w`w0yqweBQx?-Y^P9gsUw;A<|5)qPJN1UO;h&~NT%Nqqp5gryau}Yt z^?7xf7m(|cYAlxU@3kDnsGnWE-t@FRH5!r~#5%1`g8dJMyAJ_y6JzVSNN=tVz=`_b zk;`NEKdQ%u2$tJp9L&ur0hsR3!bm4Q4ek`<#{4)zD4TJ7_!AfiL!mD)qfBt_rypdKh5GPn!YX3SAa1`j10fIu zFr$!}zez+g=_Bk)d>jc(Po`i8Bmhuwb=K7`oX+twcdG{^rOK0^Wb%d$_?aty7gzO-%AW*lMcK#!X1v|fT`SGqmjJ~77l6l`)m!;{*>?-r;psUVq4{hW)A18U- z9yuZa@P|{LYxUl4{ghatZyfE$soYg_LO|ccd;Tb%G{`#}UjfNgEjGcLMlekA3T~1C zvN)>438HZ)&;j;*X@U~GCDqEs*huv11?$q>+c>z*!t>W;GIpzRWuWtqC<{G9uXJWX zW>)k89=6FwkH~X{ryfFBy$PdJht}scJhzQ0@61o>P#*Su=J~3Fg+aAyEx^^!s!56u zr^pv!<%Ufz>%W_AVW>?$VJ3h?Q}4tCLB2i6v*pd$Zm)W93^o}fv*O7bgeV7d#3)wh zidQt!gh98oJ1DeA!5BXyv_3y$oB=keeQrKfE6_PI(AGw6%X@@t1ed>o+S!F@7E~ec ziE6Zx|0YEc$8`x<6C$|pG-{W&!otAVryEqg{&r6l^kSWWExe%WtC^JB!{gUXo`6tQcAUCODd^TW2)2Jg9 zk%Z_32S0_K0cvykwl@)vB)|}Ov&SEg1*%i}Hc}7+OErXm^iV8^DnYSCL=2Y{sZt!F zY&~$g42g0IBn|8vQI;y9T7w6~2QKO`{kaPyQnV;iL4{h#Qw33|S}jAIO2|ZTEekh2`3+%9sKUG(&VN@(tP6&BFA5D1?bofG*#eM*MW zhpMmsp;FNfIU~aub*B1r$bcX|1X=IOso|F@00r4Th^%0Nt#v00j)Lw%w+|NWU%*Qk zUScr;&XaYGmM~}t&oHF>DRxuKc(vYdZ23>>d;Ha3NK@?fOA7U$S%u-C5 zm^Y;*af7;v{c&h#LA7xhYafX)Y%Gb<7omyKhb$6If0kU4Cd~r=`1_wEWBs6#V4kow ztox`WMn^-W?2u$6{ToN$8KuU-!D*?qG#e)GkRb?ojp~p&pJScGoeatDD^G**#a6P=EQPDhc;nL~9{yS97Eo4;E0A>pC!(4`nhjuOs!I8l$#GtprG`|rVIH+* z&gaj#*~+i6U;)>d?>`iNtjzyadtzr||8L9DF)CxW8w?2DC)Ccx0g-z|mV)v+4Q*kI z5-Rzk^T0+6EdUx!Bo*a9J;HD$LuCrTK|cR7_PW^Z{uSyB6=p@n9St8fCnBCSDM*PN zv5ku)j|CnpwnyNNm2SXS-krhmU^Lvl{7sR%3?jdYi@n_Kh_M&wH0RLBowY{G;cFt~*zv+N~p{Kd_^ zP-wsA>PFz?q;-_r?$;%fT-uGfXwd+O=-nK3Ur@6tvf}YE)NWo^o1)_zkP};n@)47Y z?URC7pqoWS8|IM?PyiJBh1Cs5=B67u-6EYwKQx@|mNdDCfRD8a7lM>)GcpOP8EnCJ zEc{7ijMbxzu(`Wj3u1UR^1W~gx5;`(X|NU^`nId>sRoCi|EYEfs-d%pl{{KiPAkt4 zrcR1>RQ&|s4m72~{?euDv;&WNBqJ(S%5C&A=WUV&rIlXpL0|NGfO(~z&XES6o|+6c zms_$Q>lK~CG_h2A66BtiPye&x6SX`P`*9YH+cDxY%>BgCkL7n!(Q4kT#dB%{K7X+j zmcVYxvTQWRFif+rcp|oj`NA+0$A`8JBlr4NeDK?gGt7+q(OKe!U3DBy+4YC08xAQH zg(4Bgha%VzrYX}N%7zx@!zS-`?$*q3#y}xt>L+mamw5hnC>m{hN z8c~E0)x0SJHGmVELI8`YUxN%=!)Mb?>krT`t{<56Ba1QUvd!E zWuuV@R(z{ih`8)GvwN2rse~F-Yq()75w#Djm=T%q+mRL~p6R3xO7Y~-IJ*rFr5CNe%S2Vk9xy7t97WwLtyYR?5 ze?d&hgQpHGNSsvuc^+G&m5fr+OgqPy2ASy3X-m@U(dV?KRc}fRWyu76MFz6EJMA_* znj|XPYcYagR1-Io6tORUISCz=R9MwGnDSfXeZ^Ts--(1 zEol_sArZJC^ihTiTy|&qILsd4p0Tum=};mU`JQAdX`hmbWZm)KzpoMfa}_uYfOx77 z0fC6paV`++o}l!}g@y~=iWt>Ncye=l9DE%1Hq7EB)&f9Szz74r=bxJxFdBmx7))9+ zoz3-mm>OdSlFFT+!0kkYp1PUvDY4WX6i1;iZ0mrL2ce4Q>+Wd-B7k8sE;3RoM_}Id zefOyxxUSf57h!fe>+B?xGLTz4eSi~2brPF1lA`YVt5MVL^|Ea;c^v0 z-1pJ<#{6*G^m8PX?!1W5lW-^{zQLW+Qn_OZ-op8StSN*Tw`Gm^BNQ$*f|-nPMF5OQ zK(B}d{(u7ph6N%%2Dait!4MN#;D_v>7WDo2PwNLGT|(;nAOh{PB3c^q3k*0RXN=40 zkTU>3xEvcn4DaDPC}uE~HT8$j-O}5!NLq^mo8X8GDeFD1IrQpFZN(aZL|APilD^Pc z_Y17}=37-#6$D4EZc|uuLoIz7G&I#L6yFQCLzs`;H-3+b%(2WE@JgnPiZTuXCtxxD z+YgJPrx@0XIeU7W>SRkn7fv-Y`FS6wknT8^ok&X@UwkbST zDAwysY>W{c>mrS@I)H&45N1@mw?_-9oxM`0+tnW?jMY)U$*o*>JL9(I8{g`jo^XpJjYjgaoSJ z-%3waT(si8H{||j!CuL>qWDkpv6p7YIb?^Ox0f3I_=fRX#P7|p>?f(8Q~u5a)yGHP=LNB?y}WM z50}H2h9*hPX!lB-OVVMpS9>cQU?q(P>%pX0%zbCA@8b1l8iMjFheH9Nt!HKTyktm{ ze2vbpKBDuD-pagSaIS=Vy#tZO0?D{55psO9#vq zZ>peT4mgbP5g zy@B{i^j;)kgJ}a0=R@|``JmCOfa_TA`Qu^#6FQUlKcO=-%$rHi*UmlNjqxBhfDsc% zaAAWPX1Z;y?G+DnE0=*_X<2Safl*jF6t!!Tv~;F7N{6iN$I`n(F7s}t07&YeD0#4pc_9=4n=e>TUUgE5#b6-n$`k`$08or1817R9-0aW06ehQVbxl!Y z?99|!JSzrQ<4HsaJawpj+vaJBCu1dfS!R`>?Bps-r~^o$Riw5D-ES7iiu{F%O&6jM z&V@dcOPgxv`@J$wo2RFvvqPJzr?=Ckwbk`>E9Teod2qjR#NHOrnoXO!Q%!fhxiLFH z5ZnxdM->JR8<=9WKzIVvu!8^N3!XZ`ucQ0r^!B;Ntfl|+q-hrpSPJJ>Qmwu@{~+yIeZ>RJ%&$R;=2W&)&`3VpTuTuTme4VcJ zL+EYQj}wG(2hwciIXE;CaI!)tg^gu}0px@ugVZ)#d3G_J1>!kShy3SFfzIt28)TCl zF%cT&Zciwo*!^1pC425LF7lEBO1b-@94qWbSmaZ%ofB#)5sn81J0K2^;&bQY$gwtK zQ(!jE>igR1)p9L?)}FrH8*btRBWg`^XJ3N)5>Y?oY{E769Bn8TfswL~^=6;MIY9^s z1fQ%pK_VK%afrkBto~k%%C=4u1x4Z%Bg3C{;l-_d;q~(8+|2CCBaj-iOND1cDMs|l zn$HI^F$YR=MTgJSKbD6|8LTMSFb6 z7!xyGQ7f5-RY~6St|7bbG!%PRkQd+CNX?f%1_vKl`}-<(!BMIYL8QaG#1Cxtr0Pv0 zF9(K)fg87@iwI$A@{W_j+Azz{TU;b(Kg4vT~3`UXe?!+KDcZ_sq5EfLqS>=@%w#`IXwus5aJ zFe?y0RT>k9a!i+-&p#r-jI|KX77Qi!fO;dq)#02hQ08xPPp2bDJZI|#55Jr-Ny*d; z14|b?z%lc!tV5&9;I)BeVgX5IAz2B8`@BPo*j)OTVEv`0(D05Hx^KB(7wo#@$~MJc zclkwWlE@QWkDHcrPYFt_Y@4?rXL3;~qxG8+@`SkINr~4eRbq|me?))2X(2dVQe)Xx zDwBI|0G5w8RIrXY)U0_|rR?0}^W7F&8U}icr+(_ZeE$JU$A~%Zp;h1cwSC+--0bN~ z2{5vDSt6xcp+QTI&CV4d`P#V8X* z{OJihuJgY$Tepq!ZzV>V>n7zvf;9V0%|SdwPLJ=OXTPeDuPl^-WhLdY6bmY3cGz(1 z&(o;Y(ppMEtzcawpipkXi&+2ov=P1}QYZgXVnQAx5vnbgMA}V~?VU%oQr`G`cKvtE zr2f@bk%f=$qcth9Grw z{3>~H>u;s-&wo4o1q#RFDp|#psqE4wzwSh)Pn5qcLM5e>w*kS!cd2h^7>ViOGSg^6 zJV7FKsfBMX$!AH#VaS!Y@1InY8&tzeW_9)hcJE}@I~!Bx6Y%J)%GHvX6BL-e z(?(P>v~b=VLIsN#W$YB}PIjM7`L_?evk#k+S?rNXG-Zagrr|?dXa{;2j>vv}VyaZB zmMK;tcxALjP2&|5j@c%EnjYT}cCAQ{JvXk1=F~n&E<0WR7C2<0IR|smqVmY-ZLui7 zxUzK7@?6PNmP+LUnV_gFZ~^fLkjtBF0F<@TnA+fCzQ5@rBybYqsve}sDa6`!2>Y0Z#bLJrQ?|mx*QtGBU?TKwyGik}!zYb#btF0x5pT}JsA_hU^V+kS8=jx^@PRj#xKPKwVR;68{i2KFErpBm^3Jzf;M9To zsbgPD%<-{gJrmaZ9Q?|pi^;6EnvgxwL`+;>9`tL7TN*7L&ds6y2KH><3jMD|Jv;k< zFf22&G5)s|V&?i;=HD?t1qM|HWd=sT0ufLaEiwt zeqio+^IdQx@WX&1UJV|%~_E$k|~Nqi`y6^7Ir5C|Hg*~z!8$rmkdpS>+0&5>+9+W6%@-g zI#&I^iN*8h0XR9e);I3H3sx_2i4`K&xZSxlGPT;ej^1X7{g;E``oHt*4aBa>>8Q6y1AJFt#dK2ac4l!F#>GT z>d*jC5tzj%VgEz9Ri6L=&8I!xSx!eN1F%F(o&KRvxth}643Hz}%jz4M2QfbRJl?l7 zgK`AwG664>ngB$>6>$B*nD{d419(lt0iZ^{@EiQP_);g3?(EG8AR~KjffL}Cm*#fz z&nSU~$fuwjJ>1_L003Ce_%?xPa%k~;0Pg^#wecUZ1M^FR1CfZN0QR@T{ocrHj7Ta8 ziegS`ESb{dW%@xqjxmMgR%Z0l(u&WCVjj?YiqPT;klA*BG5&tBufDq6y6XA~nxwgs znfkUITwDs!*qWZ7LnWd8uARz)*lV4{IRx4@HZa&b-Us!^0VIG&hCc2^D)Zp-|5j`G zCiT7O|BY|m2GoCE2K%=%5A*mOw0i~P3=F89tu5HI?ML;EPFU9fBtt8!4KPCBB+VVX zGq*ED(CBx&@y4y;3E-@;Jral7cfWGdEB|hXY-(v|cJQ|Gc|&ZPx}uVpno{`Fdh|mj zDtg5WupOO!2_VKMrv^Yx%}wv0l?1x`(d&@xpZc@hf4`x=K0S%o_aWbI$MaQc-0ElM z|GWcQ0Q_l31NzZA1`25I2j77QO&&G2fqwCG;_$O^^s|%vgL?GiGW%mEnpnfe=67N7 z!}$6$2W&%Y!}HVZo~5mx)=C@S>bC*f`D0Z9`EKSSdSxT?Q!BR)`q~0bXm~f%_DQV%V>M?@b0r}4Je}&NLkl3LhL-wMJ`ROX(D-UM1g)R?O22Ok$RPbKRs~>Mz7r1H z_qoSz2+kn=BWCw@=v&n4ecwB$#TT-3N}IRuhd86fSMs|XG;a5pD)_{{55Q3QC1$r( z@q0IB(|45nP6M!C5qr+v@8zw--tY%mGef%vSL2_APZ!6@zkYq}U;@2YI~|{9=HFI* z&uWJo8bH6_VS7)j!Ao{;XoF|)Pic!cZjukZ*{e7lzq2cyoNtI1Q^Rj?Z{mG7rdW0& z8XjC40l(*4vc^x~o;!mtaBr*iWBAvR@GJb`o~Ivfl#{H=t&P|30>6uqZ?|W5vyUIe zUe%jhtuM66y{lnkGhn8VDNOK-UZv8Xg2aOu?XXs_p>O#2o$ZOq*k17``a>wkZ?7@m zjjp>paIGr4DefQJU3w75k09J>cBhk8>bG8t9Zlz!x4Z`P*J ztBK*QZ}_lQjGEtthHicP+mW>YIDFe}Ir-iLQxRIE=k>{NYi>&h3Z38j&ul@f3ML@d0 z1}BS-Md}BL;fWa4-tYOmIQnP=T0^#icgaxYIlA(oC>3Bnxc5tW)DKjA9}8R9Ro<)R zl0|&3m|=`jkJbw;oukS(&Y8y}hjC#fhI@x`;ek4LdpC=bJNZf~lR%H)dlJK5?5*>I zE%tHVYpqI+&AA(&5?=?881fclY?|6z^dMCRchS47Bu*wQs>F=gV4+#)D=N^D<1<;; zvOvY?ep<$p{1?u*6Se%LS7M1A8p^a*8Cmu##J$LEM3#(xvg0phx{tJ#*RP|i8 zQ?T%$wacjzTX;raq76yNEv+z2=Rx>E>LS+?e!<`Xuip$!L*lFd`-CMn<9rw09&exr z@@Xdo_rs;{`e$JXx$*!4H*d4(%Hg(-4!-T`NSTjc~kgkR=KXO9e zC=}v^M~h#j5Hy7SDHUlem?BH4S;wm9&Z1zXkv?7hmwWB&3+?H!3(JKX?f3H=30_(!jJHv(LfE&&g|tmz7C`kc&va!zQ#xE=CXr2%6R%$L)<>%V1i5vte9N;} zP3@`4nA2R5O?7CjMLH{J zY0CFgbGG6?-aU+kmtJiF7iutGbqP%P5GuQO|Ta- ztX{;Px#m9TYEas#Go`mSG6}>c*+;H6!i3~U-V!%K3yE$+E!siP_%MZsbXZzmg3^6lQ_cl} zf^{v93g~uDOtQEOBrUNlm^uj(nY-A^&So^dr8#}Ad@Q`SRFa08tmkE$cP(>cgnZgW zjf_G>4kO%mDJ^nsPYpv$I-iEb{OX5nZXa)}A~D)cGgynp`IrNL0?f%6u!a!6uKLF0 zqbN_%U%>LRYj^`XQJ9qBjsDld^|WExWZMUJ6i;P>3_ zt(cvr=2xSF=s4=k7U&fnvmcYCdbS|n9~%&urUS_1ZU9kZHC;h1t3#8_O3)C=y3Prg!D?0#nunTB^~B&X-7r(7=< znrSUc7o?~Gy_bEb3DF@DQR@O_IKn9NHF*fpn0TTvyzpAbH149@B0M$zOH^FHkcYx) zdBM8FcAPV0NlvSjT)?tov4zle?yP;x&FpbrSq?!r*oqAQg$%u(Ey4sTkqrJ57v8sC zYkbVu1=~Pgau@|9fRXr2kM7qCz<~vqySE6ciGbjGjhk=Q7^)JOSn&qj%)3Y*XOYFU z6EoRC`kQK2vcT$?(j-;8$D)C4KZ+QCL-coH`oy0a^(-&Qupec{EwjHlj;7nn0A%X{ zW?%C@dcISA1V{0`i?Ec^;Bp5xgX3;e+I|Uh6F~FQQ6@Byo8MoO}Nj!{*h&_LKFGZFz1s|*M06wDwz`*YRB{Owq z&ABf}9Jl?)tjcRdQgN>ua#O&V$!FL~wv&Wls=#MYaXtA4bXDFDOBc#99rHO(W;ar$ z2G4q&oZ%@H+skg)x}n;W4RqN1II=sc#RfzTes--H)$#;dPYgWNh1@{oK~u_KX=^En z1}@B+7=cTklU@E@{dlEt*Hs)X%Cg>c%Yx%zp_<|yrb6xZ1fZi8oh*mt6avc-MiAJAa;`4f7!)~DC9Tm7FJqLFT%9nJnS0;Yz*9OZT)8D#GetJkwVJ@K z9{^f~xd!$4TE+&@>sKfL+~_M;B$dim&uBGk8yulFnjc?2oX#Sx^G*jbCeuB3J-L2H z=ys*YvS~2A-Qj3FZ1E~Lk#i1D!g)}WfzjoIu5z0ocn;l*7S@bVc!-k6e%FRvrvPnv zekNyjZ6-O#Tq=xM2sV~%k2W!82plKNTSeXyJ#x{%^$ODaikk&pwVtfPoZ-Y#bbN4( zBmc836=xnSYf;kOfA}24NfWDo<=>#wtu#*JFbp2MxY$(UR4Y8J6b}p;L7k9GqG5z2 z96*>f!A7r$TD@nN@-0>a$KR*PT*;5K>!uhs5Q2!C$y=bwW6WxS3Rn+Vm3-)QmseDa zuN8NeNgq`vY-{-06YLEO{}lLDZN0PkhOI^eKcPm!d1EH_=?c}qlS(vr#UlFZJ0;N~ z!{)V6?p`>-wf&)N+6wuHoXJ|0In+ErOC{TcC|a5NI5&;VXWFLocH*I|>8olJRwe1R z_|1DJn>^(?aH|nXDy!Twr3M7nvvx0Iwvn38ngQ$b^tQ6iA+3W$W(?%3%u~0b??KL0Y0Lf~qIysmtd+8TCi4uTOjQsw(` z%qIhKP#GL+8bN*V-{Q@x1dGlaT@%p0*R>l?YpT8(T8D@|hQpfu(Yd)0%yUHfvx|Zp z1UDs!F>g(bNPKCwZWfZC8W){AidchD9@K!OE=}4ls;Us5X?wS06?Btyp9(@)WxVlJ0!sIsyBnDx2jP7j@?$k>z3c{{e zAlY@K;Kyx>Va%r&#F3N{*J9i#(xay=vC&Fy*0J14u??i!{%&hl+M(WY$`X+TDOF)xrDPlF6|o0`}Ioz;A=^tj3~ z-8w}uHS8ps5un4`5f)S1vGzgtye4x;5(wF*>h^x7(DJa!eSgN2;>9%c6{2_aJPeJ> z`P+tHmL4SNG2&rXpEmY<1%Yq(3dq)0Bs`6|y6PR8x4SKsyYLC_{TIH$e4DDD1J1xb zo`dC1skRx7NVE1E8T5|))z0JMF==oCqt>%nM&YwteSXI4V;mSMUsXyHpbyghrajVP zleH_&xqBAcOKqBGAeiJ)ddRv%UjrKnR%=qfuk^e123%3GNg+?+Ohv;HaOe(>G>m7y zt(4Ek68m`?`XQ`MGa46<#tgya;j;FUET+csK!Uat{MWJEbu$hrgRv^>L|X6tzHz=) z1h|aGU+emeAerVRV}g`XlfZdl?9aK+V-_R#&h!`)1^$sg2MrsYvpx-~e!-rj{j_qR-9YB9z|Us@4NK9Y?wV)+W$<o8u=6Ye8^K=Ea5}@p`c@%pF6x2Q&Zyw0+amTn9b0C~_l(3HN{UltuE%NbU*~Yo zmHS&YO?r}Ux9TUF#E4x1HfIP_9?-hx4RdIxp;lae#Ta6UbJ(loiHQc*Hez4SJyF|M zsfd1&(oIp>HEGUEW-Bs-VacOqcvkz5V9o9OUF$f0JuP1$wUjOh4Wul|6&qE{dgl>b zF`)lcv7btJLu#1|4(`ICla;CgHm7g98xg263zo2=_>>eFP;=WsXAWlhs})y#@Cny5wi+4QLqBQO>vwnZIj#TP%%_oR2U^ zOlKaAS?$-W`p*11l?nGkoOTY2oNwBR++482g)dvL_w&k<^L7-`15=r?prni9^HNZi zkz4a5vNHJ8pFEUE+z1{&NJK(6qc-I?C94A|g8fs81v)MWMn(z8k5Z`v6efH*IsvvT4TUn@+Gf4ulDM9Z!f9Oy|3Msb?J2?WfBV< zTM+15H{T#yNDBWhLL#L;dj}0FQZS${b(QwHeGH+0U0^A1BuC^!1dlhxRfWB% zuI%NiQFp&pB$rrx@+Y3UxH=Y;jO!B^B+Wye)+G=1V8H@I-+n>NxYhCY4vOi!Stn%* z!9zOb86Bc&(t&U288-w{nVTZ}wfn~#Zy(5N&Q%_(=Xr%)f!`HGeN)H@E4X8j226p@ zEaCSdY=oMg_p3KewhP0$q3M}zMDwQoupqrc?-}><5IYs1vo*0XHBH)`;-)YULnCmb zh5dUq7)%4e^(gsEs$7WFRJy6KP?a3b)q#G>lX7*M$ISA4G2@ejV}vJI7cKeUYP?s?xB))Pg(4Yy5B zhi*6RZThN2)plrnHg$t6854`kAzf8*Jet|X?fl#|cM43b&9q&ny!)<}KsKV!2y)j$ ze#^zWJ02TF`!_zH(Wwru_54MS507=lbJk9me$pXe60ya$H*=SnZq*UB#tgl>nI08E zft$l<+M(~8(|BD4)BGf5ALTPD7U33)^V6a?+)M9Np^(}U(dc*4j}%`wMeb}M zgI{0?*m@V}x&i&&>&AEow=O8Xj_|nBNqhRVP7e+Sn+UV{*N~SlX9`1SU!f z)W;LB&t*L8K>k|WQlP?FSB5cgpTJuSj_UKyqL!$R<}0uk1fWJ75?*E!iI#nCmi8%5 zLCE!+U&*R9lP$Nj_9zC#oq6@xHnso|XW4%)*ZbL?S|g|wG8X$cZ#%Vr_GB@0zpoQb^^x7L?T^+L;faGpxMmGcHJeS`bt3+b`Gj;f?!SJcpVnJNN3 z8&_LR?;D|cr6S~qKmfSqb|=UZE&7)7DhKag+Z&wAI)m2msKWgy=>jT3p}DG4uHEad&DsKSr12~w{X?`*&*Oa6K9Lo%Hqps0Dls9C z2+3pF9#5w`c|djGU2c88f9whIrn)$BHN+1?bNDh3rAv&4(Aa^^S?FiPe#|Q5uyG1J zuC{tIwO5-MI?AA4(*Mx~C!;(3t8PvAAmIH_7d3?>kL5PJ0dH25KvFb#i2F1wh(4dO z)Ta5XXufH7mK)}|(2i(1Y&@I8CW$UNF3vTc)go}PHvP-WB*@u1_!kEY3}&@(5b8~} z(c+^0r$UVB1UZ9wP(%iL7@}gxM{e+RDsult`C1v{>SFrjF`QIDOmO-)^LTxNPk|Xt z+6Xa3{ZiwAxL&%dWs!s^klMxt#ru~9%*4(t#tw$JcJu zvlAV|;q4oEe!7vbQKmuTh~?9s+dnuZaQl|^jvGqmJ$ie?&GntJZ`oZllwD8~nb3`S z1{V}{@w>WUf8qV=D^8^A_ua7DFWHN2i`szkq(bz!EayU^nxB1iuD0!ubX)Sf?#`tM z5sYK6Q;4P5aG72|6Fl0TUQ1Z}@nV_q6flNops^lzBRgH-!>t=kY#a0--CDDDm{LN zReo*40dA;VuGh;PejLS4iN$!4AXlNe+Sti)AAIRilV0{`Ry?{pQwAN_%yulE zN?*oU&ZW6W;++DS_Xl%~dhjX`2QX?#E@8Df1hKn`W}Ay z4z`P#E2j?9b?O4mr*X%Y%LjQj)=N@rux6sR9@#^dIDAEim0}TT5?skHY&Q5tzBE}I z@z3Cys}Fd458sdqv1$EE=Dx1xZVl{=mNmPm5_0$F1PI91EXyA_O!7al55Y)tJgFj% zh>5IY)~Ttb?SD#Phv;5FwfOd-)o3YUQev>noxMRQ{VRx=Uq8Feg)Lxb(%)`D*X(pA zE-K~wb(<>ch&Nui@USDa;QMaEW&&orP_89N^6Z(PEixidsJz!$SN+p# zKPj8N{>ri*C*R&r@588erERPHJs1?s&daB@JJd%*{(ZytRn)OHpQVG`Ng6LupP}y4U=pYd+!2`_RT8Kv>-P5PZ)FZM4unB9s9RB=@hWNdR&*!rYdNOsAEfyQbyls##>e0EMvyRLKARAseH7jEfQ<`^pQeLFAL^r5kh;}{ z_L8ziUPU>l5l!)$Xc%-lx5sgwoutO9+FwzzILS;=Cq1VgL_h2uKS};L`zzd zl^co6lpFBCuTrb$WM?R3=CVcBdTbE#(O2NlMJNTanEkTvDBh1iUh4rfzYm)GYMd`0 zgxb@Ytz@R5=1h3p4;O9#QPBjHT>@J>p-AengSO`h7UFU5ag1sI(9*gbHM=FvgSQE=u}FzbREm$8YG2^sj!DuqmD;Cjx&!;cNHu_%uA9O0`Zs+n;;U=x^H)+5{a=eaqH=v!> z;P5O&P;`cx%k%7|k@)MGX!p8!UO)ADX1~v3L_nvNnqVgk|IkhUPHIHG?=;DnZB#F> zx>eHH%<_9*Rhr0a_X%^eO;mSL@CW>ES-!&q-ux;VK1_6MJ&DBKp~>E;SvCOE-W+fD zxOKqh3;YQ+DN=2A9tuLCQ9YTXWc?s=8J*vKYre2mTbMOj(LItsO%U8?kp!BxC{oiE z-u}10u*5c;)cPrc26B)5Q^F!{y1-Rtxp4Y+{+DX(ngr5K$oU zd|OaQR73(+7v-qB6?gaP<_ttz+ zB&)rCr@MfvbjvKtH@i~#TjA|pLmCINOruECBKAB6x>WeQy`9}Y7MM#kkj%*p(Lq49 z)d_ZlQJWUUl9zc$G6`Hn&P6vnqxq z3XMt*HI7=n0a2qaq+{`$i$VH#iCEmC8t(@Z7lZDdkjO~p?2i%f567hn>C1H?)2^9B%AYY4cDlyN(fUUH?(7NoYRd!}z0~P}%Zv?MQFPi0a1%YD4rx zI_@2pMIyR7AL=_sI4@0?{`crqJ$+r#Tu5W+MoQ2VsOt*Cd=b3P->~F_;oTFf@1i8N zg!_lB2&E49jUJxssPwX|9;!jwa9!ypHu!8wf+TYMF2BfnIC6Vm{O~Cx5+AvUtI)^&+>xL|E&-C)YO!W*O|T zXeDt?`;%I-_o9sPJKNrm3q%1Vmf1u>DIBp5-^D<;24t`qO+Z3L`K z>7DibIti9x;&ZEG z!t7vJM-1Z_zekiyq+61@i^I~D!pk1@AX}VRgmW;G3m1Lcwt}ic#SrfkL6OhfWrtMI znH=EmJ(HM?K$N~b{DosU$jxp0Y!jwV#M@hP5{}YO-Q5g1&Nk{VO%jslW^G3uv3@t5 zJSvJaK^ZyZ{>d3U3s0@$LnZ@0x2v4H_R#jgCHGQ`$n}ue4wAOvnnZzrOU}5rlcdba z!#gK38My1F^Tra4&RA=gmqf*2=WL^d4 zEq>a`y6Y`mn_4?EM%cs=#u1+}_%N`2H?`J}>}*o8e6GqIRcr$w+>;>{dj|4K!++_@ z#VjjG3E>>hUfHS+=PJGX4ht>0fv)-mnHF-Kq+%j)mQFxdmNKi-iX874EU()f>ntnI zUL=H__faSYHr+fTD?Tp}4bidQ;WFW3ID0isOVz#x@iA{eG^?8*ico)-JPC-h5{CD5 zV|b?@GB`CgICPPk^29(CxDhi>Twn`zrh8 zSL}x#>mGDD!5+Tb8T!6EG=qvBC0aZe3uWGEEk*B-ND~$NNN{8LZB4AFW*?p}T*ooF zeWgg)#Ek~*aboK@#i#tw6-iwah4y=4YKzOex;OlR{wc&Zi2e^HICjU!tg`$)8xA$Ns6GC)7@&5 zqbg+#@`DxZ2rNP|mwjC|Ze}I;5}c@GQf5#90+JqOhUEkJr`Qeb5ur3X9Jt!TW2N3RJ(P(|ej4RwT@s)mV3G1r=gFwVum@N~!R@T|TQDcijkp%J!t`7{2m* zFNkrjz%t1!qU>Z19Sp0`XF45QyB`u(8lyYe)^{VgNUG*ZyM(TaTtxa&ict8{7T?yN zC~YK$fxl2`syuv^8A>Na-!mfhQ`xOgc`byP+rCKNSeL*fW%$)t?LaDo_FO?VDdniN zv$3xocLK{*5ylEcCjB=K9`|JkEfIgL2GH%aREcpP+X=5mk@EC!o2PFr{>%ueKmX`L z#iN0pe;#iR7m|5N+C+RD|0N#kk^83U>s|Ma%tu&ClY-eBFqCV)R5nV}fTS=h)oUrP z9AYX@#M0I(ekS= zJreTQEkqH2%TR1(*U!!bQ7MKEkLGzNk%$X>v9Bq!l#G*3EmmI@S4%m+cNvHb$?wY% zGq+=L%QI3=Ah9}?6Z9P%|HUxJX`92an01V!_!Bytpb{9rI`KLk*8Y?Vp#Xnb+_p%} zWf}u)|Byn#@hA=_)v!@%&dJn4- z7Eup9G2o?ZE}!h61b=KhdoD)>g?OSF!(^U z=@0^99K|%D?r{O#ks8bkgYu7LrIL*HE;mpnk15HH%qkBp`W^u~9LV9P9Hq7)DJ8v; z+xS}W0?r#-&%j@c*mXUD6lTd>G!?ffO-ud9?`jtTASIS`6@`I{o&<)fUyJskHd;*Ovnib_E4mD;A zaa$Z>=7on^nW!N2<>%-i6JhW-}2PXGC)T85O^- zNeb4~ZOh?A=ZL;H4sMGlp>1+Hc1M3?PxY4ib!XU*0KHQjjL*9HQHnxQnc_=@``B|< z@l(#MCy%9i1Fw$4U}By|&v@$q#i-%2ormA!-jDd zYTZV^k87Z`V`|II`_KI$4T!{}Hi)IRBJ7~(mU7O_F5MgCIYS9gEqV!i?mRzUvT7*N zEjlL7%lfCL(s|C+9`v~E$5kipezjtAL=!P#Gs9N|NjAd$mmUcpr6=^c+@IFw3|1$G z{g7f8clq891*3RBb5j{Z2O{xGrw>IBI`pWJ01plNe#C43PVdV!w5yoa?6U)8X*r2S zwnGTHE5CG1T(s&Y6Oi@yBC>sSzJksmX|xCG>s10ZEH!OL--!!SQi*%=NWIE8_V1tx zbZ?Z0cKqNRF!bOAMx$%i7JOEc%gC%Gooln@3p(br+ zcufvaTva8n`g`7G+63bwK0qsXHxhv_3-fYq))KlSjo(i-=Tkb+sXQJX$iFA%J4#78 zt8)lh!M}UA(;Coz5`*?Js#59(_J9{bK3a6ToR+BCAyV@M{!!(qN8~sI?2uTS>G?W= z?;*$EI%HlVTnJAv)_ys~%K8p{DqdT9IH)AAH*m#ep*F6iuQ-PFbF$F#w=Yn{YdRD~ z7U~B59Pnx%hLV!@aLve}{Zkl}>+r-Y>quFzL%IxnCvfpE5hh-?qp z5^q(|?vY)_st2FV9W#{-;e|fG7C>W-Sv~vE7G+TmG{?vqGerwB;IgmWqq<48mJ}Zc zJNs^Y#OeRSe;VIo`>Ah3qyGq386RKuC{MKUC4mFyoVknwA+%yBYiF7}0T$5QFC)2;&K2WbwB0v+UFipfVM zKPA5k>zl|7$FwEN^VS@eg}_8-A)E%o%H@SVg_v0%NT|@IY>vWJ;_)_4AD%q8pa2kR zc`489Dsc2_YVCe@AP9rA+#Y7I$x;y7hr?K*fr2Vyb@4e@$$v~vBf(bTC%xAn<6Z`Q z0j<2G4(iM#e->?TkRJ-Z&}Onmi&8qB_eE`5K#_uJd^+dJ?Nf%toYI-c7iK3);4J4^iK2=g|}; z9uj7QRoq{dQHiGdi}6TH3S-f3NloqMOR8qWg|!X7g_%2cLN$etoEHR6BxU7tUl>wK zX#8v!d5u5)*0zW(82_Jt8s~`bR zI%ot;wEJ?plT^gM$?P108TQ#sbn0%l>p7on_rgXDVSO6~-LLK$F#MHAc09T7fn!zi zQ3Hr~dTFLb9etOnh;w2GyWe2k9K37BE?uXf*<~;?B@14Ktc}B2S_AH;iI$hZoN@P~ zZLID*k@5@@;bE7ZUz&*)zmG9;7H6~*HBhlaa6beO1Q`Q4F!ck(9bBmq;G}To@W!Gp zxXbJr1+8Zj5ml52_)8VqJ=!-uL8R79#znp?eO|W)e45nHM_4bhK)L#w5cwhaaYK`w^W* zGj{Ko^-u!W1nUDHSTGzRb{xzgYzCIP$*-W{}@PP9m3xW|QD|VH8 z1tC465ra`_mk`AZP9o|@JHH$kGo>@^ES{1Mcq8r0OHGG@LtjjwP`|PUavBA@=_8&A zCC$<2!7gVzLId*=*TPxn-EpB`W_C}Iyd5?Zhl(G>S+a~)>yqqmGFFR{PESNC2Er=u zi0fB{4%RJoMXMYi5kC}r_87O@A0DSf4I8@ZvgZ@>WS01iijlvsDJ|3?IE33n!XGGP zJX{2&zfV&UMsQvsk_#2k&5&Ta;>R7tBt&v|j0jOeUr^&E?{bzmhbRJV^~T~0LwGl~ ze}&?vbP=`C(FCv8=Zq*9akxXy<&GK`wnVHCKd{2P*ll) zMcQkGcMp;i%WH`(_2?^QD`EsvU5;7cH7Tn~#okAZv&hJwDj8xIM(kBHJrZYTr}##0 zdAj1>&~_Mfb`N;kxOAaQVl4eKNn=OcC=(|p@w%SIHd~|ei?1&J0Gi__HG~9l*De?* zAHRW%faFAr;tO=VE5NPDWT$=;FC{mZe0O7hW6eh%S6p%clopEhI!LAFTxN<$B{pl) z7zd*JsMczT#*}`QGLXf`S?l|4bjko!_q%n3n3Ru=VdWc5YNI!?GC>5Qo3LPE?9swy zytvc49Nr(_ouyqg>WCFr#e2r99xmiL=;hX^Uru3`gp|v!Tl0w9cp@TXP;UspTY{QD zXS;uPkrUlmcYus`j`Nxkd^Cj)_#RLbb4Y$0^E`eLVMSpaSwenI{K50Wu)Z>W<$~rI zAx?v2G181YLZeex+l~8kg;b>(m@+a~JN&ZK-6#Brt{gaqRDa3fJzfd}FjD)m^=%;; zuClwkCSjK;r^p{+w3b1`c~8ERAwvev4rb&@7%Cgu3N}HdSzL~&SV)naj z_35iK5K@Fk_W&6C&-5|0e?`s7|m^E*r+9a)is1K%)`T2g1tQNgLtw@XM(krz6 zbguN{g-DIf-0@e;c1e71va7sO6+f$Lmj#ON=}(RjF7i`O98k%gaU+Dp{DVKxmaR^w zhZKuWe59YfxVBIi)eY@P<{af4rZ_0;7K&M37S_zkxGt1DLq6i7uMXaOX<_Mr*SJtx z2-D4e9iS87DL=c`(WKtR+3J9$gBrl^Z`d8*<(Z852!EwJqS&!Z;N8cW=Sl9^TSCEaj>l6>OKd7`>di!>3QAGMwmj z-%q`GEgcQ|6Cgu()yQ(7#51!a^W~y*l7>B>4^n>3KR?!fJ|Z3%(d=IDA#_0^hhQ2r zSB}yfP~o=_E=K)1Wo~7?;~(~{Q^6in<3>J{I+w=z4!UkZNsiYa(m(sroy@V}Vc`%R zuIgHhw@#d-| zbLWUU$A}>=S9;~6AlDTu&AsXu2`@Vxh;=SywxKAQ9B^s&sM_&}Zk4))<%In!Qfb*) zJpBU|3c?9tbGv#Mn-fV6%KYI+!u@VXD&bw)$mEbcW$qgm0q%$-Ijub7=d3xa8#8kh zF=vCdkB>Fs6?(K-4~lVP@HacIh)|jB3PW?6kDXTaxkMGZ8Vaa+7$OCdeK%oH?}Aqb z^qa)}X<|cOX{}Fp^}E`#iOofY?#Nv}^&TSfY#WUCtBDX1X`7T)CW5u4=95nq`-t`T zJi=F`mL*GogWHD8D}umK?(H>v7Lu!187O`k-bFQYF@jweHBC*g~c zLg;!MIZJ_6-O!A-l=zZg5oXhV_E!hKPeAe(wQlYI#ACrLGunZmO8>4H59^lJ6C<~k z^HePNhRy+4zRQu;uV^k^FEqhk7!{x_p&dPx35)!Q7N>!kHymBx>AU#TC!tU!(2Vp1 zi!z69cC!$|2hr@}a@O-xXUJD%WSNlWPv1!s#&!8jHG26p8w?}ZHJ5850tf+a2a&eC z`^=#r{9TXHPpAlU2UKi)amz!Mcy|;`cyUU%hVK|QHCs_x_N{85^<)q)E-p!y?w73m69izdCA7G_;_LX-vlIY!S_num$t@cRk2LbD?G8G@;g$%!Ig2qrMH>|BX;OI8d%Vg3hD=1=O~>u*JAE#C zr)hml*^)EYzvJKb#IP>p#Ywm*`$`yEc|nyce)NCHEAziiQDr3&ui`p}9G<6S zI%w3Ap3dIZ5kpxKnuu=bj?o8>ERdn6RN`46d>|KFu9=YQ+`dC+EqM*zN70vX4d%Mj z^tZbvux-N&=}s^!MOE(h^&`Y5--!J$Ib<@%W)O!a z3wZ)RqTMZSW;Q)rOj*ci0b-{!5n=qD&lE!p(6lr~RT2*P1&ed=&|IlxPnwtnRspX- zU^+ZBlcR7qbzo6a5H-f3nl%rGe7%k$2`RaISHQM*5+4|EJoshojO&kpA1;JZRp)&; zBCO3sN9#fiTG9&ZP+8~&l}aHYJsWwl?H|5&NbO=nRQPc^_WLXM?Yl-xS0923^Q)KP z67-vDsIFZK+M^(HHxJa@%QAOxsw)Z}x-FqtfOn~D@9`vBZ6RrI2f0n3>Kw=1@WfJb zbH&~f#c00Bfb#1Ub3Z32MZ0!C4lYReFR->xWy_?aLyAeAHZGRqPbfz=C~bVY@?JT% zke+fCeG)aq3n1!(h>{>zwlF@M#Y(aOu34HEukXw?`w$5Za(-;!pkY!#hiwLzxjD`tfAYP+) zX~YNp=(A`D8#0B=b2Ru$*HK3IEW@nFJXJ29nMXz8I3vusHaXZJ+J% z?uR`jk_~A%>h5XUt8*lLZMj8f!^?<_J`d%r#5M-S6Q2W?EIJC~aDK1VP|pzszsHA9 z#q-O$!)#_63t9~CEr8w1e(mk-_~p+MGkxT$lwhh{A}_2uF=Y%qKiNrH^GDCsatRVl zki;Odml&+w_FmRkI;lrCP~tt$tK#NldWNd!)(57-i%;7w8zw8{NR)w^O-HTlcDEtr zgbIXymqbhEhg31qIvtWxkBr4|emMubujb%wRZP1-cEe&XqZh??h7 zbt@7)Rku)JQ23`b&OoQrm_uzjQbLMqDp==$Zo!Xr!y4g-2VWjh3WE`qT-D#4r0mdXhe zM_O#voYj^Ry?npKAg}^()2MB>?*!8IMESu}z{saccxS+t|tvGa^JgSZkOb zTsXtfpZxkkmNQu&C@Ft=dFxW(lH>B(a_Ee?Jx?LpO}oqGXTwlloR3mCrwaqsrK{&r zJ$x7H=>v2+Ru9EDV=3W>@q4z0j9%w2ZNu&9Vd!7yP+=mzF&^g=7!pp+3Vu;{L4@dT ziTb+!{{%n=zxj7SmRXb-^tR{AaOaqNt{J`C-d?#@VUebQaZdaFMl3mXbz`s61e`UP z$&5Cct6Jd-$HybqP*KxjY^=&x`Xm26N*pCP`lPM*%rYM*hM$vLJ>~CB99w%tj%7*F zt+`mg25?VH0hwa3fznrQ`aAcKj-`*0lxn!-sxu1(J9n4!HM9MHU>j8lODMavWHP#< zGxLu>Sn3fwXhEeT83OfavC2B;&+~C<(}w>nnImpQ+6##5Ur&735hE-( z4?#$N^mnv7a3Tz1AR{YIYjm_0n3w%PkB;OHYQZz_s@7>TQcsTkgN6~L{Wj<7=3?G3 zgs<|3s{n=oKM4dDou$BSQL~E&U#%WV+9DB;{vdkb*gSd2dr8ta+L|3)UJ2Fbq?i2V zFzM`x&V1+GVOziqJ9@@E`RA&w0485Q=w`(sCK2`W0uHvQxWMc0xfaXw3XDRUHkA^g z#ck2VEE=X9anAbOd;Wte)7wh}?SaF(Vpz)@CL8^tmyx(_=YBaXeubfjHVj9l)nlX` zwj<9DXl{7-wdhF}$yx6_nF%`z{Qp%SrHDiP{Dk#whr)J>zHamY?R?BZ*+$hoHA=!> zp8ZLM1cx}>tgqDIAT@#e6D2p^z^t=tOMC}`A5^Cz9rlcYod~=kzl(P#yp;x>$UWM_ zqV_C?hI~`)*L%3`zXQ7yJ;)xTJPXN;!&ur+0d5DnfVNsEP(QJ+XiDx;yD`7E;S;27 z`Cg%RwYrWZ$5n4U|CzvyRN|8YwioF1VXu!Ia*^vQv-8pTe><92J6vJumV7w$79FjcA7^ zm=lObyt2Kx`G%DdiTb@K3}HuH6=7qO#2oRsT~?m2ATB!E1epdiHe<$G_W*uf=Nfc; z;CP3EWB%pYXDgq3*=S7ruuNpn}x>l0j63Xabx-t(dXKw^(8!TiuH@ z7Bs-D#UWn*TE<>n5NOL?mcb=y5aQ^_gjb&UhOR}UbxlxQ=U)p^Z)pBQZgy}JsZcwm zcmil>AciibD7Lk&3`7cV+?^TdaxzAD>nv`jvq3%n;N(TD#VQ+ek(7qR(`JP{^*BR} zmK@CC0m!3MElPh`g$O~1(K-2WSO*DNExFWAyc#Zndf(N1pd4!hwc{8HpSSr#DSYQT zAWm_k(U+U6lH4B5f*=35of;CaycsS@{%%9(yrS>f%0f9+0kI zpSl6;4k$X4vt)rxc-bCcxrPv%x8?CQ-y7uUc)0gRR_?<}gX{XQb}g337wS98A;BJM z5@W5i4zmIq6r4~H7CiWwtoP}HqXeFujp&Z2yM*V(^yfVWj?2}8VfhXl<@J|U<6EQ=$L4Y zY{;WhQcG3URn*!ETk=wRIvK!9?;4C^@;VkAIw7Ec?B-blVhD&tlG5AFwU3Mxl0Uc3 zZr`yv=DL&}pn>2N`YyC6){wBsTzV0vv`NH?7(NVSTY1S298J2FnF@!)@NWpcPUL#) zUL=4;aG>U&27Mz+9!9H{_|sz{sGF&YC(Ef$iCC@zfrs-pS4rE{9&R<$f%98%FRJ-E z7uAnFp2r=Iml!dG)1Zp+TA7F{OC97t}#B-UPh}KU@(SM%LQB}O);L1|nJO2+0s&-Y@mytPZJj+maqF{)&*+)Cy73@R zph5+Me?{U00{m^`*fjDtiRDnC04dtJf!f>ww7&+lfd;a(0c>Su3w{v_7!3Sr=76nX z>O)?Ue{*KiJ-G?^TQLYA)3F7zZE$W@asw<19)5C)xBuf= z;>CT`<*&wtU+~v2<(FIPZ`RmvD}jfb*eKstwBOq=pKU(!+WaT|K#}?OHXb-X>IVl{ z{BOxc&<~ELMS0Ql?+41Zf1D8kXoJhwCqjSigFbzH3)tH9#Eo3dm&NKgk5Q~XggEd8 z)X#T0z*-vz=kMq%hq@|U9DLYi5y7v00N&|IZ)H9{@xUVD~(J-5cUP zpm#eS`8?Lqb67AS&J{xWrV+$m1E-%qEK2ClC+|BbAWmbijNiW>0svuO|H~~@a0id% zzO=e4ewR>j4}Sn=Z~h$<91MV?>PK8FHt*>F1Nshtv*$;!YD6^FyGM-qLI0M%_O2I? z-Us-J?k#=%K|cn+XaDb#X6+mPO^@947%qs1_h0+%xp{;=Yu;=W!b|k=wb-(gGB=^=T-^43yZ!APl#{?m&|0l<*1-XN zXkl!y_vuRUuJW4hn-_(xyP{oXye`^7i>n`OHHHzADzkXD#hYD3I_O|TG+-q9brRa^ z;pz)p_vH*YMG*+PTeHfw{$s-46Xi6bDxdqImtZGwL=ls6xR{r*Dn7^CTP$N)AvUQKeMsSc?uCppq zfa`i^8>F~h<4PzSu1^qA6h%UR9I3$;`WdRC++N_Cs6Au{EHVDR1!3vL@k!^k; z39$2G1(;t$#L+V~bUAYY-_dhKWQVmJb`jf>=#F5y3tx@A@*NdET4mNzS#F>Zw(CH6 zPnG3PlkMU&#H{fOt7M4|b+5ekQjyinhd35#8XbYvy-QBox$F&B2B{XekO%TlX&cVD z`#tbhM@zRW7bjW3mr_8e2_U@f?!p2;JxJ8r&&{Kp*W%QCm7EwnvHvNc;`}@gn}Es5 z{)2^_P)pFg51p0hxuRO)Q=UmIQw_$o(0mRl)S#!svcwy1US^e_^=~NK%7GrZY4oRmnwCQ1cK|n9VS6PUH#vp;^?r1%7$7hWWQO?nhDvb7G;e|PUT|m?!kc@ zO3@ILK7fd$RpI`d?+#3zXHOJj5Jvm6MRNAma4v_GS4|JN#uSn;_i`cODYWRW=8*I7 zLq6n~Jkj{#9}MG#38CK>8pnDA+-&m1;`jlU(2EH@O&jykyTE&okGJDVyz+Z!zJ#kSCOh7}kXVK=}a!^_5=!&_aI z=u;S-vUikiZ!3@3TmYbp4-|bQFbnRok4RC$1dp3=I~Q#_vFFO(vxNDxAr%cZV*rs$8nrB{EghO4XPr%ce#*3BAoo>P0)@onfUspHbkDK+^s=EI7) zC%^^;v+ErU^TR{%rvlCujiS6-v9sGcxxtK6duKPwrXcPPfJ4wdu$e7^%pf@xVIC+5yYO`Ps9|OOBC413#2y zN1i6jz$3FGnROop6227O;n*Z>zVaoI|I^vYN=dZCH-Eh==TU#K+#$RfK3kD`q1%1pcTRP^e-5h|O4) zjsmyWIyP4%w?Jthfv2oB=eCeMiz5549Q%D5V+*RZ?W?0gi{wyCqt?GUYroWzs6lkz z;=s$*aK71P>s!RMQb7YU-O+3{>B1_{&B%yVYt{=$XV*sh4PvStRpm|$5h775oH{d< zE8PiPqi@qk`2xp!Nl6o@0BKB_l7uC!N+)`lW?S*IaAPH=F1noGUT4;?ISps}s(Aw# zqr*zH#_@t+Vu8TK8>tG$hFNsZi}ay|>1o+}ezshQPm(at;N-*WP2Gucwk)sXX$tTB zFi}SpTOkk6>Zns;O&50dfVSpyx+D#MoX`G#AErXFO8Xk>FKiE{S91mK)T+AfJ@IFc z-4(~F)WCc5RkX%+7RsZQ0czC6KC`Dt2+j!O(31)E6i_IyQ$wg_t^Xy7;lvF;30CkcqRyl~wN^3m(-jw+RVLr^2P9xb4zvYC0(WVM0Y7XO-eR`a=ZzMnKN4RN-SJSLX{gZbZeW zJlBPu+?$|@Q23e}pO1u#2w%Z<;rgTWFO><~3^!_+5x0Ub{_O_+@aaF)DY-=hQjNGyFM|&cEK7{N@JsZ_)aVK?ex~$*<8|hixyZW} z?bPUQ5V?xG<;PJsK2`qnAt9O#`%TyfWAeiT`Mf|F#VMl&fVEZ@M5($kVqV;BtamTU z^qM)XdH_i-IEad5N}eWSTf&am0P_@e&1WDlh82Cr_ZC_A$xi7T;AGENklxOPYDzn> ze_nP-rHs{wpi-SDQi;N`{6C>u7Z%~ zK7Os}6E84ZKQgB{lsuDOO0=;#ZfeW;(?Ix~hEy_~vgwmCv&==lr^|5*Fz(8T2NLQ1 zp7wF)thB*W%Yz@9OHUJaHqEGUi2Or`lcT9FA;@$vmtX5+3XIG)^vq&{~24c{$Q+9mkmCz}{; z2Vg=N?i<6l(CC6X(XE`oM`?fu;oy19xQBgXk{|Jw_R@s=lKq*EBQ_DXjw?cd*^UF-8PUN6`OoP7ytF2*HhmBVu<}iKL>gr zeW2DZ2F<_JMnNLp2zJ`!j3BepyzVm3FF#+-<3G=k81f08EK<<7?*lblZ-k2s=OE>z z6V<$Uhsfh|W?TCa>w^C0>LPQ};z)a0{j*C}yD=68{rciCL(y>TI5SdvjgX0#-Ba#q zO}%9mFsIblLWy?F>cC~WBbtiVsv*mEh3O*KU9r3;|ahkQm2=LlTg$0aSJ)KQKCA!ZCNef9*jx{3JhHVOr9YqN;$+N#q|dQf)Ubtz%95mT;_amY>m- z2NVk}mH-wvFsu6+aqlh6+}XHl29VK(Om@CwIT~V>$uv7V&nqlk>1x69UL{*i)s&EC zhz-4;Vq~bDo!CjWuvX&o3bF=5BjYfw%n!~rgTX&}Z9GAJ5=_D+b0pvh zSSD9|o82B_^N+y}TmzhX9EIGAKwhFO)0=B4aQIvNvFAuo*Lub$Ij|LMGLUO;bL&_6 zQHw0M3x_#pkkbr*ypfR3&RV*T(@(U>62D3*t0^dSVa|@rf(j50~N4t(F933dtnMm?u<+$={m#=hu`^iuh>{x1=5YnTwaLsAKtK zE=u)DIxb@c4NKiU-M}iaWM&&qN{IK2)mFb-J~ZDn(G0wOGHdmENVqElnuUGOFCN-V zm=z~~@OsCfaeCD6`(+*glSd?#mmu(u5`KQtzm#i^V>H2Y*-JciJaI!;YnirKVE@R{ zn=p0+MjTKOt?A!`R&s(g&Augk^{^R)&`Z-@l$JW`-iAyJu*jIMQ?V{osjDM&a4&_Q zEhf5dPO_O%aZpNiWy;pN7;Nq?Y_*`v=n6Xb;0N8gJy1uDJB)J20MQI zi&fSy2-+&HOeT%^a{Q5TA_(rfzK;i-djzCbD|N1T6g3Qc^^evGE`{w$>gz zr?KNVnaR9+hkpMKz$=1k40~NMGPXumcV3J4=n7;a*SUFNg7=)2-|TkeyP6CAZou|O!2dSKq)qi!c;67Sf!(|>b6^y{T9hU z6Nf$mY9zFf0GI1LRu?Wb}PZd z58*IvJnXvy;V4Zs!+4%PB`uu3pdhl44x^JmvC(Yi*GT7U2EF18|I!yhLVa&3NbmNB zfJkKham*{r1~fsn)3g`Ty-l~cBFM>E=Oy0{;N-hqs7Xd5`gds4Q^liHUEn>|LTxZ~ zRdL$o^+Ot{Kbf>TYjWsqzL^nn%sLYtAdDl32-ffqyfFaX>PX2KJQggie#E(Du|3{j z(A5SIQ~;OC)-&Of!?xB(%mBxkWJW#5H=Hk_h+Nwyd6_Rk)Wx@liW<;gq#*_dLz<1VP(8FiSwlC;6xXf`aF*OKdxzwXt{4 zh*<3&BM^>d0&L`QbI%XRGfw?@3CnFjw>=^l-aJd-#Ybw8tRk{{iY9g(HU?{1 zb1!0A$J~S>RkdGoEqc>Jl~QIIf8{=MphHKVM!m;lQsY~tfB$ ze%}ej(`Wiw?mS%VzNU823n)_1zL+Y8VGY?|!-ifmn)qDYV4nVnQ_cx^J>Inh<+%pX z)8Z?%>h_r=*|F`-kD+EL^Oe+CR}mlbl;1VE_K2F-lEyrTUee^)FIadgg$dVfB+K-~ zPvdGY#y`fp((2sCV~TiaY&5)`pkzb_qF0^kd=uH9<4yFen%Doulh~5hJK;v0ag_{8 zl>VYDqBB>V2fF&2v=BR@3>^1ps8QrY0&d|hUkq(9i*6QaB9My@m?ESi+cQa20#8|l zmsi;W0Y##V4DpwnRG%IFc&2Hlp2gLx;OOt8_t!sZWzKWgQjsppVHar(v`woPzae%* zW`T8q5|e=Pre9d+0TV_=)z+P$mTbAdtl{q7xi86aiH=;CGaZfi7#1z@r!p!4>ML$J zNp#ybYiJdYfkw9kdT$ou^Ab;5hherPq;RCfLOuRi!Z?XWy`~AqWUV0I)1yZM@lmd< z#AJpz-$q3#pRHKdCp_g=g?M`Cm2Hqy$n_stwCeZG;E2N#N(9o;=-S}Y_{$*^oj zY_+G!l7$tQtnIHMB=3AA2SXxtmpQ4#7F8RJs=>?Nm*i{<1fy4mQ)@Yf#zMB&4B4i?ce-zHx8G=!Zm$*u-|8=4_SfpUd@D zDtXcDCL`-27Q)ZLHK4Tz*kLfxmL-7mnPjdK|Cq^h8o++Xf+eX*P+;Rz0l( z#!P9KGT%c%t9KJ6+3p954!(|cMJ4~p_4kW+64PmLEqB>fPfg9#c6Y^o@p*^5m^uJ> zOg@``y8$!0ab$8$pQ6k=Aj8s;h;!@84VZHe^GvDP6A!~z|eHBXLw3<(ps6jZuy zb{M3l%k~{5&0Y%UG?n>JQA~*?`$%J1Y`Ok6yK}J93wQg$H5F=KB0eTh(Corc(QybV z9X4)mWrEtQUPCUA8^l%2{h(kSd#^kpi|yBo6>F^Tu8~2~8Iiunl07*Qw8LQ{N4p>u z@lYcC60#d8Y@2rHUHMFf7T91a@-WoImyxHPEe3xqvT%bm`|sfOeV=nN^%9~^doPOi zeGNtno1rwh?=TMe1}9i$d@xS=m8ZX}?ctH=jujYOo7R?O9e?oAx#>Q&M^2ZahMk!n zG(x^kcuNL34sg9^+mFgMlF1>Uv{*S-4|A%}f!L@LGP4ud%nZuCU#@B;lgG^Qxm;tc zSi;|0h}==4Y#r+asqM~lfr5^Dsq%4Q12CO3o6Heb$Ud|z6qgIRKk{Zvo{%|QHO=ZM z#pijtSS>joJ007$m%uYh%4Z?yI&3(54~4wdu7BVfK5K%&b`vm((129-aO^r$cIUV` zLod%COFQ~TRp@Vo9WYNJ09b+=o$&lsyk1wE;0n$G)ze8JB@;#l$SN(S-j zt#s!DwT&H~A~6&X?5zsECi8B#rG(LMLlAMd5z{snQ-Oc3cH8Up59EL43$3ZK~loB#G+MtQjA=>&OGQ z$*I_h&_G`KQDq$xMxWPml8!j8TpLA-n=pfVDlSKyCHYC{(j|ElD*V-P<&oVg4XC3l z`zj#`*K#U&F75^FTavV6=d@CZnW5FTSm-E6rNmVeJ`_hnz?PTVb6Vm+tQScEP5Jtl z>9{d?>^qebXKtHl7Z1zxI^VpjFVQ=_(a5Ca5^s!H1S3q>2XR_!7%k3yR==~aH`?Xt0vZrjMdvC`-_>kdx~Ur zG3zQmqDyvmpe14`x<%ABZ`IP{)O%fe|M^1weWHrhk7W3?_A*I7rAQu4r44tXWW>TS z`(xT9OPZy+yu;&6`^kND2a(74-jt#zVOIFS6!p_Mn-m87A-A@QEvJt1O50TOoluQLIiM&~1VUl;zEcOkf6HxOrz8ea?5Gnn+2WW)TnDu-BIeqz;Ie~+{#g=9 z!Imn+I7HT!ttX#`O@{!jMpuj*2?*pUHEb^9EW2y!ClJjZy{IcKll27v&PE#dE0 zbrt&j z{%PMG>Vq^L6<6HH`^o1qgh1!=fsEzm-tg{1k zAUWD)h*i@QFUoFNyo+Gl0@Q0L32I?h${*aHunjzTR@fWJ!bG#T_#zRm{nyC9(G)(L zTgd5{BTze&WSQP@QdA407y@ltyE=TzlnbtGnOYI)qkSbuoZhUqumi(3rb&A7(^dWw z4scz|IdOXZ?tdr06Os6h8}9r$yk;u3eDQKM4%pAT=8EEj+&Vc5%X5T@Y?Kuh$TyuT zu}gMY?N1+>r;p#xuO!D8+i%I-Q6$YjL@tkFmPC{p`8!Z=W^d;Zd>c0_x01Pg8PB5- zkJ;jzPy_mr>oW}s%$5PION4y*%<>$Mr17}g^0t-EDTP{z(XTDaJAzEvpL52SCCiBi zsOLb##oLS#2TPFcrsV2qdO*A@@>3_7@33R1*EhY=|J_-LLGj*iFOzI5x4dJK8@B5W z@^OM*^fS2=)y&%wMeUrL7TCgLN3MbsTx%(;K2UUIK4yO-@%$sdN-z41sUfAk+5kSz z!U>p0e8 zip}5jv3j|pas>I;8FHX_>iC_l&NIt9)IAVRnG}WQ4sIaJIj-yOms@1 z`R&K3?ZNxCN~wfb&$VcJQjx6R@G9~Jg9z|0sl3yPa{PrN`?A`AGZt10lJ|9bct)F2 z4swdp5L0;Q>qP3(!Bnkf2jjkNa$52Aw?<0$9$Qx*rpqb%E&B;c5@%GsFX+s#c^vA_ zEed4fFHI*YPW>1`+pll?{+4vjT#q9hq>bh<)k@Uu!5RculzoJ zZ(Z8-t|pe_!^l9Uhq~XB`(Zk}zKZ$jG9sm={9=!3;TqP^)(>H!W+YD`G5zIj8oXln z0XrfQb-gHJ2F7?PjZt4E%OgYM5p5f*&oy|u)$9-BSEdg&&30x#`C+VTdCJ09ZYKeG zk_8XQ{t-4IkL|BGCBA`I9Njh-DMeV7uJheFRjtGE>xi#=tcs~-4Z`n@r0P{xfzr)F z;VlVvhQk#hIrk?{RNPry4oPnPyc6nT$G+py41JA5$VOiUwGFgv$=!7D8~4V#@usxoOyIC*1wc3fmO{v7NmtZ&X-!lYbL&n+&TH_eBPn|f^@JrvHf zbfg`z9&;#LrGrCc(0owA{irKCSUrwrXLt@RL@em+LS4U#$pgjRgUYutZ0Yv88s`lGA z>>HFi?-e-{&#BtV>{ACWSSuP+%!3TJK!Ji8%HFs;l8!~m zMK{PdN5RBeOAnZ$Ca?mQPesGy%Es?}O!kZw{*7r?{U$7!dC-Yw(3BJmU`~;aa}a#1 zy1AqyGs3E6ey=2zQSX+vMaSl=z?y01CW;i;ZY6|$p@6-YofOA^LJ#bITQDoQn0F*g zp6&RB&yOrf{2y>HP6h%70y{%Xs6T)H6Y2VgdvS997vS};CCAM8f9S9O&U-PkFmwL@ zw&Y^|{^Pwgk;-Gd0y~Z8{?T4&TdWKWLCkGJ1Z|z2U}^aRft^xwdsqbg_F-Z-H#=L~ zzjdB<<$>=TpV>Fe@<~tJ84Kp~pYS7*i+;QPN}5y8Y5XJ14~AY8rbR2u>S4|Hq*Y;XYB?0nepeALwbIVmZ( ze4(zfUjP#MRiqI4V=(cpLH;@N<)l|vJUFz|wAp${->3g-a>;OgBcr2(Z)x28Q)pM_ z7Er+eC;>BQ`kQIdrTp0b9XS=GYwL%-f^$%s9Ne3aP4#W=fVQbK zXaKDB|L`DG7@#j(tbCAW(BCq4Qxr@8(2$bFUX}}2(-~WSF@`-6eIpB~P>$}mHhzA6 zu|6qJ|Bh@R{&hT<_q2wAUKk9(UtU}QZ060~{h#Y^?s(E8db9kBikuoAgaZReM(}iv z4S&Fi1*oZ+o0(_;0+6Ro1oK1V*8_NGP|Xbh8C{s4N?eF|G$l{~J_(%5&{B9ZY?c_p>@b(H=o4RSpCJcpjZ9(*>6put1SXuzoHCM5aX9l z#P}$lD6*l2eoz|nce^5V#0mTi&Na-w;fcw?@d-EpZh*d=#3ozgJpo3!&XHej5T%A5%-CyM|_JaBbK>pOy835$^c2baIxhHhS zwJW_ZCZO2V8vvh`G)QCM`k$Zo&!qjy_<$<{Hax$n-wqQrRvt`LT-MOvr>|C3?X4Ny zz2Ol^eZx~j(E5glI{8J?Lr(uzzvGpE}hU%(q4)LjwwAZmsV}M8cduP*8bW19%kPJ1j&7KfUS2zK zOEf>`HkojbD;x#iT_$#Pf03)!Grb{T{e(B6E&#M~z9De^gpVwDbwHX0zkeAyqQ|f`K$=Fs zaNs_o*Dwx1ng_pd?7qUgFx^J#pMtb2Nk8OUDc%&mr$m8k_-(+M|kgw*%$bpYNkm(Z#`Wi zv`)TxJ=x(O6T<5sh1N!eKTpw00ATk*&)lCl{~=ogb2 zLlKa%m{#M_7(G#2Tv~X(xg@=?Bs5QqItxTPpalxoM7eShYJy2iLRG6*2fkmI6jJ8+ z^qY>bSAIke@s7Wv5)0H5%FQq5U*5mKI_P+bLkcocI|9;wF{&LE6iE4!?M`4}XrnU(>R zCMb{QQO}H}14($5nV}oi1U&u}ks1q#V53|}M!P2)rKP-JnS2HalA7QWCej5i5}iR- zd6~32JJ_yWR(t<=ZygJ0Sp0Sxq{F4SEtbJPn!*B!bLCmhWk*WAghJe!#Xlno&cq2M zaCKQ^{RUCDy<_cnc#Mnb^um~6(wyPPN)jiZah|_y2EXO{GdveY9gWuL znH>p1$S?`UVr#UZeho(`&_zd(D>0q*8x_RI-QCgg`#j%w$%IZHB`uvHN^6#BHSG-17nfaF5~MOU)RQz7M5;=?kWRD;grFi0%iPK6{)!MGXJKk zNnyc_%J~t6RSLlsycE;hoV^bqF-#Z|1WmwYu$*n#=sp-i&P0U_F23?m@-J=7cn1*z z1^+f0x79{N^@~Q`-*i7l+LEL2p#uzM*|+!98^Ghp)Q-!MWesf`T+^1*e36@t=b%e- z*#SRyq(w%|pBp3DWS4H6Rv=37qH?=j_R5-e`5MvKVBLN{eLV!7wT?0#{+=gafgmSK zB=bbXO=E{DUY9(p&^@pPiA0g!wC0S7o#UB^xa;uZ#DvarKNNu}X1Ar{9J6Y_-JWbu zeY;HRmV({{!y(AHVPCMnJGL<1c8V7h4*3dD=npxjUUvlxtcWwE@!n{elBiV3pA{aI zW_@`3k&A`DH$i63bASh%NtYF0@R8Zey9e4O?q$j!uPi7mk;ftVRe!{dpD(#JQEIA3 zq)`Uy__%h6!K)*JyCg>Dis8>5Jg;B4xYrtjFMNWoqU-1rR0FpF<(v zB{aozpcZBU^qvFy5J{0-vPyUn6BM>dD(epl*Z0}#a-yc+R|5e0MC23IcU4-?lH>n* z3ugb43f-I^6}I|q9E?JwKjAtR~cIKBHPEF6#IE* zvg3{_i}VOy@(d5=z5-_!SpC2q+S6mydh~eMay3T|68(G85f4dz^P#(J0LW`KKz;W8 z_Zjk`Y5*h_=QksPRH%qpxfHP&Ur2`i{Bg}v^6c2R?1fKA^1NNAx9Nf=m#ck1CVIyC zvPDpP+{rjn@IW+D9&aZig_2nr3q6tPo(CpZzo1ZyZCF?mFe;F8pUOHj&l$q5TyMNlPIrqE^QS&7!-})c zqVbuKyWpxP_o`R@4$5VwC{oDE{rjpt9-Sn)6#mkufpV?^M21%vXlUIiack;G-Mi%2 zqj%%4$b%6ji*Nukq}BcSyN4~& zjmMWGd+NV;+aD)tZvci=!haw0zb@=JW%H-hlo5G^vpEhxnjkyCA+7n1Xw>)XNA0R} z+~077O==+`b}l-RYAt287%}ar2nr0)%5S@=%j*3C)UJluysA;@MqahE>ZC=er_!xE zX#G9Ph2agki%vs@#a#6g;6x~7kFG0A!Dj%++JCZ@KDt%*dD&`2wxci%6DJqcsns^( zHnQg#VYQd2x01li)?+`{1;+wq+*Z@VjOiEEq!$Zr&(#ftMZz>G#5u@7}a7mKz-;V3{i1PLQnQ@zqv zI+*f08F1`q6}Qm$Jb;DMT}CJ#tatFD5zJ%$h8?0Do&kL0a6`TCOuv?B^EV>rzumwiR9o`qIj}Hshp5$ zSMusredjl|s#uap`XVklVDZ!G#uj1LY#hvhDox)ZS_{4uWy}l-8VC&XBqPp?9#3CF z>=YJf#HEme?3tR**;Y3_G|0Y9q&)4u;CeuK<^lS7NVb!KET&mvQ| zN|;)kEg#Su+xd88yu5#37{jL{Yar#5n4ie^& zO0$c!MwkiBD#_pHK=WQVlwub6P@a%7S!SbojuVH^>}j6J`Vd8r!#G!NC+zLbE-OQ> z(8RpFzw0vkK9gpWw=Z_X8-MZ2H>gmaI(Kv$nln#MRGFO<4N7I(3*J0Ur)8(6#Gd<6 z1{32B5_|^XD5*pA>b;%J(qkB917M$dA0o4D8K0j8Wk9`3l9O}sYgO64AO1qrnvKym@>6g(;dVpSCh~& zYIaOo!@NggAD?q)YlX7>YC^gc*w}V2>8m?>EvxpfbjYW(`@N;t(D+w~<8I9tqr6eq z-lcsdK*_NWSK=1g2)7$&WQM0YuU(jC z^yZH-11;MtNa#9~{Y47lP`DQ)CwE~KlPfb>kUGBF z*5^|qyef;eOA`2;b~8UdnDvyGQymk+Bn0ys=EjWU4S|n&=9@Ekp^4i9 z&c4adVnqazW}&hoo=diMJ#0fuG7_Z22$kwa3P$ZN_(GVKiJ&Wylas<6qV9g}P}DzQ zlvu{D@JZvho4LK>dR1um?I|b=pLNP~v#G7;QEWUSa^P=hiTdr~N-#Oj)W&zY?ER45 zkD05o59Y`7&xFp(>S~<{QmGwgaE%{~*g;jpN_c3J2uut|kv<6xWf4#hy9s0rlV?3LV(9$vlq$yb z`J!@V8Nwm+LKnjuo-y68QoB@cHE0_!Zj*r>Za}X!TKvQJ9L{cuTkj>LVLond&WP%CAY$?;-bPKVX62R#iM4i?*Pbiflg1Qr2=;j%;tM_eZF}47uNl=6F zjsm~L8`!_+slLO9=t*PjR?Yi&;GYu(eY0VEZW6R0JQQBb@29ZYNEqRHAWzHBAvFzL z9m5eK* zw%q?)+a}vnX<$((-JFZAnN3AJ_STgCnxCI(zywPpCNVm2<2d>Rir?(S1EhFypP1 z@sl*-nB0Ln0l}05Ua(GP{;lx}`@3qVv9j7GedskdVPXqP`QydK8m4<9R_igIhgUS@ zB{u;*7K3J#gNw*Tttg#OYrU*9nI%TA_S$0-$I+>0zuRc(>>>?0{EksF2c=;PDK>XZ zI9dQZc4rlhQRxLLvFk0G;UxAZ?b=7HiF4%uu$dIi#)GpeeZtC!8+WYIWsJAZ> z3E@9q12i1(n3qi3l_&bYXNg7 z=+PX-66s*q^fY97UmNC{AP(LW-}>^i>1qtSl4Ml}-DWP`zP*dS!lRMx@$%GRou*Cg zPZ_|TMdVCk*@nnv!{4LU;Ajp;>Ej3qxfgF{*67G5jHE1O|XRnoBndmD9XccX)GBv7&UcQwb<9B|GZ4Q!togd`;nd6Wq=DU?fi7<*BK|_?%eWY_J+1}0XCea zc86SQAI($*_HHAlN+;(e?lqIjmacag({!lp_^j%407Xd#=#S2x&?UqR7ONVVTV%lO z?h*EM*?uFSkA(i09f8h{Swa%UlAMC-X^u&;1Mt{@#)Rnv;+0ujEELBRe2+cG zO+>}|pc2jG4WHi+$rma)DT)QsH}L|6t(>_64TQ%UNtV6;LD@M3X9BcqJGO1xwr$&* z*qPY2ZCexD$;7s8TW^wo>aY5$&f;5~)4SgEvb*ZJ`?_v!r=V_QQb6dwV$eBlW{v8N zBK(A|`;-WGy0?=q@{+1LrOjf;+?J`{W2W;9C}~1?n;IaadQFO=)j_6n1G%$rCgh6` zirQ5)9}qC1_(9##=Oh3u=J`DUv7))bE%&E|k15d>U~-XLEp&2+Exar^2lsgzJ%u{iz3SiTHN@*=OiJ_#%=mUNec2>?%(}Z zvxTYG*3j+6BkWxq1qbE#1asn@k~q)Jm&1tt#=n-)qXkR}(gINqs~gPU%A!@ta*Zjs zmKs}v&9p3sQluZKe?YDGYvw5!*X?2aa)(DDD{OLrO6oBe5A{kx(Qe(?$kQRC9U}bw zXr&^Pe%Bs^t*(ez(OfDB+n>2j+xHB=WOTqEbPbWcBYAer)j&XFWMlZb5qc7??oJRs zOlat`9cG!Zpoej|y$rW_8b{QI%>YDEk9o}qY@&Is+v+v)-xzrD$;%ZCMz~I>?-`%K zWXd-EDMK_AS0?P>6?`;EP+dGB%X-t-`0ZG3fuB@mZG)`x^a>3<4IWLLD5RBVhU^I6 zyjy$SzfgQ!>C^>rvoZ&HMx`RmN()e4>Pp&8*jk7HY;AShzXTx;gu-`kin(y?j%q~& zHgd2=zdQV+A`L6){X<`y5(H@N$_M8L>rfmd90*pwxrFIQT{I0VGXjb(;CF>P%p%&P z+%2svJQ(pW)4K&^#OgRGAC?8G4aXo2jpJU9Hm}(kT_{ASBG_F>W#QS9$3r?-_{rsY z#_^R6Shc|_=J-1uU|dq26ON5@GSp=kT(OHa87tLZ^jrD%TM6P&U-m7qor4x(q-pDJPpla7%AaXN_ zO4v}JNk!T;ZhI_Em8y#y;nX6@!<0VzB#6JAzu++Cpe+v$5n^OZnt>BfDb5jZc?tt) zh{_O7aYLEc-=9YdRnR)vC6Y{2>t`HWbVC+X47sPDHxj}z6idL7AOEaMyx+`y)9vP~6jnsms#P`Nb^jI(vnl%*hhG zL;?xdKCnTQb(2N*snQzD8O#~yo<1liKUqskOoQVSS|FKMS$-^dIr1DLxSk^v58LCq z%;t2Y7=vqXyD9Yrlf|j-D(5|OymRo@pD0?*%(pP(lFzDtwwZ0SvvDMr<6+4IZDKaA zj?2kRcq8E5H6}Ttc{p4eA?E_Nn(9pMBo-PB$vt(LkzB#YW7vY3EI#djnvi? zn+6yf=;krmIG=Bt%+iC5hg0W(G?$m4Xr%8Qu!Qo&Uvr`5E{tQ`H32u+Rt@7bhgSyP zRJl95u&Wm2j<}#NvFIx2?<(hhzg|FvG^nqAd3i#<&lH*_Y%YV6=uP@jwK9mi11HZQ zP-ufB?$uStFX*q)x;MAOqh5IT47zFN;%tQ*Q5EAe?~^YgKX?fqu6OtOl4~=`PEj#w zNpM}FJ z8I!=4(rv0Svk=zSW)TnFe0oE(C{kL_bNUxdAgcgAxrerr`?wLDI$H=%w}bIg85Ki# zEB$F7120ztU+!!m&x>Q@q|C7*Kq;RauTTqkTDw6Yme?GA%WcbCrf7B|SmqI9_Y{LSQFcQUU6JC|VdtGC>Pr6%Ru&cpJ9b1a`b zze2LB403Cuf}KB}gJ>-9n0SrWYK74mqg7*~u6l3;zS;Q+a1c#Iqg(8*Zr<`(rAH!y zj})(2bCd_P;OonM8WELoTM@E^g%@YS?>0r;Nw8;D?{Sp@V_KJGDty87b{)v>x zCG>Fvr#akdhn!3-T;$zOWKr1oeN|t#F^B80K}?F6k;626t74Ve2u1SF#mM(FDY6nS ziM|1rS2XV6TNoN|EsXxdNOt>=IVKf=b0^*9rg8d66m5+siLafdvVrJzJ$q+N|8(69 zz$a=%v9=-Q@sdU>Sab^wRsJg)nj@;^2G{T;`0U z13Dy68jV!A&A6?z9SOy4Xv0;RQ6qHKg$QohkWW;ilxlkQNb%K(2)Qvy_@IPE9WHxM zu{hLB7pNfYV3wqo-`DR_7At%akDX>^^59-++Tqc@5bf=448TSm<4w!9e1D*g^}3LrVi{5sZJ?E$267t$2rp14pvhxspKx3`8QG&2(>$~P(`L>6=y zKbHFSrZT7*ahH6cGvA8b7T{keBaR++k;sz>x}f&Eas0jyNRNLK5|p4j7VKwk($K0d zya|LBS_0LuVk-v^1opu7v53*5<0&{9%9QG;XT&sAZE$uCA9$J0tNAqx3_|#cn=@pO zGnoMdrg>q{ysxjaH$kWSf|pS~BF9!AFEL-mFP zAURmA{;r*0EM_u)5{QgD2g&MdP5fxcT+*spr09s8Vb?qML6e=hmzwS~az2?-LfTfA z4`}igUlftkiaZDO@)JOGJ!YZWRkT#g6 zgq!d=MQmZshZC52?(&4s6_lLpwK;EsyT6$)Lls{0);Y3al*S=Kg?NiN3Onlg=1tUf z&S|!b6kQWwv2|j1Sw(({w-Sq+fg}E{FUn>g;n~5xjrYL{Aw#&l_Nrp1lrmBwXG4CA zYa^;E;2fG%B^n4jl|9DeTQ?alGjkrb<_k+bPuipp=B*TPRMU80obH6Y z-mvZu%Cp%JQNck=!;Q1FSeCYEC!2K5^?J#Ykgf+?FR^ZO_o)_xYy)g zr|YUe7n)EyGy@sJ)S-Dcxinie8`s^bgBs3~)qbdPZOnXScUZP9qdYLFUKm@FWnn(1 zlvq;@MI5x~+e37CpJwsSvshSmh2})=Wwyzy5{F|U2Zb|TKwj}?g3o8ud$zigJ>yXg zK@P_->^0#6Iwjug2C!m_J+|U5$q)%vW>gcRrL5s|mJ{@I5?qB8n7h6=lcO8BTLjqi zNAZeEJl_xqpBp26O#u$MvZO$0MsBR82_hBwph2~|GNU59O10FCc8bb0mg?pWFXTe0 zOhx^tH2u`&!&QZ+5(qShbw6)P`*jv@`xKD)@9c2&$TdHsiWh(0I ze$DI%A5BG`qx;D$3bCVy?|aNX9F|*O*2qo~%(5oR1YdNMe?xarC*0-!!ET<*wnJUc zl8k!okvo$^40^TI+oqI;XS0g9#pIiX#;90Hov5-|4y%bPs4#u33DA?ffz5FEuOuIKc!$DW zw?yzZpn7VTGTD1kF=f-?cbn^$?f> zIFfRX8^C3tyn9^z6{9`E<6BhS#Qt`bPUGM3z*lIEs4w9yb0;z8?4PV<*!jTDlIUtR9Y*;w?)JpN!W!&HvkZS z97xf&bi4MFpeJR$&q>t%StB}m7G^yQHiS!!=;yK3p>~C~`HhFBEhO}Zsm)$zb(*M& zkbJ1{pV6&&j-PXSi^aFO^~BBnuA1HeYlgKd!OZAV+qx8mkC*(`ezAUfm28O=xvOF= zYk1znh|8lcxX$-V!Sdg1G4CUMC$6R^bnR5_w(AIRucwlx1@|@D8C5>Y%ZiI2ki!ucG!? zMhl&zJ8!o`-rg9TdX@Au*zc@t=dG#AlflZNXC+hGkze#bzB^%UGDq*ZZyambr~{4O z>oxL(MJY6UyV;4nv*)`SJuCE8_S_2m}Vb#uj#->ADg*}GfCMuYY(zIqNA z^^eqvR@+d*>%{Nb+1=3M2;bZc$L;==Genoo*DGTzkZ{{hk*1@4(;ni+&s)tIXjD-% zlfdG;1b)$w1(%bZ%(lFxOmEpV{wzLla5c+8bA7)cB3}OG6XqH=?P^%&3SZDZC*6 zK3M;>DeQ#rU%*0t>ekO9v|+A!Kn9rr_bYQpy6TPOYM>QFd*NBcuVq(n23_1g@OXw_WoTH zi`p_>6oIjYOJeeBVu1}Fo%^uY?W!prAE^4sW^_1Dy;L%OM&3dEck?SSj@8eZt~u{d z9eHaPHLJWTY3#p}BEGP5qg2qisns!6?$wQi#(CYbN81b_Dgi9TI|3{-097q>7V?D# z38@E-LK_|r5VJHj3Xq3=p)R;0co}Vvsl_0|mSQ*LYTVDtkTzr28*;93FYAAGj_PW} z(5MX5H`r5r8qmG>ISAr{v~3Zvzz2W_qo?w&TZemF6~Bq9omRu$IUPPAxi&niRd^ ze3_-R-@-r(RinQE1IiiK`Bu#e^|`yw+gXdTufsKdi*ttNv24^rxrN154&naU{+mXR zEiQF`iBxdOPfi9;!-G~>to;#~-Ndg;Ij6A2q*H^*y7<3ox^JJ=%H(z)gm3kDU3G@; z$WUuJz4CtO9?f^7{^Y+Jo0+VO+M#~a*iC4zZ-52C%cW*K-{u9JttN_*dm@=O9*bT? zH%Jzj+)_$VzqbQbP7i`U^zwq_9}o^!{62;?YsTggh!A<{T)jZJzdlhq33yA$c0vOS zaS8dfgl?Eyy5yqHLNM*1kYaPMS;!H>JkN5Yby9274`{4O>CnJ0G_*OurMs=QX3Ei*hmbLi+PWtE!Q?_yJ?> zugC=6H*7bU%Ep}BKoC|JV}3q7WUSSc6pg2-*2OCtZ76$anQp*{vb*jz(gc4f%f^m6 ziP0^xTAo@CgE+^JX+Tea`!rnIjb$9yOVm^3Cj4-{5v2g!}!q$Xx`0&kfFg!RO z60W$yfJ5~*@poI~Dv^?s%(|coQmWj1$iw9Bxm>(7MvWKBVK4A@Gcbm+Q+e1oablRvWJhhe>ABH zue5(kKZ+{2e$dz(m+^)T=$pjL-`5U&wP2xurw%&4)2wa-3%TNYcEh%hhuX}F$RQ_$ z7LRJck52-UTTb2GB3K0&aoK z(5$ZYKI=~k3HMqB>}m{FYtI&{{Cnwjnn!X&Q@LYZvxwtRCIjs z(Zqddl#u$`l&Y>$`{VQY+=Xwj80=zo{-qLZ@ zbAGrVfL^jc3Ue67(fKk~W{S5&<{Wr`_*`1z+ZBo(0{WBd3fN>9ntX%xe_2hnl0&~2 z*w&Sl_bBhsfW994vcWQ>8i=2;XFBkP!u#`Po=)V#&<@&A<=vL3fmh_*Uj3LNc-4Nv#gp>X1Aa^ z(G30(NY;1@F=kF*H+?3aXwo`jQO%AdI@p?6b06X=c7P-}-r6i|OMOsM_C&rp3n3?F zo-*NxI&%}zhSvAXVG#SQ-$5_tO z&ZJ0{pcnoq$gb(b8OTw50-~v$^CS4G(}dk4hv{KSubM;Njy*57TMlVb?vkh97|6@E zzPN#qxFA`W7-(bxGth}M>iclrn@{<%BngefIsY&l_TiVYHB6N>Yqm~bn;aK}qL#dH zo4q@;+7^B@LI=!T&*u=Kjj+PClnOWs>g7Np`+C4rA?+DgimD>GywKd8Q`P;zi6*Lt z3oYT#_F(g8;tA8K#}qf)3fA5zw@k*Z%eo%sAxWPhGiKtGk?jNiT9{siVRYzwy21OF z@|~|^o*@nrSNmx3MU3sd{82RLMCb@+Nh7bx1P5Pgl~|5^Q;3*jU?U@!ic-moqMmU3c&qcn?dlW(YbaBG84p~SnCW7D6HFHu3GHv&Cnjs(1zYfQ>8r_@F< zAgC3HG>5HE+Nbntn9MDpastnWBK=a!R&lxw3>ZwMny?$q*S+^ z_TMYYNjVrqNi1Piq|6PMEs#m*AyuD<@E0K$(_u%x)cpGHoI7;YwMrY$N)%$@jf%B; zm>w>?Wr7GfCqf*;!AsCy6g1C{l#Sl(WeRIZh$m&G8ytY(2&H!;Gc?tW2JKd`^dL zY}u#6#7$ayM8NyU0QHuO^%uxXCG*i0BnvDE#XrGT2SkbY7ID?_QqyPpc3F~>5{3TV zLSk18s6v%=W%EicjbLEj_=sqG(CYpwKyf{zB1DwmSBSbVP+1R@;txjo4-5#Od5FgL z4l`*D)C$x3Y$J*B1Z!iFsFN_Bg)J{yd(pjlUsRBze;@By#pz+$z*lD4CI`KMj)ZRl z!bGB`Tt&PuME$*X$o*(ARU@2hy3pkxfdtY1ZLvPmXzkqEwA0Sab=@!VIdu2d0Tq$f zhjxFR9iA^6k0UP1Z5w5Vwhy#ZlY+S``|hUN#_S0ZkbnK$DK%|cp?DfI5@i!O2Imm& z6^PS?EFFTU2)TdwLYws+yJ+wlhR^4|dSe}Wc~HdoN=3a>)`dYiqAGiNtPRG;)8buQ zUWvkRE(&cPO>4P@DY8H+8K&&)LIOs9BY1KBY1c~PWqS*%CQLCWSEv;FX?I*B|3kPg z677e_Th6t5{&05N_H#8c#Ck+ECPG21W*`LK$h%7);bEJ~JL$2r^?lV=k#e5RBR(&7 zDvgre`i@;{OG2e z+8$E`EkQEf);cV3ON;2v&f}^f5N!rL5E?rA3E&tZ!7YfWzz7Mh06}C!ILF=rEEo^C z(~$`+=;=cfYDLmbs-y`EF+MyTl5=c46*ulrs?i~shfty$5Pk$L*gir71b_~^0N6PQ zKpl%44_#mZ>G}nKHfWbXKm-QnXyX_XM9j3Ri^-Y64hG!bgI`enuTTAVSifKLvL7lJ zuzwaPkTd8H!t3a#1rgO%Ix7@h7%z9Qk%3YMeLutn6tE>tg%c@%Vh#|})CVQ<(HTtN zGh|0_K^#%F?qL0rFc7$v9ne|ppx|>y5VDd*32htg(!E72pWx6|t2Ti-J*>NPP=7+5 zhu~v!FbUD#X0P`>0J{zp?gser{n89HRC^OZH?%RGDM<+7>J&^h`L(~5b@$z{E|LHw zY@jS)OiT|YA zhq!-!SKQmBYcr3SzJ0s~AS)>bP~X-90)Te%^ZR}>cWI_@ z5L})gZQ++fdT3H6p3^L6$BIj329{@?tR`0=@6ae zi+vAiW1E9QMtsk_wkrD{Uwuo0)%bISz~9|!;oRw-ivZR9P;JL(CSdw}f&&CEztSgv z6i)<;0rfIJw=rm2c=-PNHGR-OhzQO>JYHYMTQaNgo?Q?ZcbmTgzBreW9=zR`iC2_3 z%YP(N6ALz76T;SczPF_+szH`eO=`i#gRcE(Pulce(i~2yU z1^U7(fBOmqp})BftK6@{hfE2!jxVBN1ru6DL_M(_Daz+o)alx>CIZ>%IsJFr)m5W# zUys6V$NQ&;ahKf07KrXj2O{l`6L!1xSz3_4qr_3v1Qp3u6pRO-8x2xKzibfig}UF%y6uCIa=OQB z=7P1-cd=FTAL?M|9eB!}M8KI;0?5^_ve)Pi z@Wii58cQv@Z2UL`)xd(<#LH%Uw@}fS;+)d`r51EoS$JAq zzS|wOF+oAMB_>CXh^xS)X|_I1vPe=4>DZ{fLd$j=4p8oHdJRU~Ula-g7s%~^u{)VX z%Q&dEh{5;Fds-o;6}nJKh1sLVCD`AN6Sx?^9ul{Q3F*l?3|xUz^=)C(>?b^j7obpXEkg@?#9P74ZnJyl0^i3&@?+M-4Xb&P}%oz@!xE?IKPak(YY21>+DTyZum0 zQf1$^YqAWCv~C9?vht`p(Le=YQtEZoiei`D3hP{JK04A!s_*MVq8; z(wQQ!$llQhi{bc(;x-s~XKE^jt1CpYA_{&`2Lkxp~aa;6Na$TW1_d9h(%vhz2+02e#>9`BIwl>(S8 zU`vnNbgHJ4?4>Zc|A;Y2>XF`#Lj6cimWQ6)3UpYc$#WTJ=iH$Gqw&jA7xnqrD;?; zS{re`v-sB{?)P?H_yC$HDKQnxc+rI)z33OtG%9=(LAxo$Sp=%zxxrRYZRE9lXeh^j zRij`68RyP&AqQ8H56(|wRVF*#bCIg1*m;Q^5YlqE$#BboAN)dCS0*59*=vV-i-fh% zoCF4&7lk9A|E-9dLHV8>C4qq;x4hyu8?E?4ujNz3*s=yEu>5vB=2!;oDL-ZP#9;FG z*ZUaJL42tIEMvc43hX|A=?o7+dG28fCBj(U7xLKrYQLJ_TZmGa(OobT?Pl&=G?JpT zdSQBGI>R;ohURBU+@nd#ul9OxdVROi?q1<0gnY{rc2g*aBwuCCQU~N3BiHSsM$aY6 z+33ZBqXwf!dShMHHSU5Cb)iD|lEny=QbSbC4pR1}HUnHkffRUWRq_EQ+ne{9O>CI*9?A>Nw}B*pS#V-9Fq(Njq;bFd5f8f*WEbCHX~U6 z&UY`3{qUYyqPBGt-aKeB-J*ba<2%O)yfkn+*(q!bHt?ctR+&>OT%4UMDt>Hut2j%0 z)TTl@4iXKA>`me+Xftx^CsC7kPYHK>yufI#9UYp${QAyh<`NgU;>G&Sy5XWlE)?ZR zR&HCk6;vh&i9Y9D<9>LbS+?r$GJH`UVM`LVp;5sj(#3GHM=Y9-Xd2mjSLlDHoQvn~ z8}?22r*rPc&bipiIJNd^$9Vc*C8Vj@SUG~5w3!nA{sQjKyKpI?((@E?9YYT$)PrSO z*4)>npG)aUV>Zdv&Y!$EEb1r1;AWp&2DgQyVE}y0_8@`%c|t;#f`q8u-5j=FHpaM? zsj_eoL?4D~8u=hvBlmoQq7*RPGw059*lAba{TpCzexJ@kF%EiWmXBZQ^0S7m$2Jcc zprSi2emsrn9;s+uao=PXS0PGo7sa13AlD#VY4dr`+n>1=j?C}SM|8FEUVo5^wX|d` z*J)ki>tQoTtr`~`Sd+D`rdbhGG za>|`RBFi$wG%{X~IoZM>`RUtAu5pvdiX%ii38`$4yyW0X-qt$9tZCWPGrg*YERL9yp2*k|E)iTKU@)9ueOuwyKO z$=K$L#D;fA2gA?pBtvsUZ+q}X%SeScRaPJD3Ysp6#ok>Gc;klIWM%W}b2;4MV#sQ! z=KkqMlT+Jwdp-^lVh{i2#~uQriGE-dO;C5UL1SDVoQM0m~5;k`FG6$Nt2EW zwM1~^j76n|JO1{KpGKSW1YR*|^T}qI<}>VsRZci3)WV1)yVOOqR0T3k1*x}t1Y9)Z z<-EG9Gf0WWi~3$uUR%#AOYmnsts48Fo_M_adDzMMC^Zz?T{pn@9Oz3;UtDIeF#r6YfF0k;=SO&5+z) z*FhtQT3Yf2Y2{`9y4xi!?NOXl?!P5+JNP9b`Z&6qKC^SXM+W=HKSVc@{|UG*j+};= zSk}(0MLeb0G^e*@Icgpu4sr{`j&Lt@uRMNi3?8qgm+Io%X_YLJ7qz*}0qQtd8})fp zgGfzDr?R*XLI4)Y5^0XAN>HW^c?t6#uZ%k)^${lF zQe#&2jDuMTr|lsPJp0K3bq=&y<0kN-{>l(etiGf$(v<_lw^CinmT1ZbCo}j;wt0QO z2=4=`nDl!YATvQU4uM9Tl(GSVmiG{ z^mqlH@~kB>BCIX1;@I^Rs`PHk-%k4KjAU7jCRmE`G~DlrMaZSRJuCdY_hL-iQ-QV^EeBL@-p!sA70G8gaKvEZlRuTAu-#Z-yH@X2)#=M zC555KA}Gj;H72|<E;C49=<=YaK;8z&n^S17Cj-P3AM*=Lxg=Xp!_iAU z58Q3eVfLhwKJiq@9bW~0v03br9@ntA|DfFOAO%6n>l_)}4Ft^*&}ZRl<5qfn)81o+ zNESwc%ZO2|+hB-F+^1U#e4`^Fx3+SIzSZK05Sa!+lk^&W{c^#$=+mA136|By=+dPO zECvGLBtK`*m3upUV>#I>g z;_DX-WxY#My0Sk$8JHbq(s>yt7ta|bezpg?KZ9@PehyCHV3zOn$P$GPe6y%QY;~o^ z9dsBT=wG1I>UL=ry)rEWsFnY`N2*&-A9+K&UpFGZuLv&%3Fs1BwCmM;doucS&M7)Q z1DW@dIH+EwY>}083BQS{+eaovoYqyAdOPd+Fgo`?v~r?fL`~? zF5kmUlVq@GBICxNJNgi8`j{X)B4j^Nkd)k>3hP}+_DSIS_fYn){3_Q@FNmwP-{uxl z>&x5o=MU_IN8_s7XYP!sZ~<3Wx@WmEmcn#MUwXk4MPf|fCFlBEG-JcfiF77IAA9!8HntbjLwitLn7Q@^t5pF4g%0B%KbefDe``)=_hcP@QBhBIc zN}Bl`yvoHdzO`%<&A7OER%0D{djkaiUVgnj)E$3CB1stI5M{qYo+e&bzJ-}b#Lk_@ zE-)aXA6@CE@gv=2cV3G{>8n4ODxe*4CHjKRt2z?kMxhp%0Y5!gY%US!Q;#_=0yl)h z!=pEB64N7LEl2-1^Qhy##~FELq%@}tRx6$S*Dqt34lmvHci{cjFNwYW{fRV+1|REo zOGT}u%vl4+^KbcL{N%1PX4oVUZ-ab|u$qE0p)T4;?z8a0SeI3;fh(-?2;-#%$O}NEoUJT{GGk`u_T#>=Jp&a%exI0{x zMiG$_ZS`(qygxN&u@-1E)ST!Ff{5{p>>3pnr>)d_>xz_Nj<`s#yGVHRCMnAN;AG(< zaQZLldN|9ZAlD^;HplD|69FF+U%lOBM1|HIIyLi=dPC+F1_Jx3wmu}KwT^Kt zHx;MS{*G)Q_ow=92TDyvwdZx}MSU9dzg9PVglbFsl}dcu4+XnxOm+J)j5ks685&O7 z#!WVHf9zQB!!Z5MCy(iy=_C{7z5yosqn3$e&lT%txho6>Nq>{Q_Bb3h6 zWRsi8#7Sdw0WKE=%zTt%rauyQZ?nBdh{??tCJ~30mF*Pr>%>k#{N>)GHkE@~dS8(w zC!eCuj-O**?$Y?{@BPb!vo18|Z7@;bZuJxL29vQ3Z%(`=J?h8_L{op(eZyYv?_RwF zW9}7U(M1FTmJ*UYVxq*BG^0^oUfE~3VjmLo;@CI(K4@RG*kR=w9pj~=jO z1$gvn&P~tN@3i0i*E?7`ZoW&V?mxnHw{+RgFk-D5@%WX329^R^qt9oL81ddEou3&b1q=QMmD8r$T8~-I0&6 z_Eu*HlNoxfFxTc!s$X;-_wUH;akuDc2rbi2iaETaoPAxw{MZMc^XqvNlAykW;3@nG zcAMu)3GvRi_xLr}5buKVJJqNc>_pgGJOia`7055_Vi@)Mn17*o@pI(_m(!#5Jh1P) zmJlyab$psNvoVN4SPUDUs!?4$+VhcD_Rx370^wL;OMt8bj7;U)4>B7S#Yb0DrU zs$#Si)+$iG*7?$%Kw(eN58@Y6XwbOJL`j^da%sE#JXIqgTt}QyaYotr)Ev2WsO@Y_ z`^#iKF2@OawU;GTCY9PAhOmV|(}tXaItXsxFd1BYbhlnW6ohL&HjzbJYt!N5_lhHU zri$`8X;WLv_A2%Q0_lP`fQr@uTlkDMjxy`|O`fk^*17NeK2)SrF(7aA66^bVTJ-QS zC|27|qyw+Gs7dMG3*Q%r|Nd{PFauX?94ZBbxj-eCcT+?INJ*%|IFGO>r4Q;J& z?&0Wc!8XFY!C{0RE@p^G8zJ9zQ+Nxj7uk_Gft4c@NMKn<-o~-n9(j(OA?Rxxu{z`` zlPkm7)6io+31!$eH94pEwndcae%H@<>J^-pKz14komE-bB)N^d;B44?wRn9JIl*|| zY6s(i@Ofkl@T3vG;($R5YI?13+BPQ47#YU+b`nB-5p3(vSrMk3wFnH3^is8kt zVBg=wOroKEbIM=3oQh@m#b0nuw-2D1^**12u$$gYVSaamYP-UaX^=9^N7zU8bQ~jO zk3hc5cZ`zfH4Ks|q{uixz7;#PdLqZ7S*Md7tOUUAtlH!gl0O z%j-c1##wcY^m(+(!f;CsaUi<7-IO9kT%Un@SJc>M6gnBbww4iCDF{TB_7FNsFnMiz zHSCp%ZYW~mC4hl|1<^HXLOpEu>y3KT@RJUz5vmwvDMzuH0pDDL)Ug$! zij~}@0*1-{LArQK1{SA6b$Rg3keP!k2`_67zf{vdXEqGCVQ;L-L?X6A)-khQCTf_4 zFiLJOX=a_3lPyXu!7s=G7&_z3*xAlOj%-WdvQJUKiHa==^qJ5EM|Cw;A}=vWxT~40 zVRK{XZ`M(Cb<^c+Fh)@DIqakpWm7Ermkr|^>7pGV_|R3WHfej4s(Q!p1;%%WwW$e) zC{hkR%edBduM(JW%a}QOD^f#@cd~Kd^D3@(xv&sT(fTh_2@`a7I(|Rb&;0UGCVyuy zooeqIsOICS_en#HyYTyN)JiHwkRCkwKra#`$p z_sEZu!)Crjf0f&Xv5k@`{}FF2eH!s0?xfte^o)+E?na#L^J1DaU3(Jy6FrW}Ne-gQV}W(%q48Bzd5By=|Kkj;h2`-SV@_G zw=L+)$ht>_lmrlMlM@$`#1h>V&OUZO|JeBMX0@2#*xcIOHobDM3S1Jnos2^Gz#z4= ztD)Znoq*nhk^{?ZY+Mi#0YRZ1K!Sinudl-!TT-40x{0`%QlWqccS(Iiib6w!7dzNa z7(Kx&973{%@58C!K0NF8Z5M1~)6~V7T8v(Ti3eV^Lqz0*O z5X4GI!9e}f$UX+=Dgzu#a_KM``|-nCA;rywqZI-xypKmtjCIjce8mRf*1p(-W~&1(Cgx&!(+A%PAczi792 z=lf6x^uED@?QHjEp#DTtPK_WK!MX&2{8n#ynn(wg#{9OAUTlZ_eyogJ3Y-&-7b`}H#4Jz$rg3z?mNLmwsc~? z%Mbo7peKph-WC1NW{GhE((ttnal|dsKL&pCfmc-r;5_{+_U4d{j|Ptf92E^684XlW z2UHOr+tYsw4#$r?C#W#z@F@%j+w)HRBoeq?0L1pdy)=3$_^((S zN|*=;%sd!EOZ3`^A>?Pq&ope~JJex@5c&})1K8mR5(LQK|NGg@shA0BYh?U!_eoHa zuE4CQzS?f;(S7pAnTBSNAIQK*BnU`A82R5>Xc&+Y+kF32t9heFYrC!h$(qh+db~T{ z^;<6oj*I-P?Qaa=)7^j1)7$Mo-45=#2yo7iMklutn5D}j_=o?>XMVzuVCK)vgTMO6 zk4DMI*7$jR{v+ey&nTi>7`Ny5bbI2B%hNQL<&Zw^N!aj^-pA0v(o;5%1D0t6hoTP7$a2Srry%}9m-0(JHU8yH{$ z1U&i^fC2=3>OX}04Al+@{87)Jb|HHx3ltper2ZxZoK^*h@E34|G^sk`RvLw8?X5J? zfb+Qb#u{5~^(-|}2KfxV&)&`R)0n1J-$Q6;x@0-1S#$|k&EjpiqUp~zrk5f1tk`5; z@P#VAWvI1XWz?9K*D2b|lX>JWG|6o{40`=asu`ow4!IiennDs^5GI2Be~g_&cqUA^ zZDZTEZQHhO+fK(F+qP}n>e#lEFZTII=edJ3xHYPp)~w!Id#}bTW~2VQ?}jp4iox8F zA}w_}(h~LZ+TtoM)#xOHp|>kbf464${)6xd`8mdr)uLHa6}Lrgw$iNtl(BBj zq?#xAC&mO1RyPT7s}697FC$p-C0f|MN;U&8|2s{E#4QJ&%=Bkcmv?Nr(XGXFnufb`R-FLMj|7SNA=a$lST7>#!$rTM> zN~RvKK$~#A??z4&h60x;g&f%Ii0X|lyg4i;S+MR`egX_Ma`&JLZOkq7a^OX`s*%rO z7;>MF|N3g#1oN2=_6dq8Myz(F{=LF{pnD%A%A1m9vIc%_sI#X5|3lrAR_nh@*Ko|Y z6jPmC@xEHQvKJe{RylE5j1z6Z5h zBB2hWzzb*H8PodLZhsJnix5ISPai<3j~YFA7y8!t#nzjed)7Xi=&8GYaE9h!1`1{U z3&Sfd9HIj1Ir7$0=&#IBN~(z)&TvULBd@vuuQ&d06KC9pNRTS$&ye=x{V@*eTHH2s zk%u_-W!Y~Y?X6lAK>3D6$Firli3#}lH^yZ%{1nX`vSqecwjC!Sgi%jp@6%_!K_Q+v z2y$8(eG5kQoMz@dhQNe&!}(Q3Zbu!#sE-@3M8S}=w+lRu)8i{<@u~iCf&258qt6)> zJGS2%n(!`OI>=_4eu(w>W;?4nl@Act_A3^Is%AIiD;EwpEtaNZz;04s%8y{OGmkTI z34AMgV+G8|?2vW&h}efwj&|c7m)Jml%;wVTqGx0=%)0{HE(?Ns)|L%1K~tKmE~chE z$wx_YMqjZgqI!%Ui!5lO@CJ0np%MmtZZjwT820%2KcKAZF^Cj6aL8?HBf49} z=lBAUHxDs$iE(>fzbhqu5>7zC^J;w)bg={0j|unPYjTCOuO+8@bN=I6`RObAz(D;6#Lg0r>DRZ=4;om zPv@S7`>(po_T&l5^MYuwo@!a{qGZe@#W(h|@aHzKiu zwwtC<$SvOh5KbArGiT@~c`$&{={yxJjwCw39INNa5FtRRmvo}nAqSrc&V=W~PQ0(z z0D;gMlY&g#5Vc@^sb&DEx5Ma~m!~h9bxNhqy1Ca{TFQ&;^JQDPqud z-tSji1B{zMH*0~3zvEy3n4qkf;(cWTnY#w5et*kFu`=Vojn>#k9(nXQs&aCb>=QZ= ze2|A%L><54W?UL8V^GlgJSakg>1$>`v9ezG$DI0>z_FdmGH%@)`v5jmoC5^|#p>Q{ z%8_aPJ^Txb!{OgDp`wH;nh0^UZ5>G;M4PVMThwS$9g_26Y_Kl}Ydvx9FOHA7uLPk) ztB5-zu=@dJW`Um9sf+F!->=1F{EK;;GG_JOcK+>&-Netg`f5O%E?k|BR1@!x3Z3SpYDr<9ZRWH z(ryH;CbZ$dd_SZ6YH27r@Xo0c`%w&u-#6{C<@LNsr|~5gnZ|MZ@+!u3aa00tiD_Hc z8-;9s!&;PURQ@j*L*CdZ7tDyJlUfws-ZzuRS95?%I8i~CqxSUj+Xe1b{g7hQZ1|t~ z2s|otbqYM&FWZd#CpW9nHujv}%V<`aN}fqAP^$>;T->UK*X|g7ZwoikSRdc|z(Nr; z2SziAA<@u`@Lu{1pi~U&t8BN7(?8<5FmYs?Ba+DyMDHI;0l?69m3_+3y1b-S8Deci z9D&8y!18u@<<`2&h-;~O5Fm;}IG*{JLhS58Iu0+7-dAMfp;LxsD|t@witq^Nd#Zc@ z8@S!l!wlb5*G{F$Rx?~ja2vLNOg|$>#+T);U=hbz$|e}$cB<9ilPYEQE1j6LcGhMM zt&>z?W1Z`|ud*~!D0+KpZ09bAZP}0f=5b}lGrKG2Bx*-Rl9#z7tE}gdImhqVD!R7s zP!kBzTuJ_=0;vnGfwjKm64U_NoKyuC>#Wz-MDo&A)6R~MK42RB(kOY*n`G(rU9yK9 zyG8!R-NdE)*lyfUk?kdf8VY^wDc(a}Wjn~DUC51@*s8>7P|-wr&6X`!9cY!bfKa4f zGkEv5@U&xwrGPnX8yQRgHG04jA3W=&m*EyQ3LfS7qAry5B1$2`i<# zx9CIQ*k*2;TkFU2W6-~tE~)}g8akIA>fW(L6t*sc3>`qUF-n_4Xz*2@mj*39wz+-S zk*Q0;rG2v8Q$~}i&ulkNLntyuF7rV0dPZiXfal`HDnB)%9?8&>c~RMS({2$PvyeUW zcm?8NN`JpU8q4i+TL$s+!sc_w1H|duS)G+L-s>VW*@+8DR%p&^cD8c=&RheIQ3B8r zjtZl+p$Qc>%#YTNe07CKfipZOaTycQJ6=6C#@1ob_K>WNVa3J*675t<_#ouy3*1A^0)DbqZ=gppN2`dX{uixT>kcT+^bt+5@Rp^#F-HZGHB0xAGozTKrvJ)stEW zc&$|ZW|{T(POe=?*3({)*aD2%0x1LDA{%h!d}X8%2fS~^hmv5(yUAf-VY1Ga;4{|` z=`&ji9Qf2}&uoS^JqvG#93w7Q(o-Q6IHi(duV1Kc0w-#{=LRonAXdBY3^I#_4SqZe zmgcRyr$p33q4HtREia|N&#B79ysw>9x$iT^A%~|nLwY$+19M|XRvch)qMd<~cWu6y zJfV;pJz&)nYhJ90J8!li_j45mmiLf0(=FuF#3N_yh3~#CS&MVIy+Qdg)*zu%)wqA! zLBR}|tX?;F*m77dG*jK|c}dfE@7{Y=?5c)x=Ke4OhPb1t&c0IaRlWNHOB{>x{Wsmh zj6j{PlmA5Dt~FNnL~5!>JC7ael<7=i4$+G;UO5i1CWxC!m$6RzLD@2-i+JDt z;QFwMoeF%{c**m+Pn3IYR{6}tXBeM~vA_!Ic=p=PPquz?X?TrS zeU*D;(CZ@f@e0!wCp=dkS$rr}97*>w=Q(>2zns3`MF?TqU7`)`g+(fmTnr^CXlPjN zDO1A<_tn$o*t7TZh(st6@E;5y;a_QwSrVP*bgb%^i{y+?SpmSM0+Cy`lTOmbyy(=6*w)rEYh@$}*wqZ1nOoviU)odUC zk)nS>$I*8}3KRd~1Ej+6RF~ASdq+~8s&#bsXn?FUjfxP;KRpYS^#X|LJrK)z}VpU*};5}&8WUJUQRP`Auv`)zzWVBFDb{2IhCnNuw7#sdHZ?3osbkf-pI zc2y&jnr&o&J7@u2;Z+Q&Qzw>+$u!~iQvyW#RRt;aytya&ewY_$j>+xQt@Ru1qcpDy%4wBKRMA=zxLo78TEXQrM14aqyHtnYc z=}Ksg(4Oi9|7+GS_c26w1%JpFbZ z<9h;U@Wckd=#w{bdd>tb7KaVt9{BzLqs^uD@hJwT43i*hInhSE2C7J6_d0fCac!#T zBq`VVcA6od8>zqAr=3%UyB;Pm0%vtiEo!x* z>aRja?|_<*F-2iC@ZqcQ6WB1G?thZdgzj)3B=$bwlmV@Bq?2!=m}?^xsRn$iDl_`A zn^i>#+G1mII^={(W;~r~t}r@uZRHn27fo#KC_$}oh9^;DNCn4B{zaC|m5{Gg1PMC) zFYFx_Neg;CX{zs?mD1^ngUZvcScwsAmZ)S#tl4oG_ZcEkt;RP29PB>or#PXy^Rf1+ z(O@Y#G)SqGSdp(U&jY5N$Q9jBf|2Sl3ORVuH7EK{UI-B-Pe(=iO-H0){E{NH)FGC* zepq`B)(-PlIJgjvX;Djc5|)(2YGhm6kWEdJ)arHY_?!35ncFXH?{BW zs=7Ab%Bah1KJlEXPB88<+=VQTnFm9w07ylF%|6YERZsFn+Mg9{4GnfiyHv5eQBR>V z5MIRnrIi9|N=R$0cN@GKsLO}C>hD-QvPPPkFDJS(T+tXE6MS!Lg-6`|ODqDi5#om; zIGtx^r4+QYrURM0=Sc*QSblvMw+J81^V8c1{Vz#x-*jiY+omKDiC!ZOIPA8 zrLIG%-(wdAm@BkgzF!N}$3&RBSym$7Zl&W-*NeG74CA4lt&W_C90&K?Q62Tg4n`Go z`Z^z1=5TEVjBk|uOJd*Uf$__|zL^uRa%gqw?}3GY@D1@*zI%IPZ-PUn6ZwV#;AQ6l z?)sDi2oTW*hG7S9rNUuzdc@)vQM{4J@d+N`lwG3PuPbA<@-Czal|#0bx_)Mb!`p4n z@F~Srh!mC1CT$q2LWtrhpc>&d6~CD;1jf`6Nis?M{@&WBt=!O~4V`4Wfxmt00j~!>y zoKT`@{p#7$#2gSSIRzGEN_u@D2pJNjODB|*bj|IX1;Zteq4x1C5j2#vGQlZ6`e$5f zOga&lpGluLpa7_O1KAhqlc`p+>!&25k3H^{a}VqnbMCPA0#sD4XKZ7-kpW?A>0+~FW_qcWrZ-$N$as^c0yTe(TQ(X9MdMpYNyYi9M%3tH=$ zvcFkN#HX7+A=xTpxcKtpwybGDWLLmE?6>MG{$kR&?H#76&p~4-iiXV2ti5Wb&^%HH zw6|IH-_n;6LDBzlQ*vAs&ZW z@l1!Uv(EKiodCyb#Kv;DZ|Qc?X=#ePr|us0EL93IRDUO-@%Q$H+s_$#DukhmRV3Twql43fL#kLYY7Px!--{DC>rVPF zYpyU*7+e7Qv+$a9eH%m08*+8WJO(?5Y)~)2cOp_wILG~$u6M~`c=94BhR4O${9t_vKXhxTV1< zeFtC25ot|;PYuP)Oo2O3*NoHNZW z3*V_v5(6BZ6s_>A_}OKqdvWTO80vq1$}I3de-@M+CJiFX#P&A7_JK4;ZM_>FU*5}t z5TheoqnAzM!agLoR+C>W55WU)Jg%?_`FF0_S#n91S^KYO!ftGc00sxpwLS*FY^X`^ z?yn`a{kn$QOV!;Bwq;byV%~Y9TGQsq%w)ciBxm;#YwUFAvH$plG`UQR3~Of`QpjQ@ zl2HpzXh<`0K4&KAyFX@dN#(z7t;^a~qKKsUwA%x?HusGIX%b=Z2+7OWv<+Tsd~i312N7_oBQ7OHjahYp&RA}X&{ah zid$q<%xO(C`rS3D&HPQ<(oAIeQ^UOKx)gb^%hv^tRpzf!fCB!oJkfv}T=w$Hm_HhH zrVkp*9ilUYwezF}IRDdH9)#Eoguig!%iE1QcJOiP`mc2x+TK+TzC{EdNt z?jL6^38}l#>b;QhbadYB;T4R@IC%co>A}E!MC-{{^K{09L77|^tj=_p?X;#N^cf<5 zWn4H$JeY5+A!{)-Huvx+i(d&9XjJZV$ld9~{&OWIq+=3uHbfLFIn=Eb@`bYntTZ2T z#K+Gjvdk*l%bhLxbcOs3)a-tG!4kM;ic=~i_Ea928g71sszB)7f&1uPnBaZw7flzs zh3H@Cf7**4!_+DT-UqMjujl@7^%Anp4&@QThcEON7{UVJ=w`X{lisW$Kp!>L38qKt zi>I%vY`wmc9*Et${e{lW^tPy(-$v!9M7$}fPYh8i=NVTjJ9a*MeA*;VMs6|n@3NsY z27M(&^}>JG%o4iXJ=ND2^-lI@*wl|D>nCTy%+jcS0~jMI42QC#N-fbhmwdLrZVjmj zmnafzBwC-bl}@0!<2dp88lmb}hw<*c!w-$W3#LTXuxosw5N9|*w*uzIjciQroZZEQVOg?d&WUQB$xzl zuOk#vFPJvhK19z~9_opU-5mQwK?}y>$^I$5UcZ}bZDXxV!9$Q@g^BA~(+Y-%a=u6< zSFKhpz9JOsfS-x^hrejDCLOj_%Iz-qksts3S14<35?ip0Ppk6TT()-JUnM6BiT6IL z&Foe&?i7ufr6#~`wfOjNy4GDTFbL|XID&%?=r}@Gq`O5f2D$dfON{k?S@pGWBT!5F-k=(<+)y}3r7-}N6JQojy5Uz7& zIR}0dUmD7+vtDAQmEU*f_IxNrdi2?kQ<`XI?F*H^Kf5*?L$&(tF#D=BM|HTx%??irQlIHP$sM3-HRC z&Gwydi1V3}2-;ekTvHPQU2HxEx_vB!$p!x8n>Of({+}9XzGcnp;T6czk$fp%R4J{= zIn=Hr$Ax=O05&GUgBqWQ!kggmFWJZcg+OrpUkC&T+y6oj|Ji1lIGFzT`2R8x%>Usj zO#i>x?N)F#TpbLC7+qL#9lc--#9O7DLj$}hFsLvv&;M3b%AvvbPE>bmhp)5O(=P8) z=KF8!uC6vM_g-7`$rk1Eu}qa53561A0vVdg{K(YI5F}D^db))@IQFLC^a%V-KKw}`(w~?R@;|Bg15=~pQ?uhkAV#Lf z2jA($%V~&24(CuDz!R*XW(7zI_&BXt%bTMZb`}o5e)IitKsu&8K(vgEoJWSYK*+QS z^y}+LAPJl;oRHf5dscQ<&`M!AA;K>Vzv#gl1KYd1S%^?>E-oe9Yt8{x>2~w4SkA24Z(@*x7?ouc+)zE~JOLr)vPi4I%QFXFxzg zO`zX@_xMxQf+w_q1NOe9b?XQ!F(5b#+`!WO!@DiG+YcH<9LSA}gDYBF15eCg^cQ;o z%?=ubN@j|Ai+76^1df=ZA0D3mreOXjJTBZwRY`WlSU@X>~u)2Y+XxKr1(r+yqdKeGr zcE-9ku$)~E9gqeF2LsUSSXWxA6hvr<|Z^ECKeE34p zFHa`$b5?g@piM!!HS+^A=71lQ@4(YfLx$f#wqN{{->IkHS*gXrMF1oJ%^t)rVQ(S& z`r-*;wB;qwx?p_}-;*~s(XVY4@Q1JGi7^a64c-hLUf}eg zN0O0cLL|!i?)sPG<`?~cLPMuCBPc0o8_1vU5kB9>hOhWr@97vpenC=?`Ry-VbF0@L zmzO|z04D@L<4WKeF)(v@*4M58hXTW&!rIzG*v-fLd}PXj*k^Bfd7-($MqD7XaG{%g zeV}=EUm&@{HmiQf*->bqs4tA~*bZQ!M!~<3Kxn_5ho>MwCqJ=XT0lajf`8G0)P6$p zOsjrz9|XqPzW&?deB(L;K>o}l{#_yDr=4zQeG}Y&ti|{R&JXebNZxlvN$c-^mi)#0 zcZuj%#)brdY~mL^`~71FRB&Z@->+kHZDjko{n+nu(7E?J6xi!Pl)yTHWgh@xGjr#t ze6r`KPb_jg(!x#i$1BILc5;j@t32LhkCfT?o>YUK)L*zw%B3$`U1hIGUU>PG$JP90 z+rBufW-ROo6E*WV4m(r%X=aIWy^^b))+8!Z^O=boC$gx-&(O}-C`D?BX-j!8Gvm2J zrQan`cZD7EOzg2sDM^>2K)bNDw}?p}AwA=Dcu*1j6QVevRelckt6f{Lw&-hh*j+RU zO@-PFT*vXBN$wQ$+6TmEdPA2q&yb%PoaV?TTat1O;5OoN!O@% zE^W|-T8P_D%KOOJSfAyMvz7W5Ol~Q7cfF3^LcMzOC6)inT6TFlE1yKw-T0!B!-2j+ znie58ZC0MoEO{g#ynOq}85MT=;F;jP3p0sW{R4l@={UxAwcR%HJi9H6�lb_u*K1Eh&k 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

50Th$4VV@Zy7VJXu#AbC6 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

RTn^a$3n*|%NMJA#Qt)Atw>RLx&rc*jI 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%0ARUULL42Z4u{Ej&<+yuGT|Ea<(k#z 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 literal 0 HcmV?d00001 diff --git a/SPEX/Doc/SPEX-3.0_UserGuide.tex b/SPEX/Doc/SPEX_UserGuide.tex similarity index 97% rename from SPEX/Doc/SPEX-3.0_UserGuide.tex rename to SPEX/Doc/SPEX_UserGuide.tex index 10a27e8f..e0d56eee 100644 --- a/SPEX/Doc/SPEX-3.0_UserGuide.tex +++ b/SPEX/Doc/SPEX_UserGuide.tex @@ -62,7 +62,7 @@ \textbf{User Guide for the SPEX Software Package} \\ \vspace{5mm} - Version 3.0, July 2023 % VERSION + Version 3.1, March, 2024 % VERSION \vspace{20mm} Jinhao Chen, Timothy A. Davis, Christopher Lourenco, Lorena Mejia-Domenzain, Erick Moreno-Centeno \\ @@ -1515,9 +1515,18 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \verb|mpfr_free_str(buff)| & \verb|SPEX_mpfr_free_str(buff)| & Free string allocated by MPFR \\ \hline -\verb|mpfr_init2(x, size)| - & \verb|SPEX_mpfr_init2(x, size)| - & Initialize x with size bits \\ \hline +\verb|mpfr_init2(x, s)| + & \verb|SPEX_mpfr_init2(x, s)| + & Initialize x with \verb's' bits \\ \hline +\verb|mpfr_set_prec(x, s)| + & \verb|SPEX_mpfr_set_prec(x, s)| + & Set x to contain \verb's' bits \\ \hline +\verb|mpfr_clear(x)| + & \verb|SPEX_mpfr_clear(x)| + & Safely free \verb|mpfr_t| value \\ \hline +\verb|mpfr_set_null(x)| + & \verb|SPEX_mpfr_set_null(x)| + & Initialize the (pointer) contents of a \verb|mpfr_t| value \\ \hline \verb|mpfr_set(x, y, rnd)| & \verb|SPEX_mpfr_set(x, y, rnd)| & $x = y$ \\ \hline @@ -1579,9 +1588,15 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \verb|mpz_init2(x, size)| & \verb|SPEX_mpz_init2(x, size)| & Initialize x to size bits \\ \hline +\verb|mpz_clear(x)| + & \verb|SPEX_mpz_clear(x)| + & Safely free \verb|mpz_t| value \\ \hline \verb|mpz_set(x, y)| & \verb|SPEX_mpz_set(x, y)| & $x = y$ (\verb|mpz_t|) \\ \hline +\verb|mpz_set_null(x)| + & \verb|SPEX_mpz_set_null(x)| + & Initialize the (pointer) contents of a \verb|mpz_t| value \\ \hline \verb|mpz_set_ui(x, y)| & \verb|SPEX_mpz_set_ui(x, y)| & $x = y$ (\verb|uint64_t|) \\ \hline @@ -1666,6 +1681,12 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \verb|mpq_init(x)| & \verb|SPEX_mpq_init(x)| & Initialize x \\ \hline +\verb|mpq_set_null(x)| + & \verb|SPEX_mpq_set_null(x)| + & Initialize the (pointer) contents of a \verb|mpq_t| value \\ \hline +\verb|mpq_clear(x)| + & \verb|SPEX_mpq_clear(x)| + & Safely free \verb|mpq_t| value \\ \hline \verb|mpq_set(x, y)| & \verb|SPEX_mpq_set(x, y)| & $x = y$ \\ \hline @@ -1807,6 +1828,67 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \end{verbatim} } \end{mdframed} +\section{SPEX Helper Macros} \label{ss:SPEX_helper_macros} + +In addition to the functionality described in this section; SPEX offers several helper macros to increase ease for the end user application. The first two macros are a simple try/catch mechanism which can be used to wrap functions for error handling. The next two give an easy interface to access entries $(i,j)$ in a matrix. + +\subsection{\texttt{SPEX\_TRY} and +\texttt{SPEX\_CATCH}} + +In a robust application, the return values from SPEX should be checked and properly handled in the case an error occurs. SPEX is written in C and thus it cannot rely on the try/catch mechanism of C++. Thus, \verb|SPEX_TRY| and \verb|SPEX_CHECK| aim to achieve this goal. We provide \verb|SPEX_TRY| and leave \verb|SPEX_CATCH| to the user to define. + +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + #define SPEX_TRY(method) \ + { \ + SPEX_info info = (method) ; \ + if (info != SPEX_OK) \ + { \ + SPEX_CATCH (info) ; \ + } \ + } +\end{verbatim} +} \end{mdframed} + +An example definition of a \verb|SPEX_CATCH| is below. This example assumes that the user needs to free a matrix and return an error code. +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + #define SPEX_CATCH(info) \ + { \ + SPEX_matrix_free (&A, NULL) ; \ + fprintf (stderr, "SPEX failed: info %d, \ + line %d, file %s\n", \ + info, __LINE__, __FILE__) ; \ + return (info) ; \ + } +\end{verbatim} +} \end{mdframed} + +With this mechanism, the user can safely wrap any SPEX function which returns \verb|SPEX_info| with \verb|SPEX_TRY|. For example, one can wrap. + +\subsection{\texttt{SPEX\_1D}: Access matrix entries with 1D linear indexing.} + +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + #define SPEX_1D(A,k,type) ((A)->x.type [k]) +\end{verbatim} +} \end{mdframed} + +This allows the $k$th entry of a matrix stored in any kind (CSC, triplet, dense) of any type (mpq, mpz, int64, double, int) to be returned. For example, to return the $n$th entry of a CSC matrix with \verb|mpz_t| data types, one would use \verb|SPEX_1D(A, n, mpz)|. + +\subsection{\texttt{SPEX\_2D}: Access dense matrix with 2D indexing.} + +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + #define SPEX_2D(A,i,j,type) SPEX_1D (A, (i)+(j)*((A)->m), type) +\end{verbatim} +} \end{mdframed} + +This allows the $(i,j)$ entry of a dense matrix of any type (mpq, mpz, int64, double, int). For example to return the $(m,n)$ entry of a dense matrix with \verb|mpq_t| data types, one would use \verb|SPEX_2D(A, m, n, mpq)|. %------------------------------------------------------------------------------- \chapter{SPEX LU}\vspace{-0.75in} \label{ch:LeftLU} @@ -1836,7 +1918,7 @@ \section{Overview} \label{s:LeftLU:intro} %------------------------------------------------------------------------------- \section{Licensing} \label{s:LeftLU:licensing} %------------------------------------------------------------------------------- -\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ +\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ \noindent \textbf{Contact Info:} Contact Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, @@ -2291,7 +2373,7 @@ \section{Overview} \label{s:Chol:intro} %------------------------------------------------------------------------------- \section{Licensing} \label{s:Chol:licensing} %------------------------------------------------------------------------------- -\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ +\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ \noindent \textbf{Contact Info:} Contact Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, @@ -2453,7 +2535,7 @@ \section{Overview} \label{s:Backslash:intro} %------------------------------------------------------------------------------- \section{Licensing} \label{s:Backslash:licensing} %------------------------------------------------------------------------------- -\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ +\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ \noindent \textbf{Contact Info:} Contact Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, diff --git a/SPEX/Doc/SPEX_version.tex b/SPEX/Doc/SPEX_version.tex index f998a787..3acbff0d 100644 --- a/SPEX/Doc/SPEX_version.tex +++ b/SPEX/Doc/SPEX_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/SPEX -VERSION 3.0.0, Mar FIXME, 2023 +VERSION 3.1.0, Mar 22, 2024 diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index 4bbd83b6..a500a885 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -2,8 +2,8 @@ // SPEX/Include/SPEX.h: Include file for SPEX Library //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -27,7 +27,7 @@ //------------------------------------------------------------------------------ // Unless otherwise noted all functions are authored by: // -// Christopher Lourenco, Jinhao Chen, +// Christopher Lourenco, Jinhao Chen, // Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis // @@ -66,8 +66,8 @@ // // See license.txt for license info. // -// This software is copyright by Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. +// This software is copyright by Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // @@ -95,13 +95,40 @@ #include #include #include -#include -#include -#include -#include +// #include +// #include +// #include +// #include #include "SuiteSparse_config.h" -#include "amd.h" -#include "colamd.h" + +//------------------------------------------------------------------------------ +// SPEX Version +//------------------------------------------------------------------------------ + +// Current version of the code +#define SPEX_DATE "Mar 22, 2024" +#define SPEX_VERSION_STRING "3.1.0" +#define SPEX_VERSION_MAJOR 3 +#define SPEX_VERSION_MINOR 1 +#define SPEX_VERSION_SUB 0 + +#define SPEX_VERSION_NUMBER(major,minor,sub) \ + (((major)*1000ULL + (minor))*1000ULL + (sub)) +#define SPEX_VERSION \ + SPEX_VERSION_NUMBER (SPEX_VERSION_MAJOR, \ + SPEX_VERSION_MINOR, \ + SPEX_VERSION_SUB) + +#define SPEX__VERSION SUITESPARSE__VERCODE(3,1,0) +#if !defined (SUITESPARSE__VERSION) || \ + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "SPEX 3.1.0 requires SuiteSparse_config 7.7.0 or later" +#endif + +#if defined ( __cplusplus ) +extern "C" +{ +#endif //------------------------------------------------------------------------------ // Error codes @@ -128,23 +155,9 @@ typedef enum SPEX_info ; //------------------------------------------------------------------------------ -// SPEX Version +// SPEX Version, continued //------------------------------------------------------------------------------ -// Current version of the code -#define SPEX_DATE "Mar FIXME, 2023" -#define SPEX_VERSION_STRING "3.0.0" -#define SPEX_VERSION_MAJOR 3 -#define SPEX_VERSION_MINOR 0 -#define SPEX_VERSION_SUB 0 - -#define SPEX_VERSION_NUMBER(major,minor,sub) \ - (((major)*1000ULL + (minor))*1000ULL + (sub)) -#define SPEX_VERSION \ - SPEX_VERSION_NUMBER (SPEX_VERSION_MAJOR, \ - SPEX_VERSION_MINOR, \ - SPEX_VERSION_SUB) - SPEX_info SPEX_version ( int version [3], // SPEX major, minor, and sub version @@ -166,6 +179,42 @@ SPEX_info SPEX_version #error "MPFR v4.0.2 or later is required." #endif +//------------------------------------------------------------------------------ +// SPEX_TRY: try a SPEX method and check for errors +//------------------------------------------------------------------------------ + +// In a robust application, the return values from each call to SPEX should be +// checked, and corrective action should be taken if an error occurs. The +// SPEX_TRY macros assist in this effort. +// +// SPEX is written in C, and so it cannot rely on the try/catch mechanism of +// C++. To accomplish a similar goal, we provide our mechanism. The SPEX_TRY +// macro calls a single SPEX method and then takes corrected action based on a +// user-defined macro SPEX_CATCH. + +#define SPEX_TRY(method) \ +{ \ + SPEX_info info = (method) ; \ + if (info != SPEX_OK) \ + { \ + SPEX_CATCH (info) ; \ + } \ +} + +// A typical example user application might #define SPEX_CATCH as follows. +// Suppose the user function needs to free some workspace and return to the +// caller if an error occurs: + +/* + #define SPEX_CATCH(info) \ + { \ + SPEX_matrix_free (&A, NULL) ; \ + fprintf (stderr, "SPEX failed: info %d, line %d, file %s\n", \ + info, __LINE__, __FILE__) ; \ + return (info) ; \ + } \ +*/ + //------------------------------------------------------------------------------ // Pivot scheme codes //------------------------------------------------------------------------------ @@ -254,27 +303,11 @@ typedef SPEX_options_struct *SPEX_options ; SPEX_info SPEX_create_default_options (SPEX_options *option_handle) ; -// FIXME: trim the following for v3.0 //------------------------------------------------------------------------------ -// SPEX_vector: a compressed sparse vector data structure used to form the -// SPEX_DYNAMIC_CSC matrix. This will be used in SPEX v3.2 for SPEX_Update, -// when calling the functions to construct the vector to modify original matrix -// A, (either w for A'=A+sigma*w*w^T in rank-1 update/downdate or vk to be -// swapped with A->v[k] in the update for column replacement). This is not -// intended to be used for building any n-by-1 vector (e.g., the -// right-hand-side vector b in Ax=b), which should be considered as a n-by-1 -// SPEX_matrix. +// SPEX_vector //------------------------------------------------------------------------------ -// NOTE: the real value of the k-th nonzero entry in the list should be computed -// as x[k]*scale. While scale is a rational number, the real values for all -// entries are be ensured to be INTEGER. If the real value for any entry -// turns out to be non-integer, make sure to scale up all entries in the same -// matrix such that the real values of all entries become integer, then -// properly update the scale in the matrix (see the scale component in the -// SPEX_matrix structure). - // NOTE: The SPEX_vector object will be used in a near-future version of SPEX. // It appears here for future compatibility, but is currently unused. @@ -293,51 +326,6 @@ typedef struct // A SPEX_vector is a pointer to a SPEX_vector_struct typedef SPEX_vector_struct *SPEX_vector ; -// FIXME: make this 'if 0' for v3.0, or delete. -#if 1 - -//------------------------------------------------------------------------------ -// SPEX_vector_allocate: allocate a SPEX_vector with nzmax entries -//------------------------------------------------------------------------------ - -// *v_handle->x is allocated as a mpz_t vector with nzmax mpz_t entries -// initialized, and *v_handle->i is allocated with length of nzmax. - -SPEX_info SPEX_vector_allocate -( - SPEX_vector *v_handle, // vector to be allocated - const int64_t nzmax, // number of nnz entries in v - const SPEX_options option -) ; - -//------------------------------------------------------------------------------ -// SPEX_vector_realloc: reallocate SPEX_vector with new_size entries -//------------------------------------------------------------------------------ - -// Purpose: This function realloc a SPEX_vector to given new size. If -// new_size > (v->nzmax), it will reallocate v->i and v->x with new size, and -// initialize/allocate for all the new mpz entries. Otherwise, It will first -// free (v->nzmax) - new_size of mpz entries from v->x and then shrink the size -// of both v->i and v->x. - -SPEX_info SPEX_vector_realloc -( - SPEX_vector v, // the vector to be expanded - const int64_t new_size, // desired new size for v - const SPEX_options option -) ; - -//------------------------------------------------------------------------------ -// SPEX_vector_free: free the given SPEX_vector object and set *v = NULL -//------------------------------------------------------------------------------ - -SPEX_info SPEX_vector_free -( - SPEX_vector *v_handle, // vector to be deleted - const SPEX_options option -) ; - -#endif //------------------------------------------------------------------------------ // SPEX_matrix: a sparse CSC, sparse triplet, or dense matrix @@ -352,10 +340,6 @@ typedef enum SPEX_CSC = 0, // matrix is in compressed sparse column format SPEX_TRIPLET = 1, // matrix is in sparse triplet format SPEX_DENSE = 2, // matrix is in dense format (held by column) - SPEX_DYNAMIC_CSC = 3 // matrix is in dynamic CSC format with each - // column dynamically allocated as SPEX_vector - // This format will be used in in a future SPEX; - // it is not used in this version of SPEX. } SPEX_kind ; @@ -375,7 +359,6 @@ SPEX_type ; // This gives a total of 16 different matrix types: // (sparse CSC, triplet, dense) x (5 data types) = 15 formats, -// plus the sparse dynamic CSC format (only in MPZ). // Not all functions accept all 16 matrices types, however. @@ -400,34 +383,18 @@ SPEX_type ; // are all NULL. A->x.type is a pointer to an array of size m*n, stored // in column-oriented format. The value of A(i,j) is A->x.type [p] // with p = i + j*A->m. A->nz is ignored; nz is A->m * A->n. - -// FIXME: trim for v3.0: -// (3) SPEX_DYNAMIC_CSC: A sparse matrix in dynamic CSC (compressed sparse -// column) format with the number of nonzeros in each column changing -// independently and dynamically, which is only used in the update -// algorithms that will appear in SPEX v3.2 in the future. The matrix is -// held as an array of n SPEX_vectors, one per column. Each column is held -// as a SPEX_vector, containing mpz_t values and its own scale factor. For -// this kind, A->nzmax, A->nz, A->p, A->i, A->x and A->*_shallow are -// ignored and pointers p, i and x are remained as NULL pointers. To access -// entries in column j, A->v[j]->i[0 ... A->v[j]->nz-1] give the row -// indices of all nonzeros, and the mpz_t values of these entries appear in -// the same locations in A->v[j]->x. A->v[j]->nzmax is the max number of -// nonzeros allocated. - +// // The SPEX_matrix may contain 'shallow' components, A->p, A->i, A->j, and // A->x. For example, if A->p_shallow is true, then a non-NULL A->p is a // pointer to a read-only array, and the A->p array is not freed by // SPEX_matrix_free. If A->p is NULL (for a triplet or dense matrix), then -// A->p_shallow has no effect. A SPEX_matrix held in SPEX_DYNAMIC_CSC -// format never contains shallow components. +// A->p_shallow has no effect. typedef struct { - SPEX_kind kind ; // CSC, triplet, dense or SPEX_DYNAMIC_CSC + SPEX_kind kind ; // CSC, triplet, dense SPEX_type type ; // mpz, mpq, mpfr, int64, or fp64 (double) - // NOTE: entries of SPEX_DYNAMIC_CSC matrix must be - // mpz type. + int64_t m ; // number of rows int64_t n ; // number of columns @@ -439,13 +406,12 @@ typedef struct // should be computed as A(i,j)/scale. //-------------------------------------------------------------------------- - // these are used for CSC, triplet or dense matrix, but ignored for - // SPEX_DYNAMIC_CSC matrix + // these are used for CSC, triplet or dense matrix //-------------------------------------------------------------------------- int64_t nzmax ; // size of A->i, A->j, and A->x. int64_t nz ; // # nonzeros in a triplet matrix . - // Ignored for CSC, dense or SPEX_DYNAMIC_CSC matrices. + // Ignored for CSC, or dense. int64_t *p ; // if CSC: column pointers, an array size is n+1. // if triplet or dense: A->p is NULL. @@ -471,10 +437,7 @@ typedef struct // CSC, triplet and dense matrix, for a future version of SPEX. //-------------------------------------------------------------------------- - SPEX_vector *v; // If SPEX_DYNAMIC_CSC: array of size n, each entry of - // this array is a dynamic column vector. - // Neither A->v nor any vector A->v[j] are shallow. - // In this version of SPEX, v is always NULL, and + SPEX_vector *v; // In this version of SPEX, v is always NULL, and // should not be used. //-------------------------------------------------------------------------- @@ -491,25 +454,35 @@ typedef struct // A SPEX_matrix is a pointer to a SPEX_matrix_struct typedef SPEX_matrix_struct *SPEX_matrix ; +//------------------------------------------------------------------------------ +// SPEX_matrix macros +//------------------------------------------------------------------------------ + +// These macros simplify the access to entries in a SPEX_matrix. +// The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. + +// To access the kth entry in a SPEX_matrix using 1D linear addressing, +// in any matrix kind (CSC, triplet, or dense), in any type: +#define SPEX_1D(A,k,type) ((A)->x.type [k]) + +// To access the (i,j)th entry in a 2D dense SPEX_matrix, in any type: +#define SPEX_2D(A,i,j,type) SPEX_1D (A, (i)+(j)*((A)->m), type) + //------------------------------------------------------------------------------ // SPEX_matrix_allocate: allocate an m-by-n SPEX_matrix //------------------------------------------------------------------------------ -// Allocate an m-by-n SPEX_matrix, in either dynamic_CSC x mpz or one of -// 15 data structures: +// Allocate an m-by-n SPEX_matrix, in one of 15 data structures: // (sparse CSC, sparse triplet, or dense) x // (mpz, mpz, mfpr, int64, or double). -// If the matrix is not dynamic_CSC, then it may be created as 'shallow', in +// The matrix may be created as 'shallow', in // which case A->p, A->i, A->j, and A->x are all returned as NULL, and all // A->*_shallow flags are returned as true. The user can then set A->p, A->i, // A->j, and/or A->x accordingly, from their own arrays. For non-shallow // matrix, the components (p,i,j,x) are allocated according to the kind, type // and size (m, n, nzmax) of the matrix. -// If the matrix is dynamic_CSC, each column of the returned matrix will be -// allocated as SPEX_vector with zero available entry. Additional reallocation -// for each column will be needed. // if shallow is false: All components (p,i,j,x) are allocated and set to zero, // and then shallow flags are all false. @@ -576,12 +549,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code // SPEX_matrix_copy: make a copy of a SPEX_matrix, into another kind and type. -// FIXME: trim for v3.0: // SPEX supports 16 matrix formats: 15 of them are all combinations of -// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). The 16th format -// is dynamic CSC, which can only be mpz. This function can convert an input -// matrix A in any of these 16 formats, into an output matrix C in any of the -// 16 supported formats. +// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). SPEX_info SPEX_matrix_copy ( @@ -679,43 +648,18 @@ SPEX_info SPEX_symbolic_analysis_free //------------------------------------------------------------------------------ // The SPEX_factorization object holds an LU, Cholesky, or (in the future) QR -// numerical factorization, in either non-updatable (static) or updatable form. - -// FIXME: trim this discussion for v3.0: - -// All SPEX_update_* functions require and output updatable factorization with -// L (and U if exists) in SPEX_DYNAMIC_CSC MPZ form. All solvers (except -// SPEX_update_(t)solve) and functions that create factorization return -// non-updatable factorization with L (and U if exists) in SPEX_CSC MPZ form. -// -// Aside from that Qinv_perm will be generated for updatable LU factorization, -// the only difference between non-updatable and updatable factorizations is -// the way that L (and U if exists) is stored. User can get more details of the -// difference between updatable and non-updatable forms by referring to the -// comments for SPEX_factorization_convert in this file. +// numerical factorization, in either non-updatable (static) or updatable form +// (also future work). // // NOTE: // The components of the factorization structure are accessible to the user // application. However, they should only be modified by calling SPEX_* // methods. Changing them directly can lead to undefined behavior. -// To create this object, users can call SPEX_lu_factorize, -// SPEX_cholesky_factorize, or SPEX_QR_factorize. All these function will create a +// To create this object, users can call SPEX_lu_factorize, or +// SPEX_cholesky_factorize. All these function will create a // static factorization of corresponding kind. // -// To convert between updatable and non-updatable (static) factorization, user -// should call SPEX_factorization_convert, which performs in-place -// bi-directional conversion. In addition, all functions that require the -// updatable format check the input factorization and convert it automatically. -// If this happens, the output factorization becomes updatable. -// -// To update the factorization due to a simple change to original matrix A -// (e.g., single column replacement or rank-1 update/downdate), user can call -// the corresponding SPEX_update_lu_colrep or SPEX_update_cholesky_rank1. -// -// To check if the factorization is correct and/or print the factorization, call -// SPEX_factorization_check. -// // To free the factorization object, simply call SPEX_factorization_free. typedef struct @@ -747,8 +691,7 @@ typedef struct // These are currently used only for LU or Cholesky factorization. // One or more of these permutations could be NULL for some // SPEX_factorization_kind. Specifically, - // For kind == SPEX_LU_FACTORIZATION, Qinv_perm can be NULL, but it will - // be generated when the factorization is converted to the updatable form. + // For kind == SPEX_LU_FACTORIZATION, Qinv_perm can be NULL // For kind == SPEX_CHOLESKY_FACTORIZATION, both Q_perm and Qinv_perm are // NULL. //-------------------------------------------------------------------------- @@ -774,83 +717,6 @@ SPEX_info SPEX_factorization_free const SPEX_options option ) ; -//------------------------------------------------------------------------------ -// Function for checking the correctness of a factorization, and printing it -//------------------------------------------------------------------------------ - -// SPEX_factorization_check checks all the followings: -// 1. if the required components exist; -// 2. if sizes of different matrices match, i.e., L and U should be n*n, and -// rhos should be n*1; -// 3. if L (and U if exists) is correct (using SPEX_matrix_check); -// 4. if L, U, and rhos have same pivot values, and when F is updatable, if L -// (and U if exists) is of SPEX_DYNAMIC_CSC, and if the i-th pivot is the -// first entry in the nonzero list of i-th vector of L (and U if exists); -// 5. if each permutation is reasonable, i.e., no duplicate, and in range of -// [0,n), and if P_perm and Pinv_perm are mutually inverse vectors, -// same applied to (Q_perm, Qinv_perm) if exists. - -SPEX_info SPEX_factorization_check -( - SPEX_factorization F, // The factorization to check - const SPEX_options option -) ; - -// FIXME: delete for v3.0, put back in for v3.1 -#if 1 - -//------------------------------------------------------------------------------ -// Function for performing in-place conversion between updatable and -// non-updatable factorization. For now, it only works for LU or Cholesky -// factorization. -//------------------------------------------------------------------------------ -// For LU or Cholesky factorization, if user wishes to perform factorization -// update, then it must be in updatable format (i.e., F->updatable == true). -// This requires all the following conditions to be met. -// -// 1. Both L and U are stored as SPEX_DYNAMIC_CSC. Notably, U in the updatable -// factorization is actually the transpose of U (or equivalently, U is stored -// by row instead), since U will be updated one row at a time. -// 2. A = LD^(-1)U, which means L and U are properly permuted. (Recall that -// PAQ = LDU or PAP' = LDL' holds for static factorization). That is, for -// updatable factorization, the rows of L are in the same order as the rows -// of A, while the j-th column of L (F->L->v[j]) contains the j-th pivot, -// which would be F->L->v[j]->x[0], (i.e., F->L->v[j]->i[0] == -// F->P_perm[j]); the columns of U (or the rows of UT) are in the same order -// as the columns of A, while the j-th row of U (or the j-th column of UT) -// (F->U->v[j]) contains the j-th pivot, which would be F->U->v[j]->x[0], -// (i.e., F->U->v[j]->i[0] == F->Q_perm[j]). -// -// Due to these non-trivial conditions, users cannot simply perform -// SPEX_matrix_copy to obtain L and/or U in SPEX_DYNAMIC_CSC MPZ format and -// claim it is updatable, and vice versa. To correctly convert the -// factorization, user should call SPEX_factorization_convert to convert the -// given F to either updatable or non-updatable as specified by the boolean -// input argument 'updatable'. If F->updatable == updatable holds upon input, -// this function does nothing. Otherwise, it performs the corresponding -// in-place conversion. -// -// NOTE: -// Upon input, F->L (and F->U if exists) must be non-shallow CSC MPZ matrix for -// non-updatable (static) factorization (i.e., F->updatalbe == false), -// otherwise, SPEX_INCORRECT_INPUT will be returned. Likewise, F->L (and F->U -// if exists) must be dynamic_CSC MPZ matrix for updatable factorization. All -// SPEX functions output factorization in either of these two formats and -// non-shallow. Therefore, these input requirements can be met easily if users -// do not try to modify any individual component of F. -// -// In case of any error, the returned factorization should be considered as -// undefined. - -SPEX_info SPEX_factorization_convert -( - SPEX_factorization F, // The factorization to be converted - bool updatable, // if true: make F updatable - // if false: make non-updatable - const SPEX_options option // Command options -) ; -#endif - //------------------------------------------------------------------------------ // Memory management //------------------------------------------------------------------------------ @@ -989,8 +855,6 @@ SPEX_info SPEX_determine_symmetry const SPEX_options option // Command options ) ; -// ended HERE on Apr 10. - //------------------------------------------------------------------------------ //---------------------------SPEX GMP/MPFR Functions---------------------------- //------------------------------------------------------------------------------ @@ -1112,6 +976,8 @@ SPEX_info SPEX_mpq_equal (int *r, const mpq_t x, const mpq_t y) ; SPEX_info SPEX_mpfr_init2(mpfr_t x, const uint64_t size) ; +SPEX_info SPEX_mpfr_set_prec(mpfr_t x, const uint64_t size) ; + SPEX_info SPEX_mpfr_set (mpfr_t x, const mpfr_t y, const mpfr_rnd_t rnd) ; SPEX_info SPEX_mpfr_set_d (mpfr_t x, const double y, const mpfr_rnd_t rnd) ; @@ -1148,6 +1014,13 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; +SPEX_info SPEX_mpz_set_null (mpz_t x) ; +SPEX_info SPEX_mpq_set_null (mpq_t x) ; +SPEX_info SPEX_mpfr_set_null (mpfr_t x) ; +SPEX_info SPEX_mpz_clear (mpz_t x) ; +SPEX_info SPEX_mpq_clear (mpq_t x) ; +SPEX_info SPEX_mpfr_clear (mpfr_t x) ; + //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -1161,7 +1034,7 @@ SPEX_info SPEX_mpfr_free_str (char *str) ; // "Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via // a Sparse Left-looking Integer-preserving LU Factorization", -// C. Lourenco, J. Chen, E. Moreno-Centeno, T. Davis, +// C. Lourenco, J. Chen, E. Moreno-Centeno, T. Davis, // ACM Trans. Mathematical Software. pp 1-23, vol 48, no 2, 2022. // The theory associated with this software can be found in the paper @@ -1187,7 +1060,7 @@ SPEX_info SPEX_mpfr_free_str (char *str) ; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Christopher Lourenco, Jinhao Chen, Timothy A. Davis, and Erick Moreno-Centeno +// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis //------------------------------------------------------------------------------ @@ -1285,12 +1158,8 @@ SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b // Output SPEX_matrix *x_handle, // rational solution to the system // input/output: - SPEX_factorization F, // The non-updatable LU factorization. - // Mathematically, F is unchanged. However, if F - // is updatable on input, it is converted to - // non-updatable. If F is already non-updatable, - // it is not modified. - // FIXME: for v3.0, remove mention of updatable. + SPEX_factorization F, // The LU factorization. + // Mathematically, F is unchanged. // input: const SPEX_matrix b, // right hand side vector(s) const SPEX_options option // Command options @@ -1342,7 +1211,7 @@ SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b //------------------------------------------------------------------------------ // Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. //------------------------------------------------------------------------------ @@ -1452,170 +1321,13 @@ SPEX_info SPEX_cholesky_solve // On output: Rational solution (SPEX_MPQ) // to the system. // input/output: - SPEX_factorization F, // The non-updatable Cholesky factorization. - // Mathematically, F is unchanged. However, if - // F is updatable on input, it is converted to - // non-updatable. If F is already - // non-updatable, it is not modified. - // FIXME: for v3.0, remove mention of updatable. + SPEX_factorization F, // The Cholesky factorization. + // Mathematically, F is unchanged. // input: const SPEX_matrix b, // Right hand side vector const SPEX_options option // command options ) ; -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//------------------------------SPEX Update------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// FIXME: remove SPEX Update for v3.0, put back in for v3.1 -#if 1 - -// This portion of SPEX library update a exact Cholesky factorization PAQ = -// LDL^T exactly when A is changed as A' = A+sigma*w*w^T, or a exact LU -// factorization PAQ = LDU when A is changed with a single column. This code -// accompanies the following papers: - -// The theory associated with this software can be found in the paper -// "Sparse Exact Rank-1 Cholesky Update/Downdate", J. Chen, T. A. Davis, C. -// Lourenco, and E. Moreno-Centeno, ACM Transactions on Mathematical -// Software. To be submitted. - -// "Sparse Exact LU Rank-1 Modification", J. Chen, T. A. Davis, C. Lourenco, -// and E. Moreno-Centeno, ACM Transactions on Mathematical Software. -// To be submitted. - -// If you use this code, you must first download and install the GMP and -// MPFR libraries. GMP and MPFR can be found at: -// https://gmplib.org/ -// http://www.mpfr.org/ - -// If you use SPEX UPDATE for a publication, we request that you -// please cite the above two papers. - - - -//------------------------------------------------------------------------------ -// LU Update for column replacement -//------------------------------------------------------------------------------ - -// This function performs LU update for column replacement. The input -// factorization needs to be updatable with L and U being SPEX_DYNAMIC_CSC MPZ -// matrices. Otherwise (if F is non-updatable upon input), this function calls -// SPEX_factorization_convert to make F updatable, which requires that L and U -// in the factorization must be non-shallow SPEX_CSC MPZ matrices. The output -// factorization will always be updatable. Since the factorization is modified -// during the update process, the returned F should be considered as undefined -// if this function fails for any reason. -// -// The matrix vk is not modified during the update. If needed, user can call -// SPEX_update_matrix_colrep to obtain the updated matrix A *AFTER* calling this -// function. - -SPEX_info SPEX_update_lu_colrep -( - SPEX_factorization F, // The SPEX factorization of A, including L, U, - // rhos, P, Pinv, Q and Qinv. The factorization - // will be modified during the update process. - // Therefore, if this function fails for any - // reason, the returned F should be considered as - // undefined. - // todo: decide on utilities to help create this n-by-1 matrix: - SPEX_matrix vk, // Pointer to a n-by-1 dynamic_CSC matrix - // which contains the column to be inserted. - // vk->scale = A->scale and vk->v[0]->scale = 1. - // The rows of vk are in the same order as A. - int64_t k, // The column index that vk will be inserted, 0<=kscale = A->scale and vk->v[0]->scale = 1. - int64_t k, // The column index that vk will be inserted, 0<=kscale = w->scale - // and w->v[0]->scale = 1. In output, w is - // updated as the solution to L*D^(-1)*w_out = w - const int64_t sigma, // a nonzero scalar that determines whether - // this is an update (sigma > 0) or downdate - // (sigma < 0). - const SPEX_options option // Command options -) ; - -//------------------------------------------------------------------------------ -// Function for solving A*x = b with updatable LU or Cholesky factorization -// of matrix A -//------------------------------------------------------------------------------ - -SPEX_info SPEX_update_solve // solves Ax = b via LU or Cholesky factorization -( - // Output - SPEX_matrix *x_handle, // a m*n dense matrix contains the solution to - // the system. - // input: - SPEX_factorization F, // The SPEX LU or Cholesky factorization - const SPEX_matrix b, // a m*n dense matrix contains the right-hand-side - // vector - const SPEX_options option // Command options -) ; - -//------------------------------------------------------------------------------ -// Function for solving A^T*x = b with updatable LU or Cholesky factorization -// of matrix A -//------------------------------------------------------------------------------ - -SPEX_info SPEX_update_tsolve // solves A^T*x = b -( - // Output - SPEX_matrix *x_handle, // a m*n dense matrix contains the solution to - // the system. - // input: - SPEX_factorization F, // The SPEX LU or Cholesky factorization of A - const SPEX_matrix b, // a m*n dense matrix contains the right-hand-side - // vector - const SPEX_options option // Command options -) ; - -#endif //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -1657,5 +1369,9 @@ SPEX_info SPEX_backslash SPEX_options option // Command options (NULL: means use defaults) ) ; +#if defined ( __cplusplus ) +} +#endif + #endif diff --git a/SPEX/LICENSE.txt b/SPEX/LICENSE.txt index 0020fe09..2516bc71 100644 --- a/SPEX/LICENSE.txt +++ b/SPEX/LICENSE.txt @@ -6,8 +6,8 @@ found in the lists below. SPEX: a SParse EXact Factorization Framework for solving SLEs - Copyright (c) 2019-2023, Christopher Lourenco, Jinhao Chen, - Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. + Copyright (c) 2019-2024, Christopher Lourenco, Jinhao Chen, + Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. Available at: https://github.com/clouren/SPEX diff --git a/SPEX/MATLAB/Source/SPEX_mex.h b/SPEX/MATLAB/Source/SPEX_mex.h index a951aefd..07f418cc 100644 --- a/SPEX/MATLAB/Source/SPEX_mex.h +++ b/SPEX/MATLAB/Source/SPEX_mex.h @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex.h: include file for MATLAB functions //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/Source/spex_mex_check_for_inf.c b/SPEX/MATLAB/Source/spex_mex_check_for_inf.c index 6242b4f3..bfadbfbf 100644 --- a/SPEX/MATLAB/Source/spex_mex_check_for_inf.c +++ b/SPEX/MATLAB/Source/spex_mex_check_for_inf.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex_check_for_inf.c: Check A&B for inf/NAN //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/Source/spex_mex_error.c b/SPEX/MATLAB/Source/spex_mex_error.c index 3d978a1a..f28cbd66 100644 --- a/SPEX/MATLAB/Source/spex_mex_error.c +++ b/SPEX/MATLAB/Source/spex_mex_error.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex_error.c: Check error codes for MATLAB //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c b/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c index f9c32d3d..10713b01 100644 --- a/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c +++ b/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex_get_A_and_b.c: convert A&b to SPEX matrices //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c b/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c index 624b1f87..b2ee0980 100644 --- a/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c +++ b/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex_get_matlab_optons.c: Get command options from user //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_backslash.m b/SPEX/MATLAB/spex_backslash.m index 73b30bda..b783ab29 100644 --- a/SPEX/MATLAB/spex_backslash.m +++ b/SPEX/MATLAB/spex_backslash.m @@ -88,8 +88,8 @@ % interfaces of all SPEX packages. Typing spex_mex_install in this directory % should do this correctly. -% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Timothy A. Davis and Erick Moreno-Centeno. +% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_backslash_mex_soln.c b/SPEX/MATLAB/spex_backslash_mex_soln.c index a6b84e3a..664b5a3f 100644 --- a/SPEX/MATLAB/spex_backslash_mex_soln.c +++ b/SPEX/MATLAB/spex_backslash_mex_soln.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/spex_backslash_mex_soln: Use SPEX Backslash within MATLAB //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_cholesky_backslash.m b/SPEX/MATLAB/spex_cholesky_backslash.m index 791af8ae..1f2c67fd 100644 --- a/SPEX/MATLAB/spex_cholesky_backslash.m +++ b/SPEX/MATLAB/spex_cholesky_backslash.m @@ -91,8 +91,8 @@ % interfaces of all SPEX packages. Typing spex_mex_install in this directory % should do this correctly. -% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Timothy A. Davis and Erick Moreno-Centeno. +% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_cholesky_mex_soln.c b/SPEX/MATLAB/spex_cholesky_mex_soln.c index 7684c0e2..7c9b7389 100644 --- a/SPEX/MATLAB/spex_cholesky_mex_soln.c +++ b/SPEX/MATLAB/spex_cholesky_mex_soln.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/spex_cholesky_mex_soln: Use SPEX Chol within MATLAB //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_lu_backslash.m b/SPEX/MATLAB/spex_lu_backslash.m index 15f45be0..1afe3942 100644 --- a/SPEX/MATLAB/spex_lu_backslash.m +++ b/SPEX/MATLAB/spex_lu_backslash.m @@ -94,8 +94,8 @@ % % See also vpa, SPEX_install, SPEX_test, SPEX_demo. -% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_lu_mex_soln.c b/SPEX/MATLAB/spex_lu_mex_soln.c index 151d55f8..8530b170 100644 --- a/SPEX/MATLAB/spex_lu_mex_soln.c +++ b/SPEX/MATLAB/spex_lu_mex_soln.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/spex_lu_mex_soln: Use SPEX Left LU within MATLAB //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_mex_demo.m b/SPEX/MATLAB/spex_mex_demo.m index bb393a5c..e20780f0 100644 --- a/SPEX/MATLAB/spex_mex_demo.m +++ b/SPEX/MATLAB/spex_mex_demo.m @@ -5,8 +5,8 @@ % % See also vpa, spex_mex_install, spex_mex_test. -% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_mex_install.m b/SPEX/MATLAB/spex_mex_install.m index 267e65cb..91570067 100644 --- a/SPEX/MATLAB/spex_mex_install.m +++ b/SPEX/MATLAB/spex_mex_install.m @@ -1,27 +1,26 @@ function spex_mex_install(run_demo) -% spex_mex_INSTALL: install and test the MATLAB interface to SPEX MATLAB functions. +% spex_mex_install: install and test the MATLAB interface to SPEX MATLAB functions. % % Usage: spex_mex_install % -% Required Libraries: GMP, MPFR, AMD, COLAMD, SPEX. If -lamd and -lcolamd are -% not available, install them with 'make install' first, in the top-level -% SuiteSparse folder. +% Required Libraries: GMP, MPFR, AMD, COLAMD, SuiteSparse_config, SPEX. If +% -lamd, -lcolamd, and -lsuitesparseconfig are not available, install them with +% 'make install' first, in the top-level SuiteSparse folder. % % You may need to add the top-level lib folder (SPEX/lib, or SuiteSparse/lib % if SPEX is inside SuiteSparse) to your LD_LIBRARY_PATH (DYLD_LIBRARY_PATH % on the Mac). See instructions in the spex_deps.m file. -% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - if (nargin < 1) run_demo = true ; end -fprintf ('Compiling the SPEX mexFunctions for use:\n') ; +fprintf ('Compiling the SPEX for use in MATLAB:\n') ; % Find all source files and add them to the src string src = ''; @@ -63,12 +62,17 @@ function spex_mex_install(run_demo) src = [src, tmp]; end -% Compiler flags -flags = 'CFLAGS=''-std=c99 -fPIC'' LDFLAGS=''-Wl,-rpath=''../../lib'''''; - % External libraries: GMP, MPRF, AMD, and COLAMD [suitesparse_libdir, suitesparse_incdir, gmp_lib, gmp_include, mpfr_lib, mpfr_include] = spex_deps ; +% Compiler flags +openmp = '' ; +if (~ismac && isunix) + openmp = ' -fopenmp' ; +end +flags = sprintf ('CFLAGS=''-std=c11 -fPIC %s'' LDFLAGS=''-Wl,-rpath=''%s''''', ... + openmp, suitesparse_libdir) ; + % libraries: if (isempty (suitesparse_libdir)) suitesparse_libdir = ' ' ; @@ -105,13 +109,21 @@ function spex_mex_install(run_demo) m2 = ['mex ', verbose, ' -R2018a ', includes, ' spex_cholesky_mex_soln.c ' , src, ' ', flags, ' ', libs]; m3 = ['mex ', verbose, ' -R2018a ', includes, ' spex_backslash_mex_soln.c ' , src, ' ', flags, ' ', libs]; +% Now, we evaluate each one if (~isempty (verbose)) fprintf ('%s\n', m1) ; end - -% Now, we evaluate each one +fprintf ('Compiling MATLAB interface to SPEX LU:\n') ; eval (m1) ; +if (~isempty (verbose)) + fprintf ('%s\n', m2) ; +end +fprintf ('Compiling MATLAB interface to SPEX Cholesky:\n') ; eval (m2) ; +if (~isempty (verbose)) + fprintf ('%s\n', m3) ; +end +fprintf ('Compiling MATLAB interface to SPEX Backslash:\n') ; eval (m3) ; if (run_demo) diff --git a/SPEX/MATLAB/spex_mex_test.m b/SPEX/MATLAB/spex_mex_test.m index b10f041b..797092a1 100644 --- a/SPEX/MATLAB/spex_mex_test.m +++ b/SPEX/MATLAB/spex_mex_test.m @@ -5,8 +5,8 @@ % % See also spex_mex_install, spex_mex_demo. -% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -83,7 +83,7 @@ fprintf ('\nmaxerr: %g\n', maxerr) ; if (maxerr < 1e-6) - fprintf('\nLeft LU installation successful\n') + fprintf('\nSPEX LU installation successful\n') else error ('\nTesting failure! error too high please reinstall\n') end diff --git a/SPEX/Makefile b/SPEX/Makefile index d4ae1a0e..4ededd71 100644 --- a/SPEX/Makefile +++ b/SPEX/Makefile @@ -2,8 +2,8 @@ # SuiteSparse/SPEX/Makefile: Makefile for SPEX #------------------------------------------------------------------------------- -# SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -37,33 +37,32 @@ default: library # default is to install only in /usr/local library: - ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . --config Release -j${JOBS} ) # install only in SuiteSparse/lib and SuiteSparse/include local: - ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=1 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=1 .. && cmake --build . --config Release -j${JOBS} ) # install only in /usr/local (default) global: - ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=0 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=0 .. && cmake --build . --config Release -j${JOBS} ) debug: - ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . --config Debug -j${JOBS} ) all: library demos: - ( cd build && cmake $(CMAKE_OPTIONS) -DDEMO=1 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j${JOBS} ) ./build/spex_demo_lu_simple1 ./build/spex_demo_lu_simple2 ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt ./build/spex_demo_lu_extended f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt ./build/spex_demo_lu_doub f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt ./build/spex_demo_backslash f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt - ./build/spex_demo_backslash f ExampleMats/Trefethen_500.mat.txt ExampleMats/Trefethen_500.rhs.txt - ./build/spex_demo_cholesky_simple f ExampleMats/494_bus.mat.txt ExampleMats/494_bus.rhs.txt - ./build/spex_demo_cholesky_extended f ExampleMats/494_bus.mat.txt ExampleMats/494_bus.rhs.txt + ./build/spex_demo_cholesky_simple f ExampleMats/494_bus.mat.txt ExampleMats/494_bus.rhs.txt + ./build/spex_demo_cholesky_extended f ExampleMats/494_bus.mat.txt ExampleMats/494_bus.rhs.txt ./build/spex_demo_threaded f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt - + ./build/spex_demo_backslash f ExampleMats/Trefethen_500.mat.txt ExampleMats/Trefethen_500.rhs.txt cov: ( cd Tcov && $(MAKE) ) diff --git a/SPEX/Python/SPEXpy/Options.py b/SPEX/Python/SPEXpy/Options.py index 85a28f75..54e07b01 100644 --- a/SPEX/Python/SPEXpy/Options.py +++ b/SPEX/Python/SPEXpy/Options.py @@ -2,8 +2,8 @@ # SPEX/Python/utilities/Options.py: class Options #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/SPEX_error.py b/SPEX/Python/SPEXpy/SPEX_error.py index 5680bb2a..d15ae43d 100644 --- a/SPEX/Python/SPEXpy/SPEX_error.py +++ b/SPEX/Python/SPEXpy/SPEX_error.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/SPEX_error.py: class SPEX_error #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/Source/spex_python_connect.c b/SPEX/Python/SPEXpy/Source/spex_python_connect.c index 728505f8..d3fe5e10 100644 --- a/SPEX/Python/SPEXpy/Source/spex_python_connect.c +++ b/SPEX/Python/SPEXpy/Source/spex_python_connect.c @@ -2,8 +2,8 @@ // SPEX/Python/spex_connect.c: use SPEX in Python //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/Source/spex_python_connect.h b/SPEX/Python/SPEXpy/Source/spex_python_connect.h index eb227efd..06d0e6d8 100644 --- a/SPEX/Python/SPEXpy/Source/spex_python_connect.h +++ b/SPEX/Python/SPEXpy/Source/spex_python_connect.h @@ -2,8 +2,8 @@ // SPEX/Python/spex_connect.h: use SPEX in Python //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/__init__.py b/SPEX/Python/SPEXpy/__init__.py index 0d348eab..ab83e6df 100644 --- a/SPEX/Python/SPEXpy/__init__.py +++ b/SPEX/Python/SPEXpy/__init__.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/__init__.py #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/backslash.py b/SPEX/Python/SPEXpy/backslash.py index b057b94f..66ea49dc 100644 --- a/SPEX/Python/SPEXpy/backslash.py +++ b/SPEX/Python/SPEXpy/backslash.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/backslash.py: solve Ax=b #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/cholesky_backslash.py b/SPEX/Python/SPEXpy/cholesky_backslash.py index bde5ff4c..61b56bcc 100644 --- a/SPEX/Python/SPEXpy/cholesky_backslash.py +++ b/SPEX/Python/SPEXpy/cholesky_backslash.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/cholesky_backslash.py: solve Ax=b using Cholesky factorization #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/lu_backslash.py b/SPEX/Python/SPEXpy/lu_backslash.py index 3810af88..4db6b36c 100644 --- a/SPEX/Python/SPEXpy/lu_backslash.py +++ b/SPEX/Python/SPEXpy/lu_backslash.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/lu_backslash.py: solve Ax=b using LU factorization #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/spex_connect.py b/SPEX/Python/SPEXpy/spex_connect.py index b8c4a1a2..2a1c98f0 100644 --- a/SPEX/Python/SPEXpy/spex_connect.py +++ b/SPEX/Python/SPEXpy/spex_connect.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEX/spex_connect.py: link SPEX to use in Python #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/spex_matrix_from_file.py b/SPEX/Python/SPEXpy/spex_matrix_from_file.py index 37e15135..f70668b9 100644 --- a/SPEX/Python/SPEXpy/spex_matrix_from_file.py +++ b/SPEX/Python/SPEXpy/spex_matrix_from_file.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/spex_from_matrix_file.py: read matrix from file #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/spex_python_demo.py b/SPEX/Python/spex_python_demo.py index f1e7e016..71c3a2a9 100644 --- a/SPEX/Python/spex_python_demo.py +++ b/SPEX/Python/spex_python_demo.py @@ -3,8 +3,8 @@ # matrices #------------------------------------------------------------------------------- -# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Backslash/License/license.txt b/SPEX/SPEX_Backslash/License/license.txt index f81e2816..d289a39f 100644 --- a/SPEX/SPEX_Backslash/License/license.txt +++ b/SPEX/SPEX_Backslash/License/license.txt @@ -1,7 +1,7 @@ SPEX Backslash: -Copyright (c) 2021-2023, Christopher Lourenco, Jinhao Chen, -Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +Copyright (c) 2021-2024, Christopher Lourenco, Jinhao Chen, +Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. Available at: https://github.com/clouren/SPEX diff --git a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c index 76433e50..623a767e 100644 --- a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c +++ b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c @@ -2,8 +2,8 @@ // SPEX_Backslash/SPEX_backslash.c: Solve a system Ax=b //------------------------------------------------------------------------------ -// SPEX_Backslash: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Backslash: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/License/license.txt b/SPEX/SPEX_Cholesky/License/license.txt index ac5cd4a9..b29eb690 100644 --- a/SPEX/SPEX_Cholesky/License/license.txt +++ b/SPEX/SPEX_Cholesky/License/license.txt @@ -1,7 +1,7 @@ SPEX_Chol: Integer-Preserving Cholesky Factorization -Copyright (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +Copyright (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. Available at: diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c index 05e16904..26173b29 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/SPEX_cholesky_analyze: Perform the symbolic analysis of A //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c index 575812b0..88c9a106 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/SPEX_cholesky_backslash: solve Ax=b //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c index c662cb9a..387f75cf 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/SPEX_cholesky_factorize: Perform SPEX Chol factorization of A //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c index f42f15a7..5fa2a7d0 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c @@ -3,8 +3,8 @@ // factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c index 6e70d9f2..0f6d0fba 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_backward_sub: Solve L' x = b for Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c index 1802865a..91009aae 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_counts: Column counts for Cholesky factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c index a7559a0b..80e917d3 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_ereach: Compute reach of an elimination tree //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c index 8c2d8f2f..dd352128 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_etree: Compute the elimination tree of a matrix A //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c index e899145e..a8dab71d 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -2,14 +2,14 @@ // SPEX_Cholesky/spex_cholesky_factor: Integer preserving Cholesky factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -# define SPEX_FREE_ALL \ +#define SPEX_FREE_ALL \ { \ SPEX_factorization_free(&F, option); \ } diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c index d4880ffe..38515168 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_forward_sub: Solve the system LDx = b //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h b/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h index 67013e62..73a62061 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_internal.h: include file for internal use in SPEX_Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c index 1ac88142..cbbd375a 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_leaf: Subroutine for column counts of Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c index d9c03227..3611b416 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_left_factor: Left-looking REF Chol. factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c index 1caa721e..e3d7392c 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c @@ -3,8 +3,8 @@ // left-looking triangular solve //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -55,9 +55,11 @@ // Each iteration of the triangular solve requires that the nonzero pattern // is sorted prior to numeric operations. This is the helper function for // c's default qsort -static inline int compare (const void * a, const void * b) +static inline int compar (const void * a, const void * b) { - return ( *(int64_t*)a - *(int64_t*)b ); + int64_t x = (* ((int64_t *) a)) ; + int64_t y = (* ((int64_t *) b)) ; + return (x < y ? -1 : ((x == y) ? 0 : 1)) ; } SPEX_info spex_cholesky_left_triangular_solve @@ -218,7 +220,7 @@ SPEX_info spex_cholesky_left_triangular_solve } } // Sort the nonzero pattern xi using quicksort - qsort(&xi[top], n-top, sizeof(int64_t), compare); + qsort (&xi[top], n-top, sizeof (int64_t), compar) ; // Reset the history vector h for (i = top; i < n; i++) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c index bcc3a5d7..1280d974 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_permute_A: Symmetric permutation of matrix A //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c index 6142df53..6ff7d721 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_post: Postorder a forest //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c index 5b42a4e3..75871a45 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_pre_left_factor: Symbolic left-looking Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c index 4c953fdf..dd3560d3 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_preorder: symbolic ordering/analysis for Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c index 52836c3f..aac78c10 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_symbolic_analysis: Symbolic analysis for Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -78,7 +78,7 @@ SPEX_info spex_cholesky_symbolic_analysis SPEX_CHECK( spex_cholesky_counts(&c, A, S->parent, post) ); // Set the column pointers of L - S->cp = (int64_t*) SPEX_malloc( (n+1)*sizeof(int64_t*)); + S->cp = (int64_t*) SPEX_malloc( (n+1)*sizeof(int64_t)); if (S->cp == NULL) { SPEX_FREE_ALL; diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c index a1456cfc..9f7bf67d 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_tdfs: DFS of a tree rooted at a node //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c index a223426c..06ef00a7 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_up_factor: Up-looking REF Cholesky factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -92,7 +92,8 @@ SPEX_info spex_cholesky_up_factor int64_t *c = NULL; // Declare variables - int64_t n = A->n, top, i, j, jnew, k; + int64_t n = A->n, i, j, jnew, k; + int64_t top = n ; int sgn, prev_sgn; size_t size; @@ -182,7 +183,6 @@ SPEX_info spex_cholesky_up_factor L->p[k] = c[k] = S->cp[k]; } - //-------------------------------------------------------------------------- // Perform the up-looking factorization //-------------------------------------------------------------------------- diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c index 79c5e0bf..e6c8a4d1 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_up_triangular_solve: Sparse sym REF tri. solve //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -53,9 +53,11 @@ // Each iteration of the triangular solve requires that the nonzero pattern // is sorted prior to numeric operations. This is the helper function for // c's default qsort -static inline int compare (const void * a, const void * b) +static inline int compar (const void * a, const void * b) { - return ( *(int64_t*)a - *(int64_t*)b ); + int64_t x = (* ((int64_t *) a)) ; + int64_t y = (* ((int64_t *) b)) ; + return (x < y ? -1 : ((x == y) ? 0 : 1)) ; } SPEX_info spex_cholesky_up_triangular_solve @@ -91,10 +93,17 @@ SPEX_info spex_cholesky_up_triangular_solve ASSERT(rhos->type == SPEX_MPZ); ASSERT(rhos->kind == SPEX_DENSE); - int64_t j, i, p, m, top, n = A->n; + int64_t j, i, p, m, n = A->n; int sgn; + (*top_output) = n ; + int64_t top = n ; - ASSERT(n >= 0); + ASSERT (n >= 0) ; + ASSERT (k >= 0 && k < n) ; + ASSERT (parent != NULL) ; + ASSERT (c != NULL) ; + ASSERT (h != NULL) ; + ASSERT (xi != NULL) ; //-------------------------------------------------------------------------- // Initialize REF Triangular Solve by getting the nonzero patern of x && @@ -105,13 +114,17 @@ SPEX_info spex_cholesky_up_triangular_solve // xi[top..n-1] SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, parent, c)); + ASSERT (top >= 0 && top <= n) ; + // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) - qsort(&xi[top], n-top, sizeof(int64_t*), compare); + qsort (&xi[top], n-top, sizeof (int64_t), compar) ; // Reset x[i] = 0 for all i in nonzero pattern xi [top..n-1] for (i = top; i < n; i++) { - SPEX_MPZ_SET_UI(x->x.mpz[xi[i]],0); + j = xi [i] ; + ASSERT (j >= 0 && j <= k) ; + SPEX_MPZ_SET_UI(x->x.mpz[j],0); } // Reset value of x[k]. If the matrix is nonsingular, x[k] will @@ -147,6 +160,9 @@ SPEX_info spex_cholesky_up_triangular_solve { // Obtain the index of the current nonzero j = xi[p]; + + ASSERT (j >= 0 && j <= k) ; + SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); if (sgn == 0) continue; // If x[j] == 0 no work must be done @@ -200,7 +216,6 @@ SPEX_info spex_cholesky_up_triangular_solve h[i] = j; } - //---------------------------------------------------------- /************ Both lij and x[i] are nonzero****************/ // x[i] != 0 --> History & IPGE update on x[i] @@ -255,6 +270,7 @@ SPEX_info spex_cholesky_up_triangular_solve } } } + // ------ History Update x[k] if necessary ----- if (h[k] < j - 1) { @@ -270,6 +286,7 @@ SPEX_info spex_cholesky_up_triangular_solve rhos->x.mpz[h[k]]); } } + // ---- IPGE Update x[k] = (x[k]*rhos[j] - xj*xj) / rho[j-1] ------ // x[k] = x[k] * rho[j] SPEX_MPZ_MUL(x->x.mpz[k],x->x.mpz[k],rhos->x.mpz[j]); @@ -278,12 +295,15 @@ SPEX_info spex_cholesky_up_triangular_solve // Only divide by previous pivot if the previous pivot is not 1 (which // is always the case in the first IPGE iteration) if (j > 0) + { // x[k] = x[k] / rho[j-1] SPEX_MPZ_DIVEXACT(x->x.mpz[k],x->x.mpz[k], rhos->x.mpz[j-1]); + } // Entry is up to date; h[k] = j; } + //---------------------------------------------------------- // At this point, x[k] has been updated throughout the // triangular solve. The last step is to make sure x[k] diff --git a/SPEX/SPEX_LU/License/license.txt b/SPEX/SPEX_LU/License/license.txt index 5174d2bd..a4615bf8 100644 --- a/SPEX/SPEX_LU/License/license.txt +++ b/SPEX/SPEX_LU/License/license.txt @@ -1,7 +1,7 @@ SPEX_LU: a Sparse Left-looking Integer-Preserving LU Factorization -Copyright (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +Copyright (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. Available at: https://github.com/clouren/SPEX diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c b/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c index 970a4347..63ed8f92 100644 --- a/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_lu_analyze: symbolic ordering and analysis for sparse LU //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c b/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c index 8739db22..db16f1ce 100644 --- a/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c @@ -2,8 +2,8 @@ // SPEX_LU/SPEX_lu_backslash: solve Ax=b, return solution as desired data type //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c b/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c index eac75058..0e79ac62 100644 --- a/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c @@ -2,8 +2,8 @@ // SPEX_LU/SPEX_lu_factorize: exact sparse LU factorization //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_solve.c b/SPEX/SPEX_LU/Source/SPEX_lu_solve.c index 4dca51d7..09ace23d 100644 --- a/SPEX/SPEX_LU/Source/SPEX_lu_solve.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_solve.c @@ -2,8 +2,8 @@ // SPEX_LU/SPEX_lu_solve: exact solution of Ax=b //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c b/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c index 6cc147e7..a0ff47f8 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_back_sub: sparse REF backward substitution (x = U\x) //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c b/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c index 2f0b8cbe..1cb5f119 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_dfs: depth-first search //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c b/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c index 1e136690..4177697c 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_forward_sub: sparse forward substitution (x = (LD)\x) //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c index cd96bb01..a09a28dd 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_get_largest_pivot: find a pivot entry in a column //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ @@ -18,7 +18,7 @@ */ #define SPEX_FREE_ALL \ - SPEX_MPZ_CLEAR(big); + SPEX_mpz_clear (big); #include "spex_lu_internal.h" @@ -51,7 +51,7 @@ SPEX_info spex_left_lu_get_largest_pivot int r ; (*pivot) = -1 ; mpz_t big ; - SPEX_MPZ_SET_NULL (big); + SPEX_mpz_set_null (big); SPEX_MPZ_INIT (big); //-------------------------------------------------------------------------- diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c index 3dc8e88b..0366c092 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_get_nonzero_pivot: find a nonzero pivot in a column //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c index 3e8753b1..21ae715d 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_get_pivot: find a pivot entry in a column //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ @@ -25,8 +25,8 @@ */ #define SPEX_FREE_ALL \ - SPEX_MPQ_CLEAR (tol); \ - SPEX_MPQ_CLEAR (ratio); + SPEX_mpq_clear (tol); \ + SPEX_mpq_clear (ratio); #include "spex_lu_internal.h" @@ -67,8 +67,8 @@ SPEX_info spex_left_lu_get_pivot int sgn, r; mpq_t tol, ratio; - SPEX_MPQ_SET_NULL(tol); - SPEX_MPQ_SET_NULL(ratio); + SPEX_mpq_set_null (tol); + SPEX_mpq_set_null (ratio); if (order == SPEX_SMALLEST) { diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c index 27694711..e50cfb85 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_get_smallest_pivot: find the smallest entry in a column //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ @@ -16,7 +16,7 @@ */ #define SPEX_FREE_ALL \ - SPEX_MPZ_CLEAR(small); + SPEX_mpz_clear (small); #include "spex_lu_internal.h" @@ -49,7 +49,7 @@ SPEX_info spex_left_lu_get_smallest_pivot (*pivot) = -1; j = n; flag = top; - mpz_t small; SPEX_MPZ_SET_NULL(small); + mpz_t small; SPEX_mpz_set_null (small); SPEX_MPZ_INIT(small); //-------------------------------------------------------------------------- diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_reach.c b/SPEX/SPEX_LU/Source/spex_left_lu_reach.c index e73d84f4..03cb5e6a 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_reach.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_reach.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_reach: compute set of nodes reachable from an input set //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c b/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c index f2816102..d5a7b89c 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_ref_triangular_solve: sparse REF triangular solve //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ @@ -74,6 +74,10 @@ static inline int compare (const void * a, const void * b) { return ( *(int64_t*)a - *(int64_t*)b ); + + int64_t x = (* ((int64_t *) a)) ; + int64_t y = (* ((int64_t *) b)) ; + return (x < y ? -1 : ((x == y) ? 0 : 1)) ; } SPEX_info spex_left_lu_ref_triangular_solve // sparse REF triangular solve @@ -132,7 +136,7 @@ SPEX_info spex_left_lu_ref_triangular_solve // sparse REF triangular solve } // Sort xi[top..n-1] - qsort(&xi[top], n-top, sizeof(int64_t), compare); + qsort (&xi[top], n-top, sizeof (int64_t), compare) ; // Place xi back in original value for (j = top; j < n; j++) diff --git a/SPEX/SPEX_LU/Source/spex_lu_internal.h b/SPEX/SPEX_LU/Source/spex_lu_internal.h index 577e4bf4..73ba8990 100644 --- a/SPEX/SPEX_LU/Source/spex_lu_internal.h +++ b/SPEX/SPEX_LU/Source/spex_lu_internal.h @@ -3,8 +3,8 @@ // SPEX_LU //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. +// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, +// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_Utilities/License/license.txt b/SPEX/SPEX_Utilities/License/license.txt index 44cb8856..dc366870 100644 --- a/SPEX/SPEX_Utilities/License/license.txt +++ b/SPEX/SPEX_Utilities/License/license.txt @@ -1,7 +1,7 @@ SPEX_Utilities: Utility functions for SParse EXact package -Copyright (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +Copyright (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. Available at: diff --git a/SPEX/SPEX_Utilities/Source/SPEX_calloc.c b/SPEX/SPEX_Utilities/Source/SPEX_calloc.c index 49bdc9d4..fa982af8 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_calloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_calloc.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_calloc: wrapper for calloc //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c b/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c index e521a3e8..16366824 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_create_default_options: set defaults //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c b/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c index a6f14b86..f85cc5f9 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c @@ -3,8 +3,8 @@ // *numerically* (thus pattern-wise) symmetric //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c b/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c index c9ae0116..bce7d24f 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c @@ -3,8 +3,8 @@ // SPEX_factorization data type. //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -29,7 +29,7 @@ SPEX_info SPEX_factorization_free if ((F_handle != NULL) && (*F_handle != NULL)) { - SPEX_MPQ_CLEAR((*F_handle)->scale_for_A); + SPEX_mpq_clear ((*F_handle)->scale_for_A); SPEX_matrix_free(&((*F_handle)->L), option); SPEX_matrix_free(&((*F_handle)->U), option); diff --git a/SPEX/SPEX_Utilities/Source/SPEX_finalize.c b/SPEX/SPEX_Utilities/Source/SPEX_finalize.c index 9276f9fc..5bfeed35 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_finalize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_finalize.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_finalize: finalize SPEX //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_free.c b/SPEX/SPEX_Utilities/Source/SPEX_free.c index 28db44e2..c746a62e 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_free.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_free: wrapper for free //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 56ed2b1f..217a9110 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_gmp.c: interface to the gmp library //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -66,7 +66,9 @@ #include "spex_util_internal.h" // ignore warnings about unused parameters in this file +#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-parameter" +#endif //------------------------------------------------------------------------------ // thread-local-storage @@ -118,6 +120,7 @@ // SPEX will not be thread-safe. spex_gmp_t *spex_gmp = NULL ; + #warning "SPEX not compiled with OpenMP or thread keyword; SPEX will not be thread-safe!" #endif @@ -128,10 +131,10 @@ #define SPEX_GMP_WRAPPER_START_HELPER(z1,z2,q,fr) \ /* spex_gmp_t *spex_gmp = spex_gmp_get ( ) ; */ \ if (spex_gmp == NULL) return (SPEX_OUT_OF_MEMORY); \ - spex_gmp->mpz_archive = (mpz_t *) z1 ; \ - spex_gmp->mpz_archive2 = (mpz_t *) z2 ; \ - spex_gmp->mpq_archive = (mpq_t *) q ; \ - spex_gmp->mpfr_archive = (mpfr_t *) fr ; \ + spex_gmp->mpz_archive = z1 ; \ + spex_gmp->mpz_archive2 = z2 ; \ + spex_gmp->mpq_archive = q ; \ + spex_gmp->mpfr_archive = fr ; \ /* setjmp returns 0 if called from here, or > 0 if from longjmp */ \ int status = setjmp (spex_gmp->environment) ; \ if (status != 0) \ @@ -368,38 +371,44 @@ void *spex_gmp_allocate // spex_gmp_safe_free: free a block of memory and remove it from the archive //------------------------------------------------------------------------------ +// see mpfr-4.2.1/src/mpfr-impl.h, for MPFR_GET_REAL_PTR +#define SPEX_MPFR_GET_REAL_PTR(x) ((x)->_mpfr_d - 1) + static inline void spex_gmp_safe_free (void *p) { if (spex_gmp != NULL) { if (spex_gmp->mpz_archive != NULL) { - if (p == SPEX_MPZ_PTR(*(spex_gmp->mpz_archive))) + if (p == SPEX_MPZ_PTR((spex_gmp->mpz_archive))) { - SPEX_MPZ_PTR(*(spex_gmp->mpz_archive)) = NULL ; + SPEX_MPZ_PTR((spex_gmp->mpz_archive)) = NULL ; } } if (spex_gmp->mpz_archive2 != NULL) { - if (p == SPEX_MPZ_PTR(*(spex_gmp->mpz_archive2))) + if (p == SPEX_MPZ_PTR((spex_gmp->mpz_archive2))) { - SPEX_MPZ_PTR(*(spex_gmp->mpz_archive2)) = NULL ; + SPEX_MPZ_PTR((spex_gmp->mpz_archive2)) = NULL ; } } if (spex_gmp->mpq_archive != NULL) { - if (p == SPEX_MPZ_PTR(SPEX_MPQ_NUM(*spex_gmp->mpq_archive))) + if (p == SPEX_MPZ_PTR(SPEX_MPQ_NUM(spex_gmp->mpq_archive))) { - SPEX_MPZ_PTR(SPEX_MPQ_NUM(*spex_gmp->mpq_archive)) = NULL ; + SPEX_MPZ_PTR(SPEX_MPQ_NUM(spex_gmp->mpq_archive)) = NULL ; } - if (p == SPEX_MPZ_PTR(SPEX_MPQ_DEN(*spex_gmp->mpq_archive))) + if (p == SPEX_MPZ_PTR(SPEX_MPQ_DEN(spex_gmp->mpq_archive))) { - SPEX_MPZ_PTR(SPEX_MPQ_DEN(*spex_gmp->mpq_archive)) = NULL ; + SPEX_MPZ_PTR(SPEX_MPQ_DEN(spex_gmp->mpq_archive)) = NULL ; } } if (spex_gmp->mpfr_archive != NULL) { - if (p == SPEX_MPFR_REAL_PTR(*spex_gmp->mpfr_archive)) SPEX_MPFR_MANT(*spex_gmp->mpfr_archive) = NULL ; + if (p == SPEX_MPFR_GET_REAL_PTR(spex_gmp->mpfr_archive)) + { + SPEX_MPFR_MANT(spex_gmp->mpfr_archive) = NULL ; + } } } SPEX_FREE (p) ; @@ -1155,7 +1164,7 @@ SPEX_info SPEX_mpz_divexact return (SPEX_PANIC); } - #ifdef SPEX_DEBUG +#ifdef SPEX_DEBUG mpq_t r ; mpq_init (r); // r = 0/1 mpz_fdiv_r (SPEX_MPQ_NUM (r), y, z); @@ -1169,7 +1178,7 @@ SPEX_info SPEX_mpz_divexact return (SPEX_PANIC); } mpq_clear (r); - #endif +#endif mpz_divexact (x, y, z); SPEX_GMP_WRAPPER_FINISH ; @@ -1778,7 +1787,10 @@ SPEX_info SPEX_mpfr_init2 ) { // ensure the mpfr number is not too big - if (size > MPFR_PREC_MAX/2) return (SPEX_PANIC); + if (size > MPFR_PREC_MAX/2) + { + return (SPEX_PANIC); + } // initialize the mpfr number SPEX_GMPFR_WRAPPER_START (x); @@ -1787,6 +1799,31 @@ SPEX_info SPEX_mpfr_init2 return (SPEX_OK); } +//------------------------------------------------------------------------------ +// SPEX_mpfr_set_prec +//------------------------------------------------------------------------------ + +/* Purpose: Set the precision of an mpfr_t number */ + +SPEX_info SPEX_mpfr_set_prec +( + mpfr_t x, // Floating point number to revise + const uint64_t size // # of bits in x +) +{ + // ensure the mpfr number is not too big + if (size > MPFR_PREC_MAX/2) + { + return (SPEX_PANIC); + } + + // set the precision of the mpfr number + SPEX_GMPFR_WRAPPER_START (x); + mpfr_set_prec (x, (mpfr_prec_t) size); + SPEX_GMP_WRAPPER_FINISH ; + return (SPEX_OK); +} + //------------------------------------------------------------------------------ // SPEX_mpfr_set //------------------------------------------------------------------------------ @@ -2101,3 +2138,96 @@ SPEX_info SPEX_mpfr_free_cache ( void ) return (SPEX_OK); } +//------------------------------------------------------------------------------ +// SPEX_mpz_set_null +//------------------------------------------------------------------------------ + +// Purpose: initialize the contents of an mpz_t value + +SPEX_info SPEX_mpz_set_null +( + mpz_t x +) +{ + SPEX_MPZ_SET_NULL (x) ; + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// SPEX_mpq_set_null +//------------------------------------------------------------------------------ + +// Purpose: initialize the contents of an mpq_t value + +SPEX_info SPEX_mpq_set_null +( + mpq_t x +) +{ + SPEX_MPQ_SET_NULL (x) ; + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// SPEX_mpfr_set_null +//------------------------------------------------------------------------------ + +// Purpose: initialize the contents of an mpfr_t value + +SPEX_info SPEX_mpfr_set_null +( + mpfr_t x +) +{ + SPEX_MPFR_SET_NULL (x) ; + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// SPEX_mpz_clear +//------------------------------------------------------------------------------ + +// Purpose: safely clear an mpz_t value + +SPEX_info SPEX_mpz_clear +( + mpz_t x +) +{ + SPEX_MPZ_CLEAR (x) ; + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// SPEX_mpq_clear +//------------------------------------------------------------------------------ + +// Purpose: safely clear an mpq_t value + +SPEX_info SPEX_mpq_clear +( + mpq_t x +) +{ + if (x != NULL) + { + SPEX_MPQ_CLEAR (x) ; + } + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// SPEX_mpfr_clear +//------------------------------------------------------------------------------ + +// Purpose: safely clear an mpfr_t value + +SPEX_info SPEX_mpfr_clear +( + mpfr_t x +) +{ + SPEX_MPFR_CLEAR (x) ; + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index 424802b4..869eb915 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_initialize: initialize SPEX //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -38,10 +38,11 @@ void spex_set_initialized (bool s) SPEX_info SPEX_initialize ( void ) { - if (spex_initialized( )) return (SPEX_PANIC); - - // SPEX requires GMP to support bit counts that are 64-bit integers - if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) return (SPEX_PANIC); + if (spex_initialized( )) + { + // SPEX is already initialized + return (SPEX_PANIC); + } // tell GMP and MPFR which memory allocation functions to use mp_set_memory_functions diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c index 5d1d7e58..819ef97b 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_initialize_expert: intialize SPEX memory functions for GMP //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_malloc.c b/SPEX/SPEX_Utilities/Source/SPEX_malloc.c index 422a138f..ac93fdc7 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_malloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_malloc.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_malloc: wrapper for malloc //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c index 1fb6dea4..95ac35c7 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_matrix_allocate: allocate a SPEX_matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -24,11 +24,20 @@ #define SPEX_FREE_ALL \ { \ - SPEX_matrix_free (&A, option); \ + SPEX_matrix_free (&A, option); \ } #include "spex_util_internal.h" +#if defined (__GNUC__) + #if ( __GNUC__ == 11) + // gcc 11 has a bug that triggers a spurious warning for the call + // to SPEX_MPQ_INIT (A->scale), from -Wstringop-overflow. see + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101854 + #pragma GCC diagnostic ignored "-Wstringop-overflow" + #endif +#endif + SPEX_info SPEX_matrix_allocate ( SPEX_matrix *A_handle, // matrix to allocate @@ -101,7 +110,7 @@ SPEX_info SPEX_matrix_allocate A->x_shallow = false ; // A->scale = 1 - SPEX_CHECK (spex_create_mpq (A->scale)); + SPEX_MPQ_INIT (A->scale) ; SPEX_MPQ_SET_UI (A->scale, 1, 1); //-------------------------------------------------------------------------- diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c index a1c5da53..f40223b8 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c @@ -2,17 +2,19 @@ // SPEX_Utilities/SPEX_matrix_check: check if a matrix is OK //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -#define SPEX_FREE_ALL \ - SPEX_FREE (work); \ - SPEX_MPZ_CLEAR(q); \ - SPEX_MPZ_CLEAR(r); +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE (work); \ + SPEX_mpz_clear (q); \ + SPEX_mpz_clear (r); \ +} #include "spex_util_internal.h" @@ -21,7 +23,7 @@ lines++ ; \ if (pr == 2 && lines > 30) \ { \ - SPEX_PRINTF (" ...\n"); \ + SPEX_PRINTF (" ...\n"); \ pr = 1 ; \ } @@ -143,8 +145,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code // paranoia: check prec here: cast to mprf_prec_t, and back, assert // equality, if not equal then return SPEX_PANIC mpz_t q, r; - SPEX_MPZ_SET_NULL(q); - SPEX_MPZ_SET_NULL(r); + SPEX_mpz_set_null (q); + SPEX_mpz_set_null (r); int64_t lines = 0 ; // # of lines printed so far @@ -418,7 +420,7 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code } // sort the (i,j) indices - qsort (work, nz, 2 * sizeof (int64_t), compar); + qsort (work, nz, 2 * sizeof (int64_t), compar) ; // check for duplicates for (p = 1 ; p < nz ; p++) diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c index efb5fafe..dc27a9b6 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_matrix_copy: create a copy of a matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c index c7a5d9f1..0edf8e5d 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -2,15 +2,17 @@ // SPEX_Utilities/SPEX_matrix_free: free a SPEX_matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ // Free a SPEX_matrix. Any shallow component is not freed. +#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-variable" +#endif #include "spex_util_internal.h" SPEX_info SPEX_matrix_free @@ -37,67 +39,44 @@ SPEX_info SPEX_matrix_free // free any non-shallow components //-------------------------------------------------------------------------- - - // free the integer pattern - if (!(A->p_shallow)) SPEX_FREE (A->p); - if (!(A->i_shallow)) SPEX_FREE (A->i); - if (!(A->j_shallow)) SPEX_FREE (A->j); + // free the integer pattern + if (!(A->p_shallow)) SPEX_FREE (A->p); + if (!(A->i_shallow)) SPEX_FREE (A->i); + if (!(A->j_shallow)) SPEX_FREE (A->j); - // free the values - if (!(A->x_shallow)) + // free the values + if (!(A->x_shallow)) + { + switch (A->type) { - switch (A->type) - { - case SPEX_MPZ: - if ( A->x.mpz != NULL) - { - for (int64_t i = 0; i < A->nzmax; i++) - { - SPEX_MPZ_CLEAR( A->x.mpz[i]); - } - } - SPEX_FREE (A->x.mpz); - break ; - - case SPEX_MPQ: - if ( A->x.mpq != NULL) - { - for (int64_t i = 0; i < A->nzmax; i++) - { - SPEX_MPQ_CLEAR( A->x.mpq[i]); - } - } - SPEX_FREE (A->x.mpq); - break ; - - case SPEX_MPFR: - if ( A->x.mpfr != NULL) - { - for (int64_t i = 0; i < A->nzmax; i++) - { - SPEX_MPFR_CLEAR( A->x.mpfr[i]); - } - } - SPEX_FREE (A->x.mpfr); - break ; - - case SPEX_INT64: - SPEX_FREE (A->x.int64); - break ; - - case SPEX_FP64: - SPEX_FREE (A->x.fp64); - break ; - - default: - // do nothing - break ; - } - } + case SPEX_MPZ: + spex_free_mpz_array (&(A->x.mpz), A->nzmax) ; + break ; + + case SPEX_MPQ: + spex_free_mpq_array (&(A->x.mpq), A->nzmax) ; + break ; + + case SPEX_MPFR: + spex_free_mpfr_array (&(A->x.mpfr), A->nzmax) ; + break ; + case SPEX_INT64: + SPEX_FREE (A->x.int64) ; + break ; + + case SPEX_FP64: + SPEX_FREE (A->x.fp64) ; + break ; + + default: + // do nothing + break ; + } + } // A->scale is never shallow - SPEX_MPQ_CLEAR (A->scale); + SPEX_mpq_clear (A->scale); //-------------------------------------------------------------------------- // free the header diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c index 2d5e8fe1..0747e676 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c @@ -2,14 +2,16 @@ // SPEX_Utilities/SPEX_matrix_nnz: find # of entries in a matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ +#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-variable" +#endif #include "spex_util_internal.h" SPEX_info SPEX_matrix_nnz // find the # of entries in A diff --git a/SPEX/SPEX_Utilities/Source/SPEX_realloc.c b/SPEX/SPEX_Utilities/Source/SPEX_realloc.c index b5e9ebce..a8b0a526 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_realloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_realloc.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_realloc: wrapper for realloc //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c b/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c index 7666123b..e32a7bf3 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c @@ -3,8 +3,8 @@ // SPEX_symbolic_analysis data type. //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c b/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c index 2e53c7a8..fddb7f96 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_thread_finalize: finish SPEX for a single user thread //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c index 67ab3bd2..f13b5bf7 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_thread_initialize: init SPEX for a single user thread //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_transpose.c b/SPEX/SPEX_Utilities/Source/SPEX_transpose.c index 177ee8c3..6fa83e82 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_transpose.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_transpose.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_transpose: Transpose a CSC matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_version.c b/SPEX/SPEX_Utilities/Source/SPEX_version.c index de4c09d4..46918528 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_version.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_version.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_version: report SPEX version information //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_amd.c b/SPEX/SPEX_Utilities/Source/spex_amd.c index 7f41ab89..d5dfa81d 100644 --- a/SPEX/SPEX_Utilities/Source/spex_amd.c +++ b/SPEX/SPEX_Utilities/Source/spex_amd.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_amd: Call AMD for matrix ordering //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_cast_array.c b/SPEX/SPEX_Utilities/Source/spex_cast_array.c index 6d54368e..f1bb6349 100644 --- a/SPEX/SPEX_Utilities/Source/spex_cast_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_cast_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_cast_array: scale and typecast an array //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -35,11 +35,12 @@ // y_scale = 1. // -#define SPEX_FREE_ALL \ -SPEX_MPQ_CLEAR(temp); \ +#define SPEX_FREE_ALL SPEX_mpq_clear (temp) ; #include "spex_util_internal.h" +#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-variable" +#endif SPEX_info spex_cast_array ( @@ -65,7 +66,7 @@ SPEX_info spex_cast_array } SPEX_info info ; int r; - mpq_t temp; SPEX_MPQ_SET_NULL(temp); + mpq_t temp; SPEX_mpq_set_null (temp); mpfr_rnd_t round = SPEX_OPTION_ROUND (option); diff --git a/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c b/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c index 223971e2..38fdd594 100644 --- a/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c +++ b/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_cast_matrix: create a dense typecasted matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_colamd.c b/SPEX/SPEX_Utilities/Source/spex_colamd.c index ff9cfb27..b1abcd43 100644 --- a/SPEX/SPEX_Utilities/Source/spex_colamd.c +++ b/SPEX/SPEX_Utilities/Source/spex_colamd.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_colamd: Call COLAMD for matrix ordering //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c index 7b737460..85b9e363 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_create_mpfr_array: create a dense mpfr array //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -38,12 +38,8 @@ mpfr_t *spex_create_mpfr_array { if (SPEX_mpfr_init2(x[i], prec) != SPEX_OK) { - SPEX_MPFR_SET_NULL(x[i]); - for (int64_t j = 0; j < i; j++) - { - SPEX_MPFR_CLEAR( x[j]); - } - SPEX_FREE(x); + SPEX_mpfr_set_null (x[i]); + spex_free_mpfr_array (&x, n) ; return NULL; } } diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpq.c b/SPEX/SPEX_Utilities/Source/spex_create_mpq.c deleted file mode 100644 index 1571e204..00000000 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpq.c +++ /dev/null @@ -1,37 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Utilities/spex_create_mpq: create an mpq_t entry -//------------------------------------------------------------------------------ - -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. -// All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function safely creates and initializes an mpq_t entry. - */ - -// The SPEX_mpq_init function is wrapped in this method to avoid a spurious -// compiler warning in SPEX_MPQ_SET_NULL, about writing past the size of a -// variable. The warning arises when a high level of optimization is used. -// The warning cannot be supressed entirely because it would require a -// modifcation to GMP itself. - -#include "spex_util_internal.h" -SPEX_info spex_create_mpq -( - mpq_t x // mpq_t entry to be initialized -) -{ - - SPEX_info info = SPEX_mpq_init(x); - if (info != SPEX_OK) - { - // Out of memory - SPEX_MPQ_SET_NULL(x); - return info; - } - return SPEX_OK; -} - diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c index 4e28bc69..480b09fc 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_create_mpq_array: create a dense mpq array //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -37,12 +37,8 @@ mpq_t *spex_create_mpq_array if (SPEX_mpq_init(x[i]) != SPEX_OK) { // Out of memory - SPEX_MPQ_SET_NULL(x[i]); - for (int64_t j = 0; j < i; j++) - { - SPEX_MPQ_CLEAR( x[j]); - } - SPEX_FREE(x); + SPEX_mpq_set_null (x[i]); + spex_free_mpq_array (&x, n) ; return NULL; } } diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c index 1e87b387..e758be61 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_create_mpz_array: create a dense mpz array //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -44,17 +44,10 @@ mpz_t *spex_create_mpz_array // out of memory. NOTE: This can be triggered only when using GMP // v6.1.2 or earlier versions. For GMP v6.2.0 or later versions, // there is no memory allocation, and thus such failure will never - // occur. As a result, this code cannot be untested by the tests + // occur. As a result, this code cannot be tested by the tests // in SPEX/Tcov, when using GMP v6.2.0 or later. - SPEX_MPZ_SET_NULL(x[i]); - for (int64_t j = 0; j < i; j++) - { - if ( x[j] != NULL) - { - SPEX_MPZ_CLEAR( x[j]); - } - } - SPEX_FREE(x); + SPEX_mpz_set_null (x[i]); + spex_free_mpz_array (&x, n) ; return NULL; } #endif diff --git a/SPEX/SPEX_Utilities/Source/spex_cumsum.c b/SPEX/SPEX_Utilities/Source/spex_cumsum.c index d7f8ccd8..6a386a2a 100644 --- a/SPEX/SPEX_Utilities/Source/spex_cumsum.c +++ b/SPEX/SPEX_Utilities/Source/spex_cumsum.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_cumsum: cumulative sum //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c index ce6de0d8..57ce2bed 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_expand_double_array: convert double vector to mpz //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -16,9 +16,9 @@ */ #define SPEX_FREE_WORKSPACE \ - SPEX_MPZ_CLEAR(gcd); \ - SPEX_MPZ_CLEAR(one); \ - SPEX_MPQ_CLEAR(temp); \ + SPEX_mpz_clear (gcd); \ + SPEX_mpz_clear (one); \ + SPEX_mpq_clear (temp); \ SPEX_matrix_free(&x3, NULL); \ #define SPEX_FREE_ALL \ @@ -65,8 +65,8 @@ SPEX_info spex_expand_double_array // DOUBLE_MAX. In that case the multiplication could lead to inf. SPEX_matrix x3 = NULL; - mpz_t gcd, one; SPEX_MPZ_SET_NULL(gcd); SPEX_MPZ_SET_NULL(one); - mpq_t temp; SPEX_MPQ_SET_NULL(temp); + mpz_t gcd, one; SPEX_mpz_set_null (gcd); SPEX_mpz_set_null (one); + mpq_t temp; SPEX_mpq_set_null (temp); mpfr_rnd_t round = SPEX_OPTION_ROUND (option); diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c index b3f06e2f..44ddb591 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_expand_mpfr_array: convert mpfr aray to mpz //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -15,21 +15,13 @@ * arrays to be used within SPEX. */ -#define SPEX_FREE_ALL \ - SPEX_MPZ_CLEAR(gcd); \ - SPEX_MPZ_CLEAR(one); \ - SPEX_MPQ_CLEAR(temp); \ - if (x_mpq) \ - { \ - for (i = 0; i < n; i++) \ - { \ - if ( x_mpq[i] != NULL) \ - { \ - SPEX_MPQ_CLEAR(x_mpq[i]); \ - } \ - } \ - } \ - SPEX_FREE(x_mpq); +#define SPEX_FREE_ALL \ +{ \ + SPEX_mpz_clear (gcd); \ + SPEX_mpz_clear (one); \ + SPEX_mpq_clear (temp); \ + spex_free_mpq_array (&x_mpq, n) ; \ +} #include "spex_util_internal.h" @@ -59,9 +51,9 @@ SPEX_info spex_expand_mpfr_array bool nz_found = false; mpz_t gcd, one; mpq_t *x_mpq = NULL; - SPEX_MPZ_SET_NULL(gcd); - SPEX_MPZ_SET_NULL(one); - mpq_t temp; SPEX_MPQ_SET_NULL(temp); + SPEX_mpz_set_null (gcd); + SPEX_mpz_set_null (one); + mpq_t temp; SPEX_mpq_set_null (temp); SPEX_MPQ_INIT(temp); SPEX_MPZ_INIT(gcd); diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c index a7097fba..1904cee6 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_expand_mpq_array: convert mpq array to mpz //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -15,7 +15,7 @@ */ #define SPEX_FREE_ALL \ - SPEX_MPZ_CLEAR(temp); + SPEX_mpz_clear (temp); #include "spex_util_internal.h" @@ -33,7 +33,7 @@ SPEX_info spex_expand_mpq_array ASSERT(n >= 0); SPEX_info info ; mpz_t temp; - SPEX_MPZ_SET_NULL(temp); + SPEX_mpz_set_null (temp); SPEX_MPZ_INIT(temp); // Find LCM of denominators of x diff --git a/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c new file mode 100644 index 00000000..939e48a3 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// SPEX_Utilities/spex_free_mpfr_array: free an mpfr_t array +//------------------------------------------------------------------------------ + +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// Free a spex mpfr_t array +#if defined (__GNUC__) +#pragma GCC diagnostic ignored "-Wunused-variable" +#endif + +#include "spex_util_internal.h" + +void spex_free_mpfr_array +( + mpfr_t **x_handle, // mpfr_t array of size n + int64_t n +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + if (x_handle == NULL || (*x_handle) == NULL) + { + // nothing to free (not an error) + return ; + } + + //-------------------------------------------------------------------------- + // free the mpfr_t array x + //-------------------------------------------------------------------------- + + mpfr_t *x = (*x_handle) ; + + for (int64_t i = 0 ; i < n ; i++) + { + SPEX_MPFR_CLEAR (x [i]) ; + } + + SPEX_FREE (x) ; + (*x_handle) = NULL ; +} + diff --git a/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c new file mode 100644 index 00000000..1abb64b9 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// SPEX_Utilities/spex_free_mpq_array: free an mpq_t array +//------------------------------------------------------------------------------ + +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// Free a spex mpq_t array +#if defined (__GNUC__) +#pragma GCC diagnostic ignored "-Wunused-variable" +#endif + +#include "spex_util_internal.h" + +void spex_free_mpq_array +( + mpq_t **x_handle, // mpq_t array of size n + int64_t n +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + if (x_handle == NULL || (*x_handle) == NULL) + { + // nothing to free (not an error) + return ; + } + + //-------------------------------------------------------------------------- + // free the mpq_t array x + //-------------------------------------------------------------------------- + + mpq_t *x = (*x_handle) ; + + for (int64_t i = 0 ; i < n ; i++) + { + SPEX_mpq_clear (x [i]) ; + } + + SPEX_FREE (x) ; + (*x_handle) = NULL ; +} + diff --git a/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c new file mode 100644 index 00000000..28b7fee8 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// SPEX_Utilities/spex_free_mpz_array: free an mpz_t array +//------------------------------------------------------------------------------ + +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// Free a spex mpz_t array +#if defined (__GNUC__) +#pragma GCC diagnostic ignored "-Wunused-variable" +#endif + +#include "spex_util_internal.h" + +void spex_free_mpz_array +( + mpz_t **x_handle, // mpz_t array of size n + int64_t n +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + if (x_handle == NULL || (*x_handle) == NULL) + { + // nothing to free (not an error) + return ; + } + + //-------------------------------------------------------------------------- + // free the mpz_t array x + //-------------------------------------------------------------------------- + + mpz_t *x = (*x_handle) ; + + for (int64_t i = 0 ; i < n ; i++) + { + SPEX_MPZ_CLEAR (x [i]) ; + } + + SPEX_FREE (x) ; + (*x_handle) = NULL ; +} + diff --git a/SPEX/SPEX_Utilities/Source/spex_gmp.h b/SPEX/SPEX_Utilities/Source/spex_gmp.h index 466a3338..0c8cc7c4 100644 --- a/SPEX/SPEX_Utilities/Source/spex_gmp.h +++ b/SPEX/SPEX_Utilities/Source/spex_gmp.h @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_gmp.h: definitions for SPEX_gmp.c //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -32,10 +32,10 @@ typedef struct int64_t nmalloc ; // # of malloc'd objects in spex_gmp->list int64_t nlist ; // size of the spex_gmp->list void **list ; // list of malloc'd objects - mpz_t *mpz_archive ; // current mpz object - mpz_t *mpz_archive2 ; // current second mpz object - mpq_t *mpq_archive ; // current mpq object - mpfr_t *mpfr_archive ; // current mpfr object + mpz_ptr mpz_archive ; // current mpz object + mpz_ptr mpz_archive2 ; // current second mpz object + mpq_ptr mpq_archive ; // current mpq object + mpfr_ptr mpfr_archive ; // current mpfr object int primary ; // 1 if created by SPEX_initialize; 0 for // SPEX_thread_initialize } spex_gmp_t ; @@ -80,94 +80,6 @@ void spex_gmp_dump ( void ) ; SPEX_info spex_gmp_failure (int status) ; -//------------------------------------------------------------------------------ -// Field access macros for MPZ/MPQ/MPFR struct -//------------------------------------------------------------------------------ -// FUTURE: make these accessible to the end user? - -// (similar definition in gmp-impl.h and mpfr-impl.h) - -#define SPEX_MPZ_SIZ(x) ((x)->_mp_size) -#define SPEX_MPZ_PTR(x) ((x)->_mp_d) -#define SPEX_MPZ_ALLOC(x) ((x)->_mp_alloc) -#define SPEX_MPQ_NUM(x) mpq_numref(x) -#define SPEX_MPQ_DEN(x) mpq_denref(x) -#define SPEX_MPFR_MANT(x) ((x)->_mpfr_d) -#define SPEX_MPFR_EXP(x) ((x)->_mpfr_exp) -#define SPEX_MPFR_PREC(x) ((x)->_mpfr_prec) -#define SPEX_MPFR_SIGN(x) ((x)->_mpfr_sign) - -/*re-define but same result: */ -#define SPEX_MPFR_REAL_PTR(x) (&((x)->_mpfr_d[-1])) - -/* Invalid exponent value (to track bugs...) */ -#define SPEX_MPFR_EXP_INVALID \ - ((mpfr_exp_t) 1 << (GMP_NUMB_BITS*sizeof(mpfr_exp_t)/sizeof(mp_limb_t)-2)) - -/* Macros to set the pointer in mpz_t/mpq_t/mpfr_t variable to NULL. It is best - * practice to call these macros immediately after mpz_t/mpq_t/mpfr_t variable - * is declared, and before the mp*_init function is called. It would help to - * prevent error when SPEX_MP*_CLEAR is called before the variable is - * successfully initialized. - */ - -#define SPEX_MPZ_SET_NULL(x) \ -{ \ - SPEX_MPZ_PTR(x) = NULL; \ - SPEX_MPZ_SIZ(x) = 0; \ - SPEX_MPZ_ALLOC(x) = 0; \ -} - -#define SPEX_MPQ_SET_NULL(x) \ -{ \ - SPEX_MPZ_PTR(SPEX_MPQ_NUM(x)) = NULL; \ - SPEX_MPZ_SIZ(SPEX_MPQ_NUM(x)) = 0; \ - SPEX_MPZ_ALLOC(SPEX_MPQ_NUM(x)) = 0; \ - SPEX_MPZ_PTR(SPEX_MPQ_DEN(x)) = NULL; \ - SPEX_MPZ_SIZ(SPEX_MPQ_DEN(x)) = 0; \ - SPEX_MPZ_ALLOC(SPEX_MPQ_DEN(x)) = 0; \ -} - -#define SPEX_MPFR_SET_NULL(x) \ -{ \ - SPEX_MPFR_MANT(x) = NULL; \ - SPEX_MPFR_PREC(x) = 0; \ - SPEX_MPFR_SIGN(x) = 1; \ - SPEX_MPFR_EXP(x) = SPEX_MPFR_EXP_INVALID; \ -} - -/* GMP does not give a mechanism to tell a user when an mpz, mpq, or mpfr - * item has been cleared; thus, if mp*_clear is called on an object that - * has already been cleared, gmp will crash. It is also not possible to - * set a mp*_t = NULL. Thus, this mechanism modifies the internal GMP - * size of entries to avoid crashing in the case that a mp*_t is cleared - * multiple times. - */ - -#define SPEX_MPZ_CLEAR(x) \ -{ \ - if ((x) != NULL && SPEX_MPZ_PTR(x) != NULL) \ - { \ - mpz_clear(x); \ - SPEX_MPZ_SET_NULL(x); \ - } \ -} - -#define SPEX_MPQ_CLEAR(x) \ -{ \ - SPEX_MPZ_CLEAR(SPEX_MPQ_NUM(x)); \ - SPEX_MPZ_CLEAR(SPEX_MPQ_DEN(x)); \ -} - -#define SPEX_MPFR_CLEAR(x) \ -{ \ - if ((x) != NULL && SPEX_MPFR_MANT(x) != NULL)\ - { \ - mpfr_clear(x); \ - SPEX_MPFR_SET_NULL(x); \ - } \ -} - //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //-------------------------------GMP/MPFR wrapper macros------------------------ @@ -242,5 +154,4 @@ SPEX_info spex_gmp_failure (int status) ; #define SPEX_MPFR_SGN(sgn,x) SPEX_CHECK( SPEX_mpfr_sgn (sgn,x) ) #define SPEX_MPFR_FREE_CACHE() SPEX_CHECK( SPEX_mpfr_free_cache () ) - #endif diff --git a/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c b/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c index bb7ba8a0..4cf2f29f 100644 --- a/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c +++ b/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_matrix_mul: multiplies a MPZ matrix by a scalar //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c b/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c index 0e886696..93378e22 100644 --- a/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c +++ b/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c @@ -3,8 +3,8 @@ // as A_out = P*A_in //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c b/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c index 3754bf6d..ff914337 100644 --- a/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c +++ b/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_sparse_collapse: shrink space required by CSC mpz matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c b/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c index 0607a5cd..8428f773 100644 --- a/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c +++ b/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_sparse_realloc: double the space for a sparse mpz matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index 3ca7c885..fbf11c41 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_util_internal: include file for internal use in SPEX_Utility functions //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -15,8 +15,10 @@ #ifndef SPEX_UTIL_INTERNAL_H #define SPEX_UTIL_INTERNAL_H +#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wunused-value" +#endif //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -25,10 +27,11 @@ //------------------------------------------------------------------------------ // Standard C libraries +#include +#include #include - -// SuiteSparse headers -#include "SuiteSparse_config.h" +#include +#include // user-callable functions #include "SPEX.h" @@ -36,6 +39,11 @@ // SPEX interface to GMP and MPFR #include "spex_gmp.h" +// SuiteSparse headers +#include "SuiteSparse_config.h" +#include "colamd.h" +#include "amd.h" + //------------------------------------------------------------------------------ // debugging //------------------------------------------------------------------------------ @@ -143,31 +151,34 @@ // Local variables (only declared, allocated and freed inside an if, for // example) do not go inside the workspace. -#ifdef SPEX_DEBUG - #define SPEX_CHECK(method) \ - { \ - info = (method); \ - if (info != SPEX_OK) \ - { \ - printf("file %s line %d\n",__FILE__,__LINE__);\ - SPEX_FREE_ALL; \ - return (info); \ - } \ - } +// SPEX_CHECK: similar to SPEX_TRY (which is user-accessible). The SPEX_CHECK +// macro is used internally. -#else +#define SPEX_CHECK(method) \ +{ \ + info = (method); \ + if (info != SPEX_OK) \ + { \ + SPEX_FREE_ALL; \ + return (info); \ + } \ +} - #define SPEX_CHECK(method) \ - { \ - info = (method); \ - if (info != SPEX_OK) \ - { \ - SPEX_FREE_ALL; \ - return (info); \ - } \ - } +//------------------------------------------------------------------------------ +// check versions of SuiteSparse packages +//------------------------------------------------------------------------------ +#if !defined (SUITESPARSE__VERSION) || SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0) +#error "SPEX requires SuiteSparse_config 7.7.0 or later" +#endif + +#if !defined (AMD__VERSION) || AMD__VERSION < SUITESPARSE__VERCODE(3,3,2) +#error "SPEX requires AMD 3.3.2 or later" +#endif + +#if !defined (COLAMD__VERSION) || COLAMD__VERSION < SUITESPARSE__VERCODE(3,3,3) +#error "SPEX requires COLAMD 3.3.3 or later" #endif //------------------------------------------------------------------------------ @@ -192,12 +203,8 @@ #define SPEX_PR2(...) { if (pr >= 2) SPEX_PRINTF (__VA_ARGS__) } #define SPEX_PR3(...) { if (pr >= 3) SPEX_PRINTF (__VA_ARGS__) } - - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//----------------------------------------------------- //------------------------------------------------------------------------------ +// Default parameter values //------------------------------------------------------------------------------ // Tolerance used in the pivoting schemes. This number can be anything in @@ -284,7 +291,88 @@ #define SPEX_OPTION_ALGORITHM(option) \ SPEX_OPTION (option, algo, SPEX_DEFAULT_ALGORITHM) +//------------------------------------------------------------------------------ +// Field access macros for MPZ/MPQ/MPFR struct +//------------------------------------------------------------------------------ + +// Thse macros rely on GMP and MPFR definitions in gmp.h, but which are not +// necessarily meant to be accessed by the application (SPEX) that is using +// GMP. They provide access to the internal structure for the MPZ, MPQ, and +// MPFR data types. + +#define SPEX_MPZ_SIZ(x) ((x)->_mp_size) +#define SPEX_MPZ_PTR(x) ((x)->_mp_d) +#define SPEX_MPZ_ALLOC(x) ((x)->_mp_alloc) +#define SPEX_MPQ_NUM(x) mpq_numref(x) +#define SPEX_MPQ_DEN(x) mpq_denref(x) +#define SPEX_MPFR_MANT(x) ((x)->_mpfr_d) +#define SPEX_MPFR_EXP(x) ((x)->_mpfr_exp) +#define SPEX_MPFR_PREC(x) ((x)->_mpfr_prec) +#define SPEX_MPFR_SIGN(x) ((x)->_mpfr_sign) + +// Invalid exponent value (to track bugs...) +#define SPEX_MPFR_EXP_INVALID \ + ((mpfr_exp_t) 1 << (GMP_NUMB_BITS*sizeof(mpfr_exp_t)/sizeof(mp_limb_t)-2)) + +/* Macros to set the pointer in mpz_t/mpq_t/mpfr_t variable to NULL. It is best + * practice to call these macros immediately after mpz_t/mpq_t/mpfr_t variable + * is declared, and before the mp*_init function is called. It would help to + * prevent error when SPEX_MP*_CLEAR is called before the variable is + * successfully initialized. + */ +#define SPEX_MPZ_SET_NULL(x) \ +{ \ + SPEX_MPZ_PTR(x) = NULL; \ + SPEX_MPZ_SIZ(x) = 0; \ + SPEX_MPZ_ALLOC(x) = 0; \ +} + +#define SPEX_MPQ_SET_NULL(x) \ +{ \ + SPEX_MPZ_SET_NULL (SPEX_MPQ_NUM (x)) ; \ + SPEX_MPZ_SET_NULL (SPEX_MPQ_DEN (x)) ; \ +} + +#define SPEX_MPFR_SET_NULL(x) \ +{ \ + SPEX_MPFR_MANT(x) = NULL; \ + SPEX_MPFR_PREC(x) = 0; \ + SPEX_MPFR_SIGN(x) = 1; \ + SPEX_MPFR_EXP(x) = SPEX_MPFR_EXP_INVALID; \ +} + +/* GMP does not give a mechanism to tell a user when an mpz, mpq, or mpfr + * item has been cleared; thus, if mp*_clear is called on an object that + * has already been cleared, gmp will crash. It is also not possible to + * set a mp*_t = NULL. Thus, this mechanism modifies the internal GMP + * size of entries to avoid crashing in the case that a mp*_t is cleared + * multiple times. + */ + +#define SPEX_MPZ_CLEAR(x) \ +{ \ + if ((x) != NULL && SPEX_MPZ_PTR(x) != NULL) \ + { \ + mpz_clear(x); \ + SPEX_MPZ_SET_NULL(x); \ + } \ +} + +#define SPEX_MPQ_CLEAR(x) \ +{ \ + SPEX_MPZ_CLEAR(SPEX_MPQ_NUM(x)); \ + SPEX_MPZ_CLEAR(SPEX_MPQ_DEN(x)); \ +} + +#define SPEX_MPFR_CLEAR(x) \ +{ \ + if ((x) != NULL && SPEX_MPFR_MANT(x) != NULL)\ + { \ + mpfr_clear(x); \ + SPEX_MPFR_SET_NULL(x); \ + } \ +} // ============================================================================ // Internal Functions @@ -309,6 +397,18 @@ mpfr_t *spex_create_mpfr_array const SPEX_options option // command options containing the prec for mpfr ) ; +//------------------------------------------------------------------------------ +// spex_free_mpfr_array: free a 1D mpfr_t array +//------------------------------------------------------------------------------ + +// Purpose: frees the array created by spex_create_mpfr_array. + +void spex_free_mpfr_array +( + mpfr_t **x_handle, // mpfr_t array of size n + int64_t n +) ; + //------------------------------------------------------------------------------ // spex_create_mpq_array: Creates a 1D array, whose entries are all mpq_t type. //------------------------------------------------------------------------------ @@ -324,11 +424,16 @@ mpq_t *spex_create_mpq_array int64_t n // size of the array ) ; -// Create and initialize a single mpq_t variable +//------------------------------------------------------------------------------ +// spex_free_mpq_array: delete a 1D mpq_t array +//------------------------------------------------------------------------------ + +// Purpose: frees the array created by spex_create_mpq_array. -SPEX_info spex_create_mpq +void spex_free_mpq_array ( - mpq_t x // mpq_t entry to be initialized + mpq_t **x_handle, // mpq_t array of size n + int64_t n ) ; //------------------------------------------------------------------------------ @@ -343,24 +448,25 @@ SPEX_info spex_create_mpq mpz_t *spex_create_mpz_array ( - int64_t n // size of the array + int64_t n // size of the array ) ; //------------------------------------------------------------------------------ -// spex_delete_mpz_array: delete a 1D mpz_t array +// spex_free_mpz_array: delete a 1D mpz_t array //------------------------------------------------------------------------------ -// Delete a simple 1D array, where A[i] is an entry of type mpz_t. +// Purpose: frees the array created by spex_create_mpz_array. -/* Purpose: This function deletes a mpz array of size n - */ - -void spex_delete_mpz_array +void spex_free_mpz_array ( - mpz_t **x, // mpz array to be deleted - int64_t n // Size of x + mpz_t **x_handle, // mpz_t array of size n + int64_t n ) ; +//------------------------------------------------------------------------------ +// spex_expand_double_array +//------------------------------------------------------------------------------ + /* Purpose: This function converts a double array of size n to an appropriate * mpz array of size n. To do this, the number is multiplied by 10^17 then, the * GCD is found. This function allows the use of matrices in double precision @@ -564,19 +670,5 @@ SPEX_info spex_amd ASSERT_KIND (A,required_kind) ; \ ASSERT_TYPE (A,required_type) ; -//------------------------------------------------------------------------------ -// SPEX_matrix macros -//------------------------------------------------------------------------------ - -// These macros simplify the access to entries in a SPEX_matrix. -// The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. - -// To access the kth entry in a SPEX_matrix using 1D linear addressing, -// in any matrix kind (CSC, triplet, or dense), in any type: -#define SPEX_1D(A,k,type) ((A)->x.type [k]) - -// To access the (i,j)th entry in a 2D SPEX_matrix, in any type: -#define SPEX_2D(A,i,j,type) SPEX_1D (A, (i)+(j)*((A)->m), type) - #endif diff --git a/SPEX/Tcov/.gitignore b/SPEX/Tcov/.gitignore index 8b6d5d37..14492e71 100644 --- a/SPEX/Tcov/.gitignore +++ b/SPEX/Tcov/.gitignore @@ -1,15 +1,10 @@ -# Ignore all files: -* - -# except these files ... -!covall -!cov.awk -!cover -!covs -!gcovs -!Mats4Tcov/ -!README.txt -!simple_*.c -!simple_*.h -!tcov_*.c -!tcov_*.h +# Ignore these files: +Makefile +spex*.c +SPEX*.c +*.out +spex_demo_lu_extended +tcov_for_cholesky +tcov_for_lu +tcov_for_lu2 +tcov_for_other diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/.gitignore b/SPEX/Tcov/Mats4Tcov/SPEX_Update/.gitignore deleted file mode 100644 index 8700b58a..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Ignore these files: -mat.txt diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat1.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat1.txt deleted file mode 100644 index b0a083c3..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat1.txt +++ /dev/null @@ -1,15 +0,0 @@ -4 12 1 2 -0 0 1 -1 0 1 -2 0 1 -3 0 1 -1 1 1 -2 1 0 -3 1 0 -1 2 1 -1 3 1 -2 2 1 -2 3 1 -3 3 1 -1 1 -3 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat10.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat10.txt deleted file mode 100644 index 15199545..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat10.txt +++ /dev/null @@ -1,36 +0,0 @@ -7 30 4 5 -0 0 1 -1 0 1 -2 0 1 -5 0 1 -6 0 1 -0 1 1 -0 4 1 -0 5 1 -0 6 1 -1 1 1 -1 3 1 -1 4 1 -1 6 1 -2 2 1 -4 2 1 -5 2 1 -6 2 1 -2 5 1 -2 6 1 -3 3 1 -5 3 1 -3 6 1 -4 4 1 -5 4 1 -6 4 1 -4 6 1 -5 5 1 -6 5 1 -5 6 1 -6 6 1 -0 1 -1 1 -3 1 -4 1 -6 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat11.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat11.txt deleted file mode 100644 index 27ad239a..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat11.txt +++ /dev/null @@ -1,1336 +0,0 @@ -50 1309 37 26 -0 0 1 -1 0 1 -3 0 1 -4 0 1 -5 0 1 -8 0 1 -10 0 1 -12 0 1 -14 0 1 -15 0 1 -16 0 1 -17 0 1 -18 0 1 -20 0 1 -24 0 1 -29 0 1 -31 0 1 -32 0 1 -33 0 1 -35 0 1 -36 0 1 -38 0 1 -40 0 1 -41 0 1 -42 0 1 -44 0 1 -47 0 1 -48 0 1 -0 2 1 -0 4 1 -0 6 1 -0 8 1 -0 9 1 -0 12 1 -0 13 1 -0 14 1 -0 20 1 -0 21 1 -0 23 1 -0 24 1 -0 25 1 -0 26 1 -0 27 1 -0 29 1 -0 32 1 -0 33 1 -0 36 1 -0 38 1 -0 40 1 -0 41 1 -0 42 1 -0 43 1 -0 44 1 -1 1 1 -2 1 1 -3 1 1 -6 1 1 -7 1 1 -14 1 1 -15 1 1 -16 1 1 -18 1 1 -20 1 1 -21 1 1 -22 1 1 -23 1 1 -26 1 1 -27 1 1 -28 1 1 -30 1 1 -31 1 1 -33 1 1 -36 1 1 -37 1 1 -40 1 1 -42 1 1 -43 1 1 -44 1 1 -45 1 1 -46 1 1 -48 1 1 -1 4 1 -1 6 1 -1 7 1 -1 11 1 -1 14 1 -1 15 1 -1 17 1 -1 22 1 -1 26 1 -1 27 1 -1 29 1 -1 31 1 -1 32 1 -1 34 1 -1 36 1 -1 40 1 -1 42 1 -1 43 1 -1 44 1 -1 46 1 -1 49 1 -2 2 1 -3 2 1 -4 2 1 -5 2 1 -8 2 1 -9 2 1 -11 2 1 -12 2 1 -14 2 1 -16 2 1 -22 2 1 -25 2 1 -29 2 1 -30 2 1 -31 2 1 -32 2 1 -34 2 1 -38 2 1 -41 2 1 -43 2 1 -45 2 1 -47 2 1 -49 2 1 -2 4 1 -2 6 1 -2 7 1 -2 15 1 -2 16 1 -2 17 1 -2 20 1 -2 21 1 -2 23 1 -2 24 1 -2 25 1 -2 28 1 -2 29 1 -2 31 1 -2 35 1 -2 37 1 -2 41 1 -2 44 1 -2 45 1 -2 47 1 -2 49 1 -3 3 1 -6 3 1 -7 3 1 -8 3 1 -9 3 1 -10 3 1 -11 3 1 -14 3 1 -19 3 1 -20 3 1 -21 3 1 -24 3 1 -26 3 1 -28 3 1 -30 3 1 -33 3 1 -34 3 1 -38 3 1 -39 3 1 -41 3 1 -42 3 1 -44 3 1 -46 3 1 -47 3 1 -49 3 1 -3 5 1 -3 6 1 -3 11 1 -3 13 1 -3 14 1 -3 15 1 -3 17 1 -3 18 1 -3 20 1 -3 21 1 -3 24 1 -3 26 1 -3 28 1 -3 30 1 -3 33 1 -3 34 1 -3 36 1 -3 41 1 -3 42 1 -3 43 1 -3 45 1 -3 47 1 -3 48 1 -3 49 1 -4 4 1 -5 4 1 -6 4 1 -7 4 1 -8 4 1 -10 4 1 -11 4 1 -12 4 1 -13 4 1 -14 4 1 -15 4 1 -16 4 1 -17 4 1 -18 4 1 -19 4 1 -22 4 1 -23 4 1 -25 4 1 -27 4 1 -29 4 1 -34 4 1 -36 4 1 -37 4 1 -38 4 1 -40 4 1 -41 4 1 -44 4 1 -45 4 1 -48 4 1 -4 7 1 -4 11 1 -4 14 1 -4 16 1 -4 17 1 -4 18 1 -4 19 1 -4 20 1 -4 21 1 -4 23 1 -4 24 1 -4 27 1 -4 30 1 -4 31 1 -4 32 1 -4 34 1 -4 35 1 -4 36 1 -4 37 1 -4 42 1 -4 43 1 -4 44 1 -4 45 1 -4 46 1 -4 48 1 -4 49 1 -5 5 1 -8 5 1 -9 5 1 -11 5 1 -15 5 1 -17 5 1 -20 5 1 -21 5 1 -22 5 1 -25 5 1 -26 5 1 -27 5 1 -29 5 1 -31 5 1 -32 5 1 -33 5 1 -35 5 1 -38 5 1 -39 5 1 -43 5 1 -44 5 1 -45 5 1 -47 5 1 -5 14 1 -5 15 1 -5 16 1 -5 20 1 -5 22 1 -5 25 1 -5 30 1 -5 31 1 -5 33 1 -5 35 1 -5 38 1 -5 39 1 -5 40 1 -5 41 1 -5 42 1 -5 46 1 -5 47 1 -6 6 1 -8 6 1 -10 6 1 -14 6 1 -15 6 1 -16 6 1 -17 6 1 -19 6 1 -21 6 1 -22 6 1 -23 6 1 -24 6 1 -26 6 1 -27 6 1 -29 6 1 -30 6 1 -31 6 1 -33 6 1 -36 6 1 -39 6 1 -43 6 1 -44 6 1 -46 6 1 -48 6 1 -49 6 1 -6 7 1 -6 10 1 -6 11 1 -6 13 1 -6 14 1 -6 15 1 -6 16 1 -6 18 1 -6 21 1 -6 22 1 -6 23 1 -6 26 1 -6 27 1 -6 28 1 -6 31 1 -6 32 1 -6 33 1 -6 36 1 -6 37 1 -6 40 1 -6 41 1 -6 42 1 -6 45 1 -6 49 1 -7 7 1 -15 7 1 -16 7 1 -17 7 1 -18 7 1 -19 7 1 -23 7 1 -24 7 1 -29 7 1 -35 7 1 -36 7 1 -38 7 1 -39 7 1 -42 7 1 -43 7 1 -44 7 1 -46 7 1 -48 7 1 -7 8 1 -7 10 1 -7 13 1 -7 15 1 -7 16 1 -7 17 1 -7 20 1 -7 21 1 -7 22 1 -7 25 1 -7 26 1 -7 28 1 -7 29 1 -7 31 1 -7 33 1 -7 36 1 -7 38 1 -7 40 1 -7 41 1 -7 42 1 -8 8 1 -11 8 1 -12 8 1 -13 8 1 -15 8 1 -19 8 1 -20 8 1 -23 8 1 -24 8 1 -27 8 1 -28 8 1 -31 8 1 -36 8 1 -37 8 1 -42 8 1 -43 8 1 -46 8 1 -47 8 1 -48 8 1 -49 8 1 -8 10 1 -8 12 1 -8 13 1 -8 15 1 -8 16 1 -8 19 1 -8 21 1 -8 22 1 -8 25 1 -8 26 1 -8 27 1 -8 28 1 -8 30 1 -8 33 1 -8 34 1 -8 36 1 -8 37 1 -8 44 1 -8 46 1 -8 47 1 -8 49 1 -9 9 1 -12 9 1 -15 9 1 -16 9 1 -17 9 1 -18 9 1 -20 9 1 -23 9 1 -27 9 1 -30 9 1 -32 9 1 -33 9 1 -36 9 1 -37 9 1 -38 9 1 -42 9 1 -44 9 1 -45 9 1 -46 9 1 -9 11 1 -9 12 1 -9 13 1 -9 14 1 -9 17 1 -9 21 1 -9 24 1 -9 25 1 -9 26 1 -9 28 1 -9 29 1 -9 30 1 -9 32 1 -9 33 1 -9 35 1 -9 36 1 -9 37 1 -9 40 1 -9 41 1 -9 43 1 -9 47 1 -9 48 1 -10 10 1 -14 10 1 -16 10 1 -21 10 1 -23 10 1 -24 10 1 -25 10 1 -26 10 1 -27 10 1 -28 10 1 -30 10 1 -32 10 1 -33 10 1 -34 10 1 -35 10 1 -36 10 1 -39 10 1 -40 10 1 -41 10 1 -45 10 1 -47 10 1 -48 10 1 -49 10 1 -10 11 1 -10 15 1 -10 16 1 -10 20 1 -10 22 1 -10 23 1 -10 25 1 -10 27 1 -10 31 1 -10 32 1 -10 34 1 -10 35 1 -10 36 1 -10 37 1 -10 38 1 -10 40 1 -10 46 1 -10 48 1 -11 11 1 -16 11 1 -17 11 1 -20 11 1 -21 11 1 -22 11 1 -24 11 1 -27 11 1 -28 11 1 -29 11 1 -30 11 1 -33 11 1 -34 11 1 -35 11 1 -36 11 1 -37 11 1 -39 11 1 -40 11 1 -41 11 1 -43 11 1 -44 11 1 -45 11 1 -46 11 1 -47 11 1 -48 11 1 -49 11 1 -11 17 1 -11 18 1 -11 19 1 -11 20 1 -11 22 1 -11 27 1 -11 29 1 -11 30 1 -11 31 1 -11 32 1 -11 33 1 -11 34 1 -11 38 1 -11 44 1 -11 45 1 -11 46 1 -11 49 1 -12 12 1 -13 12 1 -15 12 1 -16 12 1 -17 12 1 -18 12 1 -19 12 1 -20 12 1 -22 12 1 -25 12 1 -26 12 1 -27 12 1 -28 12 1 -30 12 1 -31 12 1 -32 12 1 -33 12 1 -35 12 1 -37 12 1 -38 12 1 -39 12 1 -40 12 1 -43 12 1 -45 12 1 -47 12 1 -12 13 1 -12 14 1 -12 15 1 -12 17 1 -12 18 1 -12 19 1 -12 21 1 -12 22 1 -12 23 1 -12 24 1 -12 25 1 -12 26 1 -12 27 1 -12 28 1 -12 29 1 -12 30 1 -12 31 1 -12 32 1 -12 33 1 -12 34 1 -12 35 1 -12 38 1 -12 39 1 -12 41 1 -12 43 1 -12 47 1 -13 13 1 -18 13 1 -19 13 1 -20 13 1 -21 13 1 -24 13 1 -27 13 1 -28 13 1 -31 13 1 -32 13 1 -33 13 1 -36 13 1 -37 13 1 -38 13 1 -39 13 1 -40 13 1 -42 13 1 -45 13 1 -47 13 1 -48 13 1 -13 14 1 -13 18 1 -13 19 1 -13 21 1 -13 23 1 -13 24 1 -13 32 1 -13 33 1 -13 35 1 -13 39 1 -13 41 1 -13 42 1 -13 44 1 -13 46 1 -13 47 1 -13 48 1 -13 49 1 -14 14 1 -16 14 1 -17 14 1 -18 14 1 -20 14 1 -21 14 1 -24 14 1 -25 14 1 -26 14 1 -30 14 1 -31 14 1 -33 14 1 -34 14 1 -38 14 1 -39 14 1 -40 14 1 -41 14 1 -43 14 1 -44 14 1 -49 14 1 -14 15 1 -14 16 1 -14 20 1 -14 21 1 -14 22 1 -14 24 1 -14 27 1 -14 28 1 -14 32 1 -14 36 1 -14 40 1 -14 42 1 -14 43 1 -14 44 1 -14 46 1 -14 48 1 -14 49 1 -15 15 1 -16 15 1 -17 15 1 -18 15 1 -19 15 1 -23 15 1 -24 15 1 -25 15 1 -28 15 1 -30 15 1 -31 15 1 -34 15 1 -36 15 1 -37 15 1 -38 15 1 -39 15 1 -44 15 1 -48 15 1 -15 16 1 -15 19 1 -15 20 1 -15 22 1 -15 23 1 -15 24 1 -15 25 1 -15 26 1 -15 31 1 -15 32 1 -15 34 1 -15 35 1 -15 41 1 -15 42 1 -15 43 1 -15 47 1 -15 48 1 -15 49 1 -16 16 1 -20 16 1 -21 16 1 -23 16 1 -30 16 1 -31 16 1 -35 16 1 -36 16 1 -38 16 1 -40 16 1 -42 16 1 -43 16 1 -45 16 1 -46 16 1 -49 16 1 -16 17 1 -16 19 1 -16 20 1 -16 21 1 -16 22 1 -16 24 1 -16 25 1 -16 29 1 -16 32 1 -16 35 1 -16 37 1 -16 41 1 -16 46 1 -16 48 1 -16 49 1 -17 17 1 -18 17 1 -19 17 1 -20 17 1 -21 17 1 -23 17 1 -25 17 1 -27 17 1 -33 17 1 -35 17 1 -36 17 1 -38 17 1 -41 17 1 -43 17 1 -45 17 1 -46 17 1 -47 17 1 -48 17 1 -49 17 1 -17 18 1 -17 19 1 -17 20 1 -17 21 1 -17 22 1 -17 26 1 -17 30 1 -17 31 1 -17 34 1 -17 36 1 -17 39 1 -17 40 1 -17 41 1 -17 42 1 -17 44 1 -17 45 1 -17 47 1 -18 18 1 -21 18 1 -22 18 1 -24 18 1 -27 18 1 -30 18 1 -31 18 1 -34 18 1 -37 18 1 -39 18 1 -41 18 1 -42 18 1 -43 18 1 -45 18 1 -46 18 1 -47 18 1 -18 20 1 -18 21 1 -18 25 1 -18 28 1 -18 31 1 -18 34 1 -18 35 1 -18 36 1 -18 37 1 -18 40 1 -18 41 1 -18 43 1 -18 44 1 -18 45 1 -18 48 1 -19 19 1 -21 19 1 -22 19 1 -23 19 1 -24 19 1 -25 19 1 -26 19 1 -27 19 1 -35 19 1 -36 19 1 -37 19 1 -42 19 1 -46 19 1 -47 19 1 -49 19 1 -19 21 1 -19 22 1 -19 23 1 -19 25 1 -19 31 1 -19 33 1 -19 34 1 -19 40 1 -19 41 1 -19 44 1 -19 45 1 -19 46 1 -19 48 1 -19 49 1 -20 20 1 -21 20 1 -24 20 1 -25 20 1 -27 20 1 -28 20 1 -29 20 1 -30 20 1 -32 20 1 -33 20 1 -37 20 1 -39 20 1 -42 20 1 -43 20 1 -45 20 1 -46 20 1 -48 20 1 -20 23 1 -20 25 1 -20 26 1 -20 29 1 -20 30 1 -20 34 1 -20 35 1 -20 36 1 -20 37 1 -20 38 1 -20 40 1 -20 42 1 -20 43 1 -20 47 1 -20 48 1 -20 49 1 -21 21 1 -23 21 1 -25 21 1 -30 21 1 -32 21 1 -33 21 1 -35 21 1 -36 21 1 -38 21 1 -39 21 1 -42 21 1 -21 22 1 -21 23 1 -21 24 1 -21 25 1 -21 28 1 -21 29 1 -21 31 1 -21 32 1 -21 33 1 -21 35 1 -21 36 1 -21 37 1 -21 42 1 -21 43 1 -21 45 1 -21 46 1 -21 48 1 -22 22 1 -23 22 1 -27 22 1 -28 22 1 -29 22 1 -30 22 1 -31 22 1 -34 22 1 -36 22 1 -39 22 1 -40 22 1 -41 22 1 -42 22 1 -44 22 1 -45 22 1 -46 22 1 -48 22 1 -22 25 1 -22 26 1 -22 27 1 -22 32 1 -22 33 1 -22 35 1 -22 36 1 -22 38 1 -22 40 1 -22 42 1 -22 44 1 -22 45 1 -22 46 1 -22 47 1 -22 48 1 -23 23 1 -26 23 1 -28 23 1 -29 23 1 -30 23 1 -31 23 1 -32 23 1 -33 23 1 -34 23 1 -35 23 1 -36 23 1 -37 23 1 -38 23 1 -40 23 1 -41 23 1 -45 23 1 -46 23 1 -47 23 1 -49 23 1 -23 29 1 -23 30 1 -23 31 1 -23 32 1 -23 35 1 -23 36 1 -23 38 1 -23 40 1 -23 43 1 -23 49 1 -24 24 1 -27 24 1 -33 24 1 -34 24 1 -36 24 1 -37 24 1 -38 24 1 -41 24 1 -42 24 1 -43 24 1 -45 24 1 -46 24 1 -47 24 1 -48 24 1 -49 24 1 -24 25 1 -24 28 1 -24 29 1 -24 30 1 -24 32 1 -24 36 1 -24 38 1 -24 40 1 -24 41 1 -24 42 1 -24 43 1 -24 45 1 -24 46 1 -24 48 1 -25 25 1 -27 25 1 -28 25 1 -29 25 1 -30 25 1 -33 25 1 -39 25 1 -42 25 1 -43 25 1 -45 25 1 -46 25 1 -25 26 1 -25 27 1 -25 29 1 -25 31 1 -25 32 1 -25 35 1 -25 38 1 -25 42 1 -25 44 1 -25 45 1 -25 49 1 -26 26 1 -28 26 1 -30 26 1 -32 26 1 -33 26 1 -39 26 1 -42 26 1 -46 26 1 -26 27 1 -26 31 1 -26 33 1 -26 35 1 -26 36 1 -26 39 1 -26 40 1 -26 42 1 -26 44 1 -26 46 1 -26 47 1 -27 27 1 -29 27 1 -31 27 1 -32 27 1 -33 27 1 -36 27 1 -37 27 1 -39 27 1 -41 27 1 -42 27 1 -43 27 1 -45 27 1 -46 27 1 -47 27 1 -27 28 1 -27 29 1 -27 30 1 -27 32 1 -27 33 1 -27 36 1 -27 37 1 -27 38 1 -27 41 1 -27 42 1 -27 43 1 -27 44 1 -27 46 1 -27 47 1 -27 48 1 -28 28 1 -29 28 1 -31 28 1 -34 28 1 -36 28 1 -37 28 1 -39 28 1 -43 28 1 -46 28 1 -49 28 1 -28 30 1 -28 31 1 -28 32 1 -28 34 1 -28 35 1 -28 37 1 -28 40 1 -28 41 1 -28 42 1 -28 47 1 -28 48 1 -29 29 1 -34 29 1 -35 29 1 -36 29 1 -37 29 1 -42 29 1 -43 29 1 -44 29 1 -49 29 1 -29 30 1 -29 31 1 -29 32 1 -29 37 1 -29 39 1 -29 40 1 -29 43 1 -29 45 1 -29 46 1 -29 47 1 -29 48 1 -30 30 1 -31 30 1 -33 30 1 -35 30 1 -39 30 1 -40 30 1 -41 30 1 -42 30 1 -46 30 1 -47 30 1 -30 31 1 -30 33 1 -30 35 1 -30 36 1 -30 37 1 -30 38 1 -30 39 1 -30 40 1 -30 42 1 -30 47 1 -31 31 1 -34 31 1 -35 31 1 -40 31 1 -41 31 1 -42 31 1 -44 31 1 -45 31 1 -47 31 1 -31 32 1 -31 33 1 -31 35 1 -31 36 1 -31 37 1 -31 38 1 -31 39 1 -31 40 1 -31 41 1 -31 42 1 -31 43 1 -31 45 1 -31 48 1 -32 32 1 -34 32 1 -35 32 1 -37 32 1 -38 32 1 -40 32 1 -41 32 1 -43 32 1 -44 32 1 -45 32 1 -49 32 1 -32 34 1 -32 35 1 -32 36 1 -32 37 1 -32 39 1 -32 43 1 -32 44 1 -32 45 1 -32 48 1 -33 33 1 -35 33 1 -37 33 1 -39 33 1 -41 33 1 -42 33 1 -43 33 1 -44 33 1 -45 33 1 -48 33 1 -33 35 1 -33 37 1 -33 39 1 -33 41 1 -33 42 1 -33 47 1 -33 48 1 -33 49 1 -34 34 1 -35 34 1 -38 34 1 -41 34 1 -44 34 1 -45 34 1 -47 34 1 -49 34 1 -34 35 1 -34 37 1 -34 38 1 -34 39 1 -34 40 1 -34 44 1 -34 45 1 -34 46 1 -35 35 1 -37 35 1 -38 35 1 -39 35 1 -41 35 1 -43 35 1 -47 35 1 -48 35 1 -35 38 1 -35 45 1 -35 46 1 -35 47 1 -35 48 1 -36 36 1 -37 36 1 -38 36 1 -40 36 1 -45 36 1 -46 36 1 -48 36 1 -49 36 1 -36 39 1 -36 40 1 -36 41 1 -36 42 1 -36 44 1 -37 37 1 -39 37 1 -40 37 1 -42 37 1 -43 37 1 -44 37 1 -45 37 1 -46 37 1 -48 37 1 -49 37 1 -37 38 1 -37 40 1 -37 43 1 -37 44 1 -37 48 1 -37 49 1 -38 38 1 -40 38 1 -44 38 1 -38 39 1 -38 44 1 -38 45 1 -38 46 1 -38 47 1 -38 49 1 -39 39 1 -42 39 1 -46 39 1 -47 39 1 -48 39 1 -39 41 1 -39 43 1 -39 46 1 -39 49 1 -40 40 1 -42 40 1 -43 40 1 -44 40 1 -47 40 1 -40 41 1 -40 43 1 -40 44 1 -40 47 1 -40 49 1 -41 41 1 -43 41 1 -44 41 1 -45 41 1 -41 43 1 -41 47 1 -42 42 1 -45 42 1 -46 42 1 -47 42 1 -48 42 1 -49 42 1 -42 44 1 -42 45 1 -42 46 1 -43 43 1 -44 43 1 -45 43 1 -46 43 1 -48 43 1 -43 44 1 -43 45 1 -43 46 1 -43 48 1 -43 49 1 -44 44 1 -45 44 1 -46 44 1 -47 44 1 -48 44 1 -49 44 1 -44 45 1 -44 46 1 -44 48 1 -45 45 1 -47 45 1 -49 45 1 -45 46 1 -45 47 1 -45 49 1 -46 46 1 -48 46 1 -49 46 1 -46 47 1 -46 49 1 -47 47 1 -48 47 1 -47 49 1 -48 48 1 -49 48 1 -49 49 1 -0 1 -1 1 -7 1 -9 1 -14 1 -15 1 -18 1 -19 1 -20 1 -21 1 -22 1 -23 1 -25 1 -26 1 -27 1 -28 1 -30 1 -32 1 -33 1 -34 1 -37 1 -39 1 -43 1 -45 1 -47 1 -49 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat12.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat12.txt deleted file mode 100644 index 623eea83..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat12.txt +++ /dev/null @@ -1,12 +0,0 @@ -4 8 0 3 -0 0 1 -1 0 1 -0 1 1 -1 1 1 -2 1 1 -3 1 1 -2 2 1 -3 3 1 -0 1 -2 1 -3 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat13.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat13.txt deleted file mode 100644 index 868fc9ca..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat13.txt +++ /dev/null @@ -1,17 +0,0 @@ -4 12 2 4 -0 0 1 -1 0 1 -2 0 1 -3 0 1 -0 1 1 -1 1 1 -2 1 1 -3 1 1 -1 2 1 -1 3 1 -2 2 1 -3 3 1 -0 1 -1 1 -2 1 -3 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat14.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat14.txt deleted file mode 100644 index 2dfeb8b1..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat14.txt +++ /dev/null @@ -1,14 +0,0 @@ -4 10 3 3 -0 0 1 -1 0 1 -2 0 1 -3 0 1 -0 2 1 -1 1 1 -2 1 1 -1 3 1 -2 2 1 -3 3 1 -0 1 -1 1 -3 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat15.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat15.txt deleted file mode 100644 index 242ab03d..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat15.txt +++ /dev/null @@ -1,17 +0,0 @@ -4 14 0 2 -0 0 1 -1 0 1 -2 0 1 -3 0 1 -0 1 1 -0 2 1 -1 1 1 -3 1 1 -1 2 1 -1 3 1 -2 2 1 -3 2 1 -2 3 1 -3 3 1 -0 1 -1 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat16.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat16.txt deleted file mode 100644 index 8619869b..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat16.txt +++ /dev/null @@ -1,11 +0,0 @@ -4 9 0 1 -0 0 1 -1 0 1 -0 2 1 -0 3 1 -1 1 1 -3 1 1 -1 2 1 -2 2 1 -3 3 1 -0 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat17.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat17.txt deleted file mode 100644 index e236b348..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat17.txt +++ /dev/null @@ -1,23 +0,0 @@ -5 18 0 4 -0 0 1 -1 0 1 -2 0 1 -3 0 1 -0 2 1 -0 3 1 -1 1 1 -2 1 1 -3 1 1 -4 1 1 -1 2 1 -2 2 1 -4 2 1 -2 3 1 -2 4 1 -3 3 1 -4 3 1 -4 4 1 -0 1 -1 1 -2 1 -4 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat18.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat18.txt deleted file mode 100644 index 8a3e5bbd..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat18.txt +++ /dev/null @@ -1,20 +0,0 @@ -5 18 1 1 -0 0 1 -1 0 1 -2 0 1 -4 0 1 -0 1 1 -0 3 1 -1 1 1 -2 1 1 -4 1 1 -1 3 1 -1 4 1 -2 2 1 -3 2 1 -2 3 1 -2 4 1 -3 3 1 -4 3 1 -4 4 1 -1 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat19.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat19.txt deleted file mode 100644 index fcf060f6..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat19.txt +++ /dev/null @@ -1,43 +0,0 @@ -7 29 0 4 -0 0 1 -1 0 1 -2 0 1 -0 2 1 -0 4 1 -0 5 1 -0 6 1 -1 1 1 -2 1 1 -3 1 1 -5 1 1 -1 4 1 -1 6 1 -2 2 1 -4 2 1 -6 2 1 -2 4 1 -3 3 1 -4 3 1 -6 3 1 -3 5 1 -4 4 1 -5 4 1 -6 4 1 -4 5 0 -4 6 1 -5 5 1 -5 6 1 -6 6 1 -0 1 -1 1 -4 1 -5 1 - -# frame matrix = -1 0 1 0 1 1 1 1 -1 1 0 0 1 0 1 1 -1 1 1 0 1 0 0 0 -0 1 0 1 0 1 0 0 -0 0 1 1 1 0 1 1 -0 1 0 0 1 1 1 1 -0 0 1 1 1 0 1 0 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat2.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat2.txt deleted file mode 100644 index bbc5da62..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat2.txt +++ /dev/null @@ -1,28 +0,0 @@ -6 25 1 2 -0 0 1 -1 0 1 -2 0 1 -3 0 1 -4 0 0 -5 0 0 -0 1 1 -1 1 1 -4 1 0 -5 1 1 -1 2 1 -1 4 1 -1 5 1 -2 2 1 -3 2 1 -4 2 0 -5 2 0 -2 3 1 -3 3 1 -4 3 1 -5 3 1 -3 5 1 -4 4 1 -5 4 1 -5 5 1 -1 1 -3 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat20.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat20.txt deleted file mode 100644 index 659a1ca0..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat20.txt +++ /dev/null @@ -1,40 +0,0 @@ -8 35 4 4 -0 0 1 -3 0 1 -6 0 1 -0 2 1 -0 4 1 -0 5 1 -1 1 1 -3 1 1 -7 1 1 -1 2 1 -1 4 1 -1 6 1 -1 7 1 -2 2 1 -5 2 1 -6 2 1 -2 4 1 -2 5 1 -2 7 1 -3 3 1 -6 3 1 -3 5 1 -4 4 1 -5 4 1 -6 4 1 -7 4 1 -4 7 1 -5 5 1 -6 5 1 -7 5 1 -5 6 1 -6 6 1 -7 6 1 -6 7 1 -7 7 1 -2 1 -4 1 -5 1 -7 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat21.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat21.txt deleted file mode 100644 index 35f82b96..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat21.txt +++ /dev/null @@ -1,80 +0,0 @@ -11 74 4 5 -0 0 1 -1 0 1 -4 0 1 -5 0 1 -6 0 1 -7 0 1 -8 0 1 -10 0 1 -0 1 1 -0 2 1 -0 3 1 -0 4 1 -0 6 1 -0 7 1 -0 8 1 -1 1 1 -2 1 1 -3 1 1 -4 1 1 -5 1 1 -8 1 1 -1 3 1 -1 5 1 -1 6 1 -1 7 1 -1 8 1 -1 10 1 -2 2 1 -4 2 1 -5 2 1 -8 2 1 -10 2 1 -2 5 1 -2 7 1 -2 10 1 -3 3 1 -6 3 1 -7 3 1 -10 3 1 -3 4 1 -3 7 1 -3 10 1 -4 4 1 -5 4 1 -9 4 1 -10 4 1 -4 5 1 -4 7 1 -4 10 1 -5 5 1 -6 5 1 -7 5 1 -8 5 1 -9 5 1 -5 6 1 -5 8 1 -5 10 1 -6 6 1 -8 6 1 -9 6 1 -10 6 1 -6 9 1 -6 10 1 -7 7 1 -8 7 1 -10 7 1 -7 8 1 -7 9 1 -8 8 1 -8 9 1 -9 9 1 -10 9 1 -9 10 1 -10 10 1 -1 1 -3 1 -4 1 -9 1 -10 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat22.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat22.txt deleted file mode 100644 index ce742c6b..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat22.txt +++ /dev/null @@ -1,19 +0,0 @@ -5 13 2 5 -0 0 1 -3 0 1 -0 2 1 -0 3 1 -0 4 1 -1 1 1 -2 1 1 -1 4 1 -2 2 1 -2 4 1 -3 3 1 -3 4 1 -4 4 1 -0 1 -1 1 -2 1 -3 1 -4 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat23.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat23.txt deleted file mode 100644 index a3d52e36..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat23.txt +++ /dev/null @@ -1,7 +0,0 @@ -3 5 0 1 -0 0 1 -0 2 1 -1 1 1 -1 2 1 -2 2 1 -2 2 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat24.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat24.txt deleted file mode 100644 index e89f8f78..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat24.txt +++ /dev/null @@ -1,9 +0,0 @@ -4 7 0 1 -0 0 1 -0 1 1 -1 1 1 -3 1 1 -1 2 1 -2 2 1 -3 3 1 -3 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat25.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat25.txt deleted file mode 100644 index 7e2dcf03..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat25.txt +++ /dev/null @@ -1,43 +0,0 @@ -7 29 0 4 -0 0 1 -1 0 1 -2 0 1 -0 2 1 -0 4 1 -0 5 1 -0 6 1 -1 1 1 -2 1 1 -3 1 1 -5 1 1 -1 4 1 -1 6 1 -2 2 1 -4 2 1 -6 2 1 -2 4 1 -3 3 1 -4 3 1 -6 3 1 -3 5 1 -4 4 1 -5 4 1 -6 4 1 -4 5 1 -4 6 1 -5 5 1 -5 6 1 -6 6 1 -0 1 -1 1 -4 1 -5 1 - -# frame matrix = -1 0 1 0 1 1 1 1 -1 1 0 0 1 0 1 1 -1 1 1 0 1 0 0 0 -0 1 0 1 0 1 0 0 -0 0 1 1 1 1 1 1 -0 1 0 0 1 1 1 1 -0 0 1 1 1 0 1 0 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat26.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat26.txt deleted file mode 100644 index d23d4ac0..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat26.txt +++ /dev/null @@ -1,9 +0,0 @@ -4 7 0 0 -0 0 1 -0 1 1 -1 1 1 -3 1 1 -1 2 1 -2 2 1 -3 3 1 - diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat3.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat3.txt deleted file mode 100644 index 056498be..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat3.txt +++ /dev/null @@ -1,248 +0,0 @@ -18 241 4 6 -0 0 1 -1 0 1 -2 0 0 -3 0 1 -4 0 1 -5 0 0 -6 0 1 -7 0 0 -8 0 0 -9 0 0 -10 0 1 -11 0 1 -12 0 1 -13 0 1 -14 0 0 -15 0 0 -16 0 0 -17 0 0 -0 1 1 -0 4 1 -0 5 1 -0 8 1 -0 12 1 -0 13 1 -0 15 1 -1 1 1 -2 1 0 -3 1 1 -4 1 0 -5 1 1 -6 1 1 -7 1 0 -8 1 1 -9 1 0 -10 1 0 -11 1 1 -12 1 1 -13 1 0 -14 1 0 -15 1 1 -16 1 1 -17 1 0 -1 3 1 -1 5 1 -1 8 1 -1 9 1 -1 10 1 -1 13 1 -1 14 1 -1 15 1 -1 17 1 -2 2 1 -3 2 1 -4 2 0 -5 2 1 -6 2 1 -8 2 0 -9 2 0 -10 2 1 -11 2 1 -12 2 1 -13 2 0 -14 2 0 -15 2 1 -16 2 1 -17 2 1 -2 4 1 -2 5 1 -2 6 1 -2 8 1 -2 11 1 -2 12 1 -2 16 1 -2 17 1 -3 3 1 -4 3 0 -5 3 1 -6 3 1 -7 3 1 -8 3 0 -9 3 1 -10 3 0 -11 3 0 -12 3 1 -13 3 1 -14 3 0 -15 3 1 -16 3 0 -17 3 1 -3 4 1 -3 6 1 -3 10 1 -3 12 1 -3 16 1 -3 17 1 -4 4 1 -5 4 1 -6 4 1 -7 4 1 -8 4 0 -9 4 0 -10 4 1 -11 4 1 -12 4 0 -13 4 1 -14 4 1 -15 4 0 -16 4 1 -17 4 0 -4 5 1 -4 6 1 -4 8 1 -4 10 1 -4 11 1 -4 12 1 -4 13 1 -4 15 1 -4 16 1 -5 5 1 -6 5 0 -7 5 0 -8 5 0 -9 5 0 -10 5 0 -11 5 1 -12 5 0 -13 5 0 -14 5 1 -15 5 1 -16 5 1 -17 5 0 -5 6 1 -5 7 1 -5 8 1 -5 10 1 -5 13 1 -5 16 1 -6 6 1 -7 6 0 -8 6 0 -9 6 0 -10 6 1 -11 6 0 -12 6 0 -13 6 0 -14 6 0 -15 6 0 -16 6 1 -17 6 1 -6 9 1 -6 10 1 -6 12 1 -6 14 1 -6 15 1 -7 7 1 -8 7 1 -9 7 1 -10 7 1 -11 7 1 -12 7 0 -13 7 1 -15 7 0 -16 7 1 -17 7 1 -7 13 1 -7 14 1 -7 15 1 -7 16 1 -7 17 1 -8 8 1 -9 8 1 -10 8 0 -11 8 1 -12 8 0 -13 8 0 -14 8 0 -16 8 1 -17 8 1 -8 12 1 -8 13 1 -9 9 1 -10 9 0 -11 9 0 -12 9 1 -13 9 0 -14 9 1 -15 9 0 -16 9 0 -17 9 1 -9 10 1 -9 16 1 -9 17 1 -10 10 1 -11 10 0 -12 10 1 -13 10 1 -14 10 1 -15 10 1 -16 10 0 -17 10 1 -10 12 1 -10 13 1 -10 16 1 -10 17 1 -11 11 1 -12 11 1 -13 11 1 -14 11 1 -15 11 1 -16 11 1 -17 11 1 -11 12 1 -11 14 1 -11 16 1 -12 12 1 -13 12 1 -14 12 1 -15 12 0 -16 12 1 -17 12 1 -12 15 1 -12 16 1 -12 17 1 -13 13 1 -14 13 0 -15 13 0 -16 13 0 -17 13 0 -13 15 1 -14 14 1 -16 14 1 -17 14 0 -14 16 1 -14 17 1 -15 15 1 -16 15 1 -17 15 1 -16 16 1 -17 16 0 -16 17 1 -17 17 1 -2 1 -3 1 -4 1 -7 1 -12 1 -13 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat4.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat4.txt deleted file mode 100644 index 3f62ca1c..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat4.txt +++ /dev/null @@ -1,9 +0,0 @@ -4 6 0 2 -0 0 1 -0 3 1 -1 1 1 -1 3 1 -2 2 1 -3 3 1 -0 1 -3 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat5.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat5.txt deleted file mode 100644 index e474d2a2..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat5.txt +++ /dev/null @@ -1,7 +0,0 @@ -4 5 0 1 -0 0 1 -0 3 1 -1 1 1 -2 2 1 -3 3 1 -3 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat6.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat6.txt deleted file mode 100644 index 2ca5287c..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat6.txt +++ /dev/null @@ -1,15 +0,0 @@ -5 12 0 2 -0 0 1 -0 3 1 -0 4 1 -2 0 1 -1 1 1 -1 4 1 -2 2 1 -2 3 -1 -2 4 1 -3 3 1 -3 4 1 -4 4 1 -0 1 -1 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat7.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat7.txt deleted file mode 100644 index 6b64d272..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat7.txt +++ /dev/null @@ -1,11 +0,0 @@ -4 6 0 3 -0 0 1 -0 2 1 -1 1 1 -2 2 1 -2 3 1 -3 3 1 -0 1 -1 1 -3 1 - diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat8.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat8.txt deleted file mode 100644 index 7264bf31..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat8.txt +++ /dev/null @@ -1,15 +0,0 @@ -5 11 0 3 -0 0 1 -0 4 1 -2 0 1 -1 1 1 -2 2 1 -2 3 1 -3 2 1 -4 2 1 -3 3 1 -3 4 0 -4 4 1 -1 1 -3 1 -4 1 diff --git a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat9.txt b/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat9.txt deleted file mode 100644 index b50929c9..00000000 --- a/SPEX/Tcov/Mats4Tcov/SPEX_Update/mat9.txt +++ /dev/null @@ -1,27 +0,0 @@ -6 21 4 5 -0 0 1 -2 0 1 -4 0 1 -5 0 1 -0 3 1 -0 4 1 -1 1 1 -2 1 1 -4 1 1 -2 2 1 -4 2 1 -5 2 1 -2 4 1 -2 5 1 -3 3 1 -5 3 1 -3 4 1 -4 4 1 -5 4 1 -4 5 1 -5 5 1 -0 1 -1 1 -2 1 -3 1 -4 1 diff --git a/SPEX/Tcov/simple_rand.c b/SPEX/Tcov/simple_rand.c index c61c65a4..6902ec3f 100644 --- a/SPEX/Tcov/simple_rand.c +++ b/SPEX/Tcov/simple_rand.c @@ -2,8 +2,8 @@ // SPEX/Tcov/simple_rand.c: a very simple random number generator // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Tcov/simple_rand.h b/SPEX/Tcov/simple_rand.h index ba362469..f6c1cb01 100644 --- a/SPEX/Tcov/simple_rand.h +++ b/SPEX/Tcov/simple_rand.h @@ -2,8 +2,8 @@ // SPEX/Tcov/simple_rand.h: a very simple random number generator // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Tcov/tcov_for_cholesky.c b/SPEX/Tcov/tcov_for_cholesky.c index 3d4f7748..9721cf76 100644 --- a/SPEX/Tcov/tcov_for_cholesky.c +++ b/SPEX/Tcov/tcov_for_cholesky.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_for_cholesky.c: test coverage for SPEX_Cholesky // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -34,8 +34,6 @@ // BRUTAL: test a method with debug malloc, until it succeeds //------------------------------------------------------------------------------ -// The method must return a bool (true if successful, false if failure). - #define NTRIAL_MAX 10000 #define BRUTAL(method) \ @@ -49,7 +47,7 @@ if (info2 != SPEX_OUT_OF_MEMORY) break ; \ } \ if (info2 != SPEX_OK) TEST_ABORT (info2) ; \ - malloc_count = INT64_MAX ; \ + malloc_count = INT64_MAX ; \ printf ("\nBrutal Cholesky trials %ld: tests passed\n", trial); \ } @@ -122,8 +120,8 @@ SPEX_info spex_test_chol_backslash (SPEX_matrix A, SPEX_matrix b, #undef SPEX_FREE_ALL #define SPEX_FREE_ALL \ { \ - SPEX_MPZ_CLEAR(q1); \ - SPEX_MPZ_CLEAR(r1); \ + SPEX_mpz_clear (q1); \ + SPEX_mpz_clear (r1); \ } SPEX_info spex_test_cdiv_qr (mpz_t n, mpz_t d) ; @@ -132,8 +130,8 @@ SPEX_info spex_test_cdiv_qr (mpz_t n, mpz_t d) { //SPEX_info info ; mpz_t q1, r1; - SPEX_MPZ_SET_NULL(q1); - SPEX_MPZ_SET_NULL(r1); + SPEX_mpz_set_null (q1); + SPEX_mpz_set_null (r1); OK2 (SPEX_mpz_init2(q1,1)); OK2 (SPEX_mpz_init2(r1,1)); @@ -319,20 +317,27 @@ int main (int argc, char *argv []) //-------------------------------------------------------------------------- // test spex_expand_mpfr_array //-------------------------------------------------------------------------- + //create mpfr array where all elements are multiples of 220 mpfr_rnd_t round = SPEX_OPTION_ROUND (option); mpfr_t* x_mpfr = spex_create_mpfr_array (3, option); mpz_t* x_mpz = spex_create_mpz_array (3); mpq_t x_scale; - OK (spex_create_mpq (x_scale)); + SPEX_MPQ_INIT (x_scale) ; + SPEX_MPQ_SET_UI (x_scale, 1, 10); for (int64_t k = 0 ; k < 3 ; k++) { SPEX_MPFR_SET_SI( x_mpfr[k],(k+2)*220, round); } - + OK ( spex_expand_mpfr_array (x_mpz, x_mpfr, x_scale, 3, option)); - + + // free x_mpz, x_mpfr, and x_scale + spex_free_mpz_array (&x_mpz, 3) ; + spex_free_mpfr_array (&x_mpfr, 3) ; + SPEX_mpq_clear (x_scale) ; + //-------------------------------------------------------------------------- // missing gmp coverage //-------------------------------------------------------------------------- @@ -404,18 +409,19 @@ int main (int argc, char *argv []) ERR(SPEX_mpz_divexact(gmp_x,gmp_y,gmp_0),SPEX_PANIC); //Free - SPEX_MPZ_CLEAR(gmp_x); - SPEX_MPZ_CLEAR(gmp_y); - SPEX_MPQ_CLEAR(gmp_a); - SPEX_MPQ_CLEAR(gmp_b); - SPEX_MPQ_CLEAR(gmp_c); - SPEX_MPFR_CLEAR(gmp_e); - SPEX_MPFR_CLEAR(gmp_f); - SPEX_MPFR_CLEAR(gmp_g); - SPEX_MPFR_CLEAR(gmp_h); - SPEX_MPZ_CLEAR(gmp_n); - SPEX_MPZ_CLEAR(gmp_d); - SPEX_MPZ_CLEAR(tmpz); + SPEX_mpz_clear (gmp_x); + SPEX_mpz_clear (gmp_0); + SPEX_mpz_clear (gmp_y); + SPEX_mpq_clear (gmp_a); + SPEX_mpq_clear (gmp_b); + SPEX_mpq_clear (gmp_c); + SPEX_mpfr_clear (gmp_e); + SPEX_mpfr_clear (gmp_f); + SPEX_mpfr_clear (gmp_g); + SPEX_mpfr_clear (gmp_h); + SPEX_mpz_clear (gmp_n); + SPEX_mpz_clear (gmp_d); + SPEX_mpz_clear (tmpz); //-------------------------------------------------------------------------- // error handling @@ -556,6 +562,7 @@ int main (int argc, char *argv []) SPEX_PANIC); spex_set_initialized (true); SPEX_FREE_ALL; + SPEX_finalize ( ) ; printf ("%s: all tests passed\n\n", __FILE__); fprintf (stderr, "%s: all tests passed\n\n", __FILE__); diff --git a/SPEX/Tcov/tcov_for_lu.c b/SPEX/Tcov/tcov_for_lu.c index d967ac74..8cd13cb3 100644 --- a/SPEX/Tcov/tcov_for_lu.c +++ b/SPEX/Tcov/tcov_for_lu.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_for_lu.c: test coverage for SPEX_LU // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -263,11 +263,6 @@ int main ( int argc, char *argv[]) Ab_type, malloc_count); } - /*mpz_t mpz1, mpz2, mpz3; - SPEX_MPZ_SET_NULL(mpz1); - SPEX_MPZ_SET_NULL(mpz2); - SPEX_MPZ_SET_NULL(mpz3);*/ - int64_t n=4, numRHS=1, j, nz=11; //------------------------------------------------------------------ diff --git a/SPEX/Tcov/tcov_for_lu2.c b/SPEX/Tcov/tcov_for_lu2.c index 673aeb36..af4abec6 100644 --- a/SPEX/Tcov/tcov_for_lu2.c +++ b/SPEX/Tcov/tcov_for_lu2.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_for_lu2.c: test coverage for SPEX_Cholesky // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -127,8 +127,7 @@ int main (int argc, char *argv []) malloc_count = INT64_MAX ; OK (SPEX_create_default_options (&option)); - - + //-------------------------------------------------------------------------- // load the test matrix and create the right-hand-side //-------------------------------------------------------------------------- @@ -141,8 +140,7 @@ int main (int argc, char *argv []) printf ("\nInput matrix: %ld-by-%ld with %ld entries\n", n, m, anz); OK ((n != m) ? SPEX_PANIC : SPEX_OK); create_test_rhs (&b, A->n); - - + //TESTS option->pivot = SPEX_TOL_LARGEST; option->order = SPEX_AMD ; @@ -150,14 +148,14 @@ int main (int argc, char *argv []) printf ("LU backslash, AMD ordering, no malloc testing:\n"); OK (spex_test_lu_backslash (A, b, option)); option->print_level = 0 ; - + option->pivot = SPEX_FIRST_NONZERO ; option->order = SPEX_COLAMD ; option->print_level = 3 ; printf ("LU backslash, AMD ordering, no malloc testing:\n"); OK (spex_test_lu_backslash (A, b, option)); option->print_level = 0 ; - + option->pivot = SPEX_TOL_SMALLEST ; option->tol = 0; option->order = SPEX_COLAMD ; @@ -168,16 +166,21 @@ int main (int argc, char *argv []) OK (SPEX_matrix_free (&A, option)); OK (SPEX_matrix_free (&b, option)); - + option->order = SPEX_AMD ; read_test_matrix (&A, "../ExampleMats/test1.mat.txt"); OK (SPEX_lu_analyze( &S, A, option)); OK (SPEX_symbolic_analysis_free(&S, option)); OK (SPEX_matrix_free (&A, option)); - + read_test_matrix (&A, "../ExampleMats/test5.mat.txt"); - SPEX_lu_analyze( &S, A, option); - + SPEX_lu_analyze( &S, A, option); + SPEX_FREE_ALL; - + OK (SPEX_finalize ( )) ; + SPEX_FREE (option) ; + + printf ("%s: all tests passed\n\n", __FILE__); + fprintf (stderr, "%s: all tests passed\n\n", __FILE__); + return (0) ; } diff --git a/SPEX/Tcov/tcov_for_other.c b/SPEX/Tcov/tcov_for_other.c new file mode 100644 index 00000000..b0f9b08e --- /dev/null +++ b/SPEX/Tcov/tcov_for_other.c @@ -0,0 +1,104 @@ +// ---------------------------------------------------------------------------- +// SPEX/Tcov/tcov_for_other.c: test coverage for other methods +// ---------------------------------------------------------------------------- + +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//----------------------------------------------------------------------------- + +#include "tcov_utilities.h" +#include "spex_demos.h" + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL ; + +//------------------------------------------------------------------------------ +// ERR: test wrapper for SPEX_* function when expected error would produce +//------------------------------------------------------------------------------ + +#define ERR(method,expected_error) \ +{ \ + SPEX_info info5 = (method) ; \ + if (info5 != expected_error) \ + { \ + printf ("SPEX method was expected to fail, but succeeded!\n") ; \ + printf ("this error was expected:\n") ; \ + SPEX_PRINT_INFO (expected_error) ; \ + printf ("but this error was obtained:\n") ; \ + TEST_ABORT (info5) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// BRUTAL: test a method with debug malloc, until it succeeds +//------------------------------------------------------------------------------ + +#define NTRIAL_MAX 10000 + +#define BRUTAL(method) \ +{ \ + int64_t trial = 0 ; \ + SPEX_info info2 = SPEX_OK ; \ + for (trial = 0 ; trial <= NTRIAL_MAX ; trial++) \ + { \ + malloc_count = trial ; \ + info2 = (method) ; \ + if (info2 != SPEX_OUT_OF_MEMORY) break ; \ + } \ + if (info2 != SPEX_OK) TEST_ABORT (info2) ; \ + malloc_count = INT64_MAX ; \ +} + +//------------------------------------------------------------------------------ +// test program +//------------------------------------------------------------------------------ + +int main (int argc, char *argv []) +{ + + //-------------------------------------------------------------------------- + // start SPEX + //-------------------------------------------------------------------------- + + SPEX_options option = NULL ; + + OK (SPEX_initialize_expert (tcov_malloc, tcov_calloc, tcov_realloc, + tcov_free)) ; + + // disable malloc testing for the first part of the test + spex_set_gmp_ntrials (INT64_MAX) ; + malloc_count = INT64_MAX ; + + OK (SPEX_create_default_options (&option)) ; + + //-------------------------------------------------------------------------- + // basic tests of mpfr methods + //-------------------------------------------------------------------------- + + mpfr_t x ; + printf ("MPFR_PREC_MAX: %g\n", (double) MPFR_PREC_MAX) ; + ERR (SPEX_mpfr_init2 (x, MPFR_PREC_MAX), SPEX_PANIC) ; + BRUTAL (SPEX_mpfr_init2 (x, 4)) ; + ERR (SPEX_mpfr_set_prec (x, MPFR_PREC_MAX), SPEX_PANIC) ; + for (uint64_t k = 4 ; k < 32*1024 ; k = k*2) + { + BRUTAL (SPEX_mpfr_set_prec (x, k)) ; + } + OK (SPEX_mpfr_clear (x)) ; + + //-------------------------------------------------------------------------- + // finalize the tests + //-------------------------------------------------------------------------- + + SPEX_FREE_ALL ; + OK (SPEX_finalize ( )) ; + SPEX_FREE (option) ; + + printf ("%s: all tests passed\n\n", __FILE__) ; + fprintf (stderr, "%s: all tests passed\n\n", __FILE__) ; + return (0) ; +} + diff --git a/SPEX/Tcov/tcov_utilities.c b/SPEX/Tcov/tcov_utilities.c index 6c3ee5f1..c257d8d8 100644 --- a/SPEX/Tcov/tcov_utilities.c +++ b/SPEX/Tcov/tcov_utilities.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_utilities.c: utility functions for tcov tests // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -109,13 +109,13 @@ int spex_gmp_realloc_test /* Purpose: Given a solution vector x, check the solution of the linear system * Ax = b. This is done by computing a rational-arthmetic A*x == b. This * function is provided here only used for debugging purposes, as the routines - * within SPEX are gauranteed to be exact. + * within SPEX are guaranteed to be exact. */ #undef SPEX_FREE_ALL -#define SPEX_FREE_ALL \ - SPEX_MPQ_CLEAR(temp); \ - SPEX_MPQ_CLEAR(scale); \ +#define SPEX_FREE_ALL \ + SPEX_mpq_clear (temp); \ + SPEX_mpq_clear (scale); \ SPEX_matrix_free(&b2, NULL); SPEX_info spex_check_solution @@ -146,8 +146,8 @@ SPEX_info spex_check_solution int64_t p, j, i ; SPEX_matrix b2 = NULL; // b2 stores the solution of A*x - mpq_t temp; SPEX_MPQ_SET_NULL(temp); - mpq_t scale; SPEX_MPQ_SET_NULL(scale); + mpq_t temp; SPEX_mpq_set_null (temp); + mpq_t scale; SPEX_mpq_set_null (scale); SPEX_MPQ_INIT(temp); SPEX_MPQ_INIT(scale); diff --git a/SPEX/Tcov/tcov_utilities.h b/SPEX/Tcov/tcov_utilities.h index c1615b42..af23bdd5 100644 --- a/SPEX/Tcov/tcov_utilities.h +++ b/SPEX/Tcov/tcov_utilities.h @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_utilities.h: utilities for tcov tests // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/cmake_modules/FindGMP.cmake b/SPEX/cmake_modules/FindGMP.cmake index 2fa7773c..bd4a224f 100644 --- a/SPEX/cmake_modules/FindGMP.cmake +++ b/SPEX/cmake_modules/FindGMP.cmake @@ -4,7 +4,7 @@ # The following copyright and license applies to just this file only, not to # the library itself: -# FindGMP.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. +# FindGMP.cmake, Copyright (c) 2022-2024, Timothy A. Davis. All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- @@ -27,7 +27,7 @@ if ( DEFINED ENV{CMAKE_PREFIX_PATH} ) # import CMAKE_PREFIX_PATH, typically created by spack - set ( CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) + list ( APPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) endif ( ) # include files for gmp diff --git a/SPEX/cmake_modules/FindMPFR.cmake b/SPEX/cmake_modules/FindMPFR.cmake index fae9cb25..c5a3e037 100644 --- a/SPEX/cmake_modules/FindMPFR.cmake +++ b/SPEX/cmake_modules/FindMPFR.cmake @@ -4,7 +4,7 @@ # The following copyright and license applies to just this file only, not to # the library itself: -# FindMPFR.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. +# FindMPFR.cmake, Copyright (c) 2022-2024, Timothy A. Davis. All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- @@ -27,7 +27,7 @@ if ( DEFINED ENV{CMAKE_PREFIX_PATH} ) # import CMAKE_PREFIX_PATH, typically created by spack - set ( CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) + list ( APPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) endif ( ) # include files for mpfr diff --git a/SPEX/cmake_modules/FindSPEX.cmake b/SPEX/cmake_modules/FindSPEX.cmake deleted file mode 100644 index 8e4509f8..00000000 --- a/SPEX/cmake_modules/FindSPEX.cmake +++ /dev/null @@ -1,114 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/SPEX/cmake_modules/FindSPEX.cmake -#------------------------------------------------------------------------------- - -# The following copyright and license applies to just this file only, not to -# the library itself: -# FindSPEX.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# Finds the SPEX include file and compiled library and sets: - -# SPEX_INCLUDE_DIR - where to find SPEX.h -# SPEX_LIBRARY - dynamic SPEX library -# SPEX_STATIC - static SPEX library -# SPEX_LIBRARIES - libraries when using SPEX -# SPEX_FOUND - true if SPEX found - -# set ``SPEX_ROOT`` to a SPEX installation root to -# tell this module where to look. - -# All the Find*.cmake files in SuiteSparse are installed by 'make install' into -# /usr/local/lib/cmake/SuiteSparse (where '/usr/local' is the -# ${CMAKE_INSTALL_PREFIX}). To access this file, place the following commands -# in your CMakeLists.txt file. See also SuiteSparse/Example/CMakeLists.txt: -# -# set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} -# ${CMAKE_INSTALL_PREFIX}/lib/cmake/SuiteSparse ) - -#------------------------------------------------------------------------------- - -# include files for SPEX -find_path ( SPEX_INCLUDE_DIR - NAMES SPEX.h - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SPEX - HINTS ${CMAKE_SOURCE_DIR}/../SPEX - PATH_SUFFIXES include Include -) - -# dynamic SPEX library -find_library ( SPEX_LIBRARY - NAMES spex - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SPEX - HINTS ${CMAKE_SOURCE_DIR}/../SPEX - PATH_SUFFIXES lib build -) - -if ( MSVC ) - set ( STATIC_SUFFIX .lib ) -else ( ) - set ( STATIC_SUFFIX .a ) -endif ( ) - -# static SPEX library -set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) -set ( CMAKE_FIND_LIBRARY_SUFFIXES ${STATIC_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) -find_library ( SPEX_STATIC - NAMES spex - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SPEX - HINTS ${CMAKE_SOURCE_DIR}/../SPEX - PATH_SUFFIXES lib build -) -set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) - -# get version of the library from the dynamic library name -get_filename_component ( SPEX_LIBRARY ${SPEX_LIBRARY} REALPATH ) -get_filename_component ( SPEX_FILENAME ${SPEX_LIBRARY} NAME ) -string ( - REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" - SPEX_VERSION - ${SPEX_FILENAME} -) - -if ( NOT SPEX_VERSION ) - # if the version does not appear in the filename, read the include file - foreach ( _VERSION MAIN_VERSION SUB_VERSION SUBSUB_VERSION ) - file ( STRINGS ${SPEX_INCLUDE_DIR}/SPEX.h _VERSION_LINE REGEX "define[ ]+SPEX_${_VERSION}" ) - if ( _VERSION_LINE ) - string ( REGEX REPLACE ".*define[ ]+SPEX_${_VERSION}[ ]+([0-9]*).*" "\\1" _SPEX_${_VERSION} "${_VERSION_LINE}" ) - endif ( ) - unset ( _VERSION_LINE ) - endforeach ( ) - set ( SPEX_VERSION "${_SPEX_MAIN_VERSION}.${_SPEX_SUB_VERSION}.${_SPEX_SUBSUB_VERSION}" ) -endif ( ) - -set ( SPEX_LIBRARIES ${SPEX_LIBRARY} ) - -include (FindPackageHandleStandardArgs) - -find_package_handle_standard_args ( SPEX - REQUIRED_VARS SPEX_LIBRARIES SPEX_INCLUDE_DIR - VERSION_VAR SPEX_VERSION -) - -mark_as_advanced ( - SPEX_INCLUDE_DIR - SPEX_LIBRARY - SPEX_STATIC - SPEX_LIBRARIES -) - -if ( SPEX_FOUND ) - message ( STATUS "SPEX version: ${SPEX_VERSION}" ) - message ( STATUS "SPEX include: ${SPEX_INCLUDE_DIR}" ) - message ( STATUS "SPEX library: ${SPEX_LIBRARY}" ) - message ( STATUS "SPEX static: ${SPEX_STATIC}" ) -else ( ) - message ( STATUS "SPEX not found" ) -endif ( ) - diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index 64f6695a..02250c98 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -10,30 +10,42 @@ # get the version #------------------------------------------------------------------------------- -# cmake 3.22 is required to find the BLAS +# cmake 3.22 is required to find BLAS/LAPACK for UMFPACK, CHOLMOD, SPQR, +# and ParU: cmake_minimum_required ( VERSION 3.22 ) # version of both SuiteSparse and SuiteSparse_config -set ( SUITESPARSE_DATE "Mar FIXME, 2023" ) +set ( SUITESPARSE_DATE "Mar 22, 2024" ) set ( SUITESPARSE_VERSION_MAJOR 7 ) -set ( SUITESPARSE_VERSION_MINOR 1 ) +set ( SUITESPARSE_VERSION_MINOR 7 ) set ( SUITESPARSE_VERSION_SUB 0 ) +set ( SUITESPARSE_CONFIG_VERSION_MAJOR ${SUITESPARSE_VERSION_MAJOR} CACHE STRING "" FORCE ) +set ( SUITESPARSE_CONFIG_VERSION_MINOR ${SUITESPARSE_VERSION_MINOR} CACHE STRING "" FORCE ) +set ( SUITESPARSE_CONFIG_VERSION_PATCH ${SUITESPARSE_VERSION_SUB} CACHE STRING "" FORCE ) message ( STATUS "Building SuiteSparse_config version: v" ${SUITESPARSE_VERSION_MAJOR}. ${SUITESPARSE_VERSION_MINOR}. ${SUITESPARSE_VERSION_SUB} " (" ${SUITESPARSE_DATE} ")" ) +#------------------------------------------------------------------------------- +# define the project +#------------------------------------------------------------------------------- + +project ( SuiteSparseConfig + VERSION "${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB}" + LANGUAGES C ) + #------------------------------------------------------------------------------- # SuiteSparse policies #------------------------------------------------------------------------------- set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${CMAKE_SOURCE_DIR}/cmake_modules ) + ${PROJECT_SOURCE_DIR}/cmake_modules ) include ( SuiteSparsePolicy ) -if ( NOT NFORTRAN ) +if ( SUITESPARSE_HAS_FORTRAN ) include ( FortranCInterface ) else ( ) # No Fortran compiler available or enabled, configuration is not automatic. @@ -41,26 +53,72 @@ else ( ) set ( FortranCInterface_GLOBAL__MACRO ${SUITESPARSE_C_TO_FORTRAN} ) endif ( ) +message ( STATUS "C to Fortran calling protocol: ") +message ( STATUS " SUITESPARSE_HAS_FORTRAN : ${SUITESPARSE_HAS_FORTRAN}" ) +message ( STATUS " FortranCInterface_GLOBAL_MACRO : ${FortranCInterface_GLOBAL_MACRO}" ) +message ( STATUS " FortranCInterface_GLOBAL__MACRO : ${FortranCInterface_GLOBAL__MACRO}" ) + #------------------------------------------------------------------------------- -# define the project +# CUDA warning on Windows with MSVC #------------------------------------------------------------------------------- -project ( suitesparseconfig - VERSION "${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB}" - LANGUAGES C ) +if ( SUITESPARSE_HAS_CUDA AND MSVC ) + message ( WARNING "NOTE: CUDA on MSVC has only recently been revised. It appears to be functional but has not been as rigorously tested as I would like (I have limited resources for testing CUDA on Windows). If you encounter issues, set the cmake option SUITESPARSE_USE_CUDA to OFF and post an issue on GitHub." ) +endif ( ) #------------------------------------------------------------------------------- -# find library dependencies +# find OpenMP #------------------------------------------------------------------------------- -option ( NOPENMP "ON: do not use OpenMP. OFF (default): use OpenMP" off ) -if ( NOPENMP ) +option ( SUITESPARSE_CONFIG_USE_OPENMP "ON: Use OpenMP in SuiteSparse_config if available. OFF: Do not use OpenMP. (Default: SUITESPARSE_USE_OPENMP)" ${SUITESPARSE_USE_OPENMP} ) +if ( SUITESPARSE_CONFIG_USE_OPENMP ) + if ( CMAKE_VERSION VERSION_LESS 3.24 ) + find_package ( OpenMP COMPONENTS C ) + else ( ) + find_package ( OpenMP COMPONENTS C GLOBAL ) + endif ( ) +else ( ) # OpenMP has been disabled - message ( STATUS "OpenMP disabled" ) - set ( OPENMP_FOUND false ) + set ( OpenMP_C_FOUND OFF ) +endif ( ) + +if ( SUITESPARSE_CONFIG_USE_OPENMP AND OpenMP_C_FOUND ) + set ( SUITESPARSE_CONFIG_HAS_OPENMP ON ) else ( ) - find_package ( OpenMP ) + set ( SUITESPARSE_CONFIG_HAS_OPENMP OFF ) endif ( ) +message ( STATUS "SuiteSparse_config has OpenMP: ${SUITESPARSE_CONFIG_HAS_OPENMP}" ) + +# check for strict usage +if ( SUITESPARSE_USE_STRICT AND SUITESPARSE_CONFIG_USE_OPENMP AND NOT SUITESPARSE_CONFIG_HAS_OPENMP ) + message ( FATAL_ERROR "OpenMP required for SuiteSparse_config but not found" ) +endif ( ) + +# check for librt in case of fallback to "clock_gettime" +include ( CheckSymbolExists ) +check_symbol_exists ( clock_gettime "time.h" NO_RT ) +if ( NO_RT ) + message ( STATUS "Using clock_gettime without librt" ) + set ( SUITESPARSE_HAVE_CLOCK_GETTIME ON ) +else ( ) + # check if we need to link to librt for that function + set ( _orig_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ) + list ( APPEND CMAKE_REQUIRED_LIBRARIES "rt" ) + check_symbol_exists ( clock_gettime "time.h" WITH_RT ) + set ( CMAKE_REQUIRED_LIBRARIES ${_orig_CMAKE_REQUIRED_LIBRARIES} ) + if ( WITH_RT ) + message ( STATUS "Using clock_gettime with librt" ) + set ( SUITESPARSE_HAVE_CLOCK_GETTIME ON ) + endif ( ) +endif ( ) + +if ( NOT SUITESPARSE_CONFIG_USE_OPENMP AND NOT SUITESPARSE_HAVE_CLOCK_GETTIME ) + message ( STATUS "No OpenMP and no clock_gettime available. Timing functions won't work." ) +endif ( ) + +#------------------------------------------------------------------------------- +# find the BLAS +#------------------------------------------------------------------------------- include ( SuiteSparseBLAS ) @@ -77,38 +135,57 @@ configure_file ( "Config/SuiteSparse_config.h.in" # NEWLINE_STYLE LF ) #------------------------------------------------------------------------------- -# dynamic suitesparseconfig library properties +# dynamic SuiteSparseConfig library properties #------------------------------------------------------------------------------- file ( GLOB SUITESPARSECONFIG_SOURCES "*.c" ) -add_library ( suitesparseconfig SHARED ${SUITESPARSECONFIG_SOURCES} ) -set_target_properties ( suitesparseconfig PROPERTIES - VERSION ${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB} - C_STANDARD 11 - C_STANDARD_REQUIRED ON - SOVERSION ${SUITESPARSE_VERSION_MAJOR} - PUBLIC_HEADER "SuiteSparse_config.h" - WINDOWS_EXPORT_ALL_SYMBOLS ON ) +if ( BUILD_SHARED_LIBS ) + add_library ( SuiteSparseConfig SHARED ${SUITESPARSECONFIG_SOURCES} ) + + set_target_properties ( SuiteSparseConfig PROPERTIES + VERSION ${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB} + C_STANDARD 11 + C_STANDARD_REQUIRED ON + OUTPUT_NAME suitesparseconfig + SOVERSION ${SUITESPARSE_VERSION_MAJOR} + PUBLIC_HEADER "SuiteSparse_config.h" + WINDOWS_EXPORT_ALL_SYMBOLS ON ) + + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) + set_target_properties ( SuiteSparseConfig PROPERTIES EXPORT_NO_SYSTEM ON ) + endif ( ) + + target_include_directories ( SuiteSparseConfig + INTERFACE $ + $ ) +endif ( ) #------------------------------------------------------------------------------- -# static suitesparseconfig library properties +# static SuiteSparseConfig library properties #------------------------------------------------------------------------------- -if ( NOT NSTATIC ) - add_library ( suitesparseconfig_static STATIC ${SUITESPARSECONFIG_SOURCES} ) +if ( BUILD_STATIC_LIBS ) + add_library ( SuiteSparseConfig_static STATIC ${SUITESPARSECONFIG_SOURCES} ) - set_target_properties ( suitesparseconfig_static PROPERTIES - VERSION ${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB} + set_target_properties ( SuiteSparseConfig_static PROPERTIES C_STANDARD 11 C_STANDARD_REQUIRED ON OUTPUT_NAME suitesparseconfig - SOVERSION ${SUITESPARSE_VERSION_MAJOR} ) + PUBLIC_HEADER "SuiteSparse_config.h" ) - if ( MSVC ) - set_target_properties ( suitesparseconfig_static PROPERTIES + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) + set_target_properties ( SuiteSparseConfig_static PROPERTIES OUTPUT_NAME suitesparseconfig_static ) endif ( ) + + if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) + set_target_properties ( SuiteSparseConfig_static PROPERTIES EXPORT_NO_SYSTEM ON ) + endif ( ) + + target_include_directories ( SuiteSparseConfig_static + INTERFACE $ + $ ) endif ( ) #------------------------------------------------------------------------------- @@ -116,24 +193,45 @@ endif ( ) #------------------------------------------------------------------------------- # libm: -if ( NOT WIN32 ) - target_link_libraries ( suitesparseconfig PUBLIC m ) - if ( NOT NSTATIC ) - target_link_libraries ( suitesparseconfig_static PUBLIC m ) +include ( CheckSymbolExists ) +check_symbol_exists ( fmax "math.h" NO_LIBM ) +if ( NOT NO_LIBM ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SuiteSparseConfig PRIVATE m ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + target_link_libraries ( SuiteSparseConfig_static PUBLIC m ) + list ( APPEND SUITESPARSE_CONFIG_STATIC_LIBS "m" ) endif ( ) endif ( ) # OpenMP: -if ( OPENMP_FOUND ) +if ( SUITESPARSE_CONFIG_HAS_OPENMP ) message ( STATUS "OpenMP C libraries: ${OpenMP_C_LIBRARIES} ") message ( STATUS "OpenMP C include: ${OpenMP_C_INCLUDE_DIRS} ") message ( STATUS "OpenMP C flags: ${OpenMP_C_FLAGS} ") - target_link_libraries ( suitesparseconfig PUBLIC ${OpenMP_C_LIBRARIES} ) - if ( NOT NSTATIC ) - target_link_libraries ( suitesparseconfig_static PUBLIC ${OpenMP_C_LIBRARIES} ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SuiteSparseConfig PRIVATE OpenMP::OpenMP_C ) + target_include_directories ( SuiteSparseConfig SYSTEM AFTER INTERFACE + "$" ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + target_link_libraries ( SuiteSparseConfig_static PRIVATE OpenMP::OpenMP_C ) + target_include_directories ( SuiteSparseConfig_static SYSTEM AFTER INTERFACE + "$" ) + list ( APPEND SUITESPARSE_CONFIG_STATIC_LIBS ${OpenMP_C_LIBRARIES} ) + endif ( ) +else ( ) + # librt + if ( WITH_RT ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( SuiteSparseConfig PRIVATE "rt" ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + target_link_libraries ( SuiteSparseConfig_static PRIVATE "rt" ) + list ( APPEND SUITESPARSE_CONFIG_STATIC_LIBS "rt" ) + endif ( ) endif ( ) - set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS} " ) - include_directories ( ${OpenMP_C_INCLUDE_DIRS} ) endif ( ) # BLAS: @@ -147,23 +245,123 @@ if ( BLAS_FOUND ) endif ( ) #------------------------------------------------------------------------------- -# suitesparseconfig installation location +# SuiteSparseConfig installation location #------------------------------------------------------------------------------- +include ( CMakePackageConfigHelpers ) + file ( GLOB SUITESPARSE_CMAKE_MODULES "cmake_modules/*" ) -install ( TARGETS suitesparseconfig - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +if ( BUILD_SHARED_LIBS ) + install ( TARGETS SuiteSparseConfig + EXPORT SuiteSparse_configTargets + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) +if ( BUILD_STATIC_LIBS ) + install ( TARGETS SuiteSparseConfig_static + EXPORT SuiteSparse_configTargets + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +endif ( ) install ( FILES ${SUITESPARSE_CMAKE_MODULES} - DESTINATION ${SUITESPARSE_LIBDIR}/cmake/SuiteSparse + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SuiteSparse COMPONENT Development ) -if ( NOT NSTATIC ) - install ( TARGETS suitesparseconfig_static - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} ) + +# create (temporary) export target file during build +export ( EXPORT SuiteSparse_configTargets + NAMESPACE SuiteSparse:: + FILE ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configTargets.cmake ) + +# install export target and config for find_package +install ( EXPORT SuiteSparse_configTargets + NAMESPACE SuiteSparse:: + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SuiteSparse_config ) + +configure_package_config_file ( + Config/SuiteSparse_configConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configConfig.cmake + INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SuiteSparse_config ) + +write_basic_package_version_file ( + ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configConfigVersion.cmake + COMPATIBILITY SameMajorVersion ) + +install ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configConfigVersion.cmake + DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SuiteSparse_config ) + +#------------------------------------------------------------------------------- +# create pkg-config file +#------------------------------------------------------------------------------- + +if ( NOT MSVC ) + # This might be something like: + # /usr/lib/libgomp.so;/usr/lib/libpthread.a;m + # convert to -l flags for pkg-config, i.e.: "-lgomp -lpthread -lm" + set ( SUITESPARSE_CONFIG_STATIC_LIBS_LIST ${SUITESPARSE_CONFIG_STATIC_LIBS} ) + set ( SUITESPARSE_CONFIG_STATIC_LIBS "" ) + foreach ( _lib ${SUITESPARSE_CONFIG_STATIC_LIBS_LIST} ) + string ( FIND ${_lib} "." _pos REVERSE ) + if ( ${_pos} EQUAL "-1" ) + set ( SUITESPARSE_CONFIG_STATIC_LIBS "${SUITESPARSE_CONFIG_STATIC_LIBS} -l${_lib}" ) + continue () + endif ( ) + set ( _kinds "SHARED" "STATIC" ) + if ( WIN32 ) + list ( PREPEND _kinds "IMPORT" ) + endif ( ) + foreach ( _kind IN LISTS _kinds ) + set ( _regex ".*\\/(lib)?([^\\.]*)(${CMAKE_${_kind}_LIBRARY_SUFFIX})" ) + if ( ${_lib} MATCHES ${_regex} ) + string ( REGEX REPLACE ${_regex} "\\2" _libname ${_lib} ) + if ( NOT "${_libname}" STREQUAL "" ) + set ( SUITESPARSE_CONFIG_STATIC_LIBS "${SUITESPARSE_CONFIG_STATIC_LIBS} -l${_libname}" ) + break () + endif ( ) + endif ( ) + endforeach ( ) + endforeach ( ) + + set ( prefix "${CMAKE_INSTALL_PREFIX}" ) + set ( exec_prefix "\${prefix}" ) + cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) + if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) + set ( libdir "${SUITESPARSE_LIBDIR}") + else ( ) + set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") + endif ( ) + cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) + if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) + set ( includedir "${SUITESPARSE_INCLUDEDIR}") + else ( ) + set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") + endif ( ) + if ( BUILD_SHARED_LIBS ) + set ( SUITESPARSE_LIB_BASE_NAME $ ) + else ( ) + set ( SUITESPARSE_LIB_BASE_NAME $ ) + endif ( ) + configure_file ( + Config/SuiteSparse_config.pc.in + SuiteSparse_config.pc.out + @ONLY + NEWLINE_STYLE LF ) + file ( GENERATE + OUTPUT SuiteSparse_config.pc + INPUT ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_config.pc.out + NEWLINE_STYLE LF ) + install ( FILES + ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_config.pc + DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) endif ( ) +#------------------------------------------------------------------------------- +# report status +#------------------------------------------------------------------------------- + include ( SuiteSparseReport ) diff --git a/SuiteSparse_config/Config/README.md.in b/SuiteSparse_config/Config/README.md.in index e45ae9c0..16fbb9f9 100644 --- a/SuiteSparse_config/Config/README.md.in +++ b/SuiteSparse_config/Config/README.md.in @@ -9,11 +9,41 @@ by Tim Davis, available at https://github.com/DrTimothyAldenDavis/SuiteSparse . Primary author of SuiteSparse (codes and algorithms, excl. METIS): Tim Davis -Code co-authors, in alphabetical order (not including METIS): - Patrick Amestoy, David Bateman, Jinhao Chen, Yanqing Chen, Iain Duff, - Les Foster, William Hager, Scott Kolodziej, Chris Lourenco, Stefan - Larimore, Erick Moreno-Centeno, Ekanathan Palamadai, Sivasankaran - Rajamanickam, Sanjay Ranka, Wissam Sid-Lakhdar, Nuri Yeralan. +Code co-authors, in alphabetical order (not including METIS or LAGraph): + Patrick Amestoy, Mohsen Aznaveh, David Bateman, Jinhao Chen, Yanqing Chen, + Iain Duff, Joe Eaton, Les Foster, William Hager, Raye Kimmerer, Scott + Kolodziej, Chris Lourenco, Stefan Larimore, Lorena Mejia Domenzain, Erick + Moreno-Centeno, Markus Mützel, Corey Nolel, Ekanathan Palamadai, + Sivasankaran Rajamanickam, Sanjay Ranka, Wissam Sid-Lakhdar, and + Nuri Yeralan. + +LAGraph has been developed by the highest number of developers of any of +the packages in SuiteSparse and deserves its own list. The list also +appears in LAGraph/Contibutors.txt: + + Janos B. Antal, Budapest University of Technology and Economics, Hungary + Mohsen Aznaveh, Texas A&M University + David A. Bader New Jersey Institute of Technology + Aydin Buluc, Lawrence Berkeley National Lab + Jinhao Chen, Texas A&M University + Tim Davis, Texas A&M University + Florentin Dorre, Technische Univeritat Dresden, Neo4j + Marton Elekes, Budapest University of Technology and Economics, Hungary + Balint Hegyi, Budapest University of Technology and Economics, Hungary + Tanner Hoke, Texas A&M University + James Kitchen, Anaconda + Scott Kolodziej, Texas A&M University + Pranav Konduri, Texas A&M University + Roi Lipman, Redis Labs (now FalkorDB) + Tze Meng Low, Carnegie Mellon University + Tim Mattson, Intel + Scott McMillan, Carnegie Mellon University + Markus Muetzel + Michel Pelletier, Graphegon + Gabor Szarnyas, CWI Amsterdam, The Netherlands + Erik Welch, Anaconda, NVIDIA + Carl Yang, University of California at Davis, Waymo + Yongzhe Zhang, SOKENDAI, Japan METIS is authored by George Karypis. @@ -21,17 +51,460 @@ Additional algorithm designers: Esmond Ng and John Gilbert. Refer to each package for license, copyright, and author information. +----------------------------------------------------------------------------- +Documentation +----------------------------------------------------------------------------- + +Refer to each package for the documentation on each package, typically in the +Doc subfolder. + ----------------------------------------------------------------------------- SuiteSparse branches ----------------------------------------------------------------------------- - * dev: the default branch, with recent updates of features to appear in - the next stable release. The intent is to keep this branch in - fully working order at all times, but the features will not be - finalized at any given time. - * stable: the most recent stable release. - * dev2: working branch. All submitted PRs should made to this branch. - This branch might not always be in working order. +* dev: the default branch, with recent updates of features to appear in + the next stable release. The intent is to keep this branch in + fully working order at all times, but the features will not be + finalized at any given time. +* stable: the most recent stable release. +* dev2: working branch. All submitted PRs should made to this branch. + This branch might not always be in working order. + +----------------------------------------------------------------------------- +SuiteSparse Packages +----------------------------------------------------------------------------- + +Packages in SuiteSparse, and files in this directory: + +* `AMD` + + approximate minimum degree ordering. This is the built-in AMD function in + MATLAB. + + authors: Tim Davis, Patrick Amestoy, Iain Duff + +* `bin` + + where programs are placed when compiled, for `make local` + +* `BTF` + + permutation to block triangular form + + authors: Tim Davis, Ekanathan Palamadai + +* `build` + + folder for default build tree + +* `CAMD` + + constrained approximate minimum degree ordering + + authors: Tim Davis, Patrick Amestoy, Iain Duff, Yanqing Chen + +* `CCOLAMD` + + constrained column approximate minimum degree ordering + + authors: Tim Davis, Sivasankaran Rajamanickam, Stefan Larimore. + + Algorithm design collaborators: Esmond Ng, John Gilbert (for COLAMD) + +* `ChangeLog` + + a summary of changes to SuiteSparse. See `*/Doc/ChangeLog` for details for + each package. + +* `CHOLMOD` + + sparse Cholesky factorization. Requires AMD, COLAMD, CCOLAMD, the BLAS, and + LAPACK. Optionally uses METIS. This is `chol` and `x=A\b` in MATLAB. + + author for all modules: Tim Davis + + CHOLMOD/Modify module authors: Tim Davis and William W. Hager + + CHOLMOD/SuiteSparse_metis: a modified version of METIS, embedded into the + CHOLMOD library. See the README.txt files for details. author: George + Karypis. This is a slightly modified copy included with SuiteSparse via the + open-source license provided by George Karypis. SuiteSparse cannot use an + unmodified copy of METIS. + +* `CITATION.bib` + + citations for SuiteSparse packages, in bibtex format. + +* `CMakeLists.txt` + + optional, to compile all of SuiteSparse. See below. + +* `CODE_OF_CONDUCT.md` + + community guidelines + +* `COLAMD` + + column approximate minimum degree ordering. This is the built-in COLAMD + function in MATLAB. + + authors (of the code): Tim Davis and Stefan Larimore + + Algorithm design collaborators: Esmond Ng, John Gilbert + +* `Contents.m` + + a list of contents for 'help SuiteSparse' in MATLAB. + +* `CONTRIBUTING.md` + + how to contribute to SuiteSparse + +* `CONTRIBUTOR-LICENSE.txt` + + required contributor agreement + +* `CSparse` + + a concise sparse matrix package, developed for my book, "Direct Methods for + Sparse Linear Systems", published by SIAM. Intended primarily for teaching. + Note that the code is (c) Tim Davis, as stated in the book. + + For production, use CXSparse instead. In particular, both CSparse and + CXSparse have the same include filename: `cs.h`. This package is used for + the built-in DMPERM in MATLAB. + + author: Tim Davis + +* `CXSparse` + + CSparse Extended. Includes support for complex matrices and both int or long + integers. Use this instead of CSparse for production use; it creates a + libcsparse.so (or dylib on the Mac) with the same name as CSparse. It is a + superset of CSparse. Any code that links against CSparse should also be able + to link against CXSparse instead. + + author: Tim Davis, David Bateman + +* `Example` + + a simple package that relies on almost all of SuiteSparse + +* `.github` + + workflows for CI testing on GitHub. + +* `GraphBLAS` + + graph algorithms in the language of linear algebra. + + https://graphblas.org + + authors: Tim Davis, Joe Eaton, Corey Nolet + +* `include` + + `make install` places user-visible include files for each package here, after + `make local`. + +* `KLU` + + sparse LU factorization, primarily for circuit simulation. Requires AMD, + COLAMD, and BTF. Optionally uses CHOLMOD, CAMD, CCOLAMD, and METIS. + + authors: Tim Davis, Ekanathan Palamadai + +* `LAGraph` + + a graph algorithms library based on GraphBLAS. See also + https://github.com/GraphBLAS/LAGraph + + Authors: many. + +* `LDL` + + a very concise LDL' factorization package + + author: Tim Davis + +* `lib` + + `make install` places shared libraries for each package here, after + `make local`. + +* `LICENSE.txt` + + collected licenses for each package. + +* `Makefile` + + optional, to compile all of SuiteSparse using `make`, which is used as a + simple wrapper for `cmake` in each subproject. + + * `make` + + compiles SuiteSparse libraries. Subsequent `make install` will install + in `CMAKE_INSTALL_PATH` (might default to `/usr/local/lib` on Linux or Mac). + + * `make local` + + compiles SuiteSparse. Subsequent `make install` will install in `./lib`, + `./include`. Does not install in `CMAKE_INSTALL_PATH`. + + * `make global` + + compiles SuiteSparse libraries. Subsequent `make install` will install in + `/usr/local/lib` (or whatever the configured `CMAKE_INSTALL_PREFIX` is). + Does not install in `./lib` and `./include`. + + * `make install` + + installs in the current directory (`./lib`, `./include`), or in + `/usr/local/lib` and `/usr/local/include`, (the latter defined by + `CMAKE_INSTALL_PREFIX`) depending on whether `make`, `make local`, or + `make global` has been done. + + * `make uninstall` + + undoes `make install`. + + * `make distclean` + + removes all files not in distribution, including `./bin`, `./share`, + `./lib`, and `./include`. + + * `make purge` + + same as `make distclean`. + + * `make clean` + + removes all files not in distribution, but keeps compiled libraries and + demos, `./lib`, `./share`, and `./include`. + + Each individual subproject also has each of the above `make` targets. + + Things you don't need to do: + + * `make docs` + + creates user guides from LaTeX files + + * `make cov` + + runs statement coverage tests (Linux only) + +* `MATLAB_Tools` + + various m-files for use in MATLAB + + author: Tim Davis (all parts) + + for `spqr_rank`: author Les Foster and Tim Davis + + * `Contents.m` + + list of contents + + * `dimacs10` + + loads matrices for DIMACS10 collection + + * `Factorize` + + object-oriented `x=A\b` for MATLAB + + * `find_components` + + finds connected components in an image + + * `GEE` + + simple Gaussian elimination + + * `getversion.m` + + determine MATLAB version + + * `gipper.m` + + create MATLAB archive + + * `hprintf.m` + + print hyperlinks in command window + + * `LINFACTOR` + + predecessor to `Factorize` package + + * `MESHND` + + nested dissection ordering of regular meshes + + * `pagerankdemo.m` + + illustrates how PageRank works + + * `SFMULT` + + `C=S*F` where `S` is sparse and `F` is full + + * `shellgui` + + display a seashell + + * `sparseinv` + + sparse inverse subset + + * `spok` + + check if a sparse matrix is valid + + * `spqr_rank` + + SPQR_RANK package. MATLAB toolbox for rank deficient sparse matrices: null + spaces, reliable factorizations, etc. With Leslie Foster, San Jose State + Univ. + + * `SSMULT` + + `C=A*B` where `A` and `B` are both sparse. + This was the basis for the built-in `C=A*B` in MATLAB, until it was + superseded by GraphBLAS in MATLAB R2021a. + + * `SuiteSparseCollection` + + for the SuiteSparse Matrix Collection + + * `waitmex` + + waitbar for use inside a mexFunction + +* `Mongoose` + + graph partitioning. + + authors: Nuri Yeralan, Scott Kolodziej, William Hager, Tim Davis + +* `ParU` + + a parallel unsymmetric pattern multifrontal method. + + Currently a pre-release. + + authors: Mohsen Aznaveh and Tim Davis + +* `RBio` + + read/write sparse matrices in Rutherford/Boeing format + + author: Tim Davis + +* `README.md` + + this file + +* `SPEX` + + solves sparse linear systems in exact arithmetic. + + Requires the GNU GMP and MPRF libraries. + + This will be soon replaced by a more general package, SPEX v3 that includes + this method (exact sparse LU) and others (sparse exact Cholesky, and sparse + exact update/downdate). The API of v3 will be changing significantly. + + authors: Chris Lourenco, Jinhao Chen, Erick Moreno-Centeno, + Lorena Lorena Mejia Domenzain, and Tim Davis. + + See https://github.com/clouren/SPEX for the latest version. + +* `SPQR` + + sparse QR factorization. This the built-in `qr` and `x=A\b` in MATLAB. Also + called SuiteSparseQR. + + Includes two GPU libraries: `SPQR/GPUQREngine` and + `SPQR/SuiteSparse_GPURuntime`. + + author of the CPU code: Tim Davis + + author of GPU modules: Tim Davis, Nuri Yeralan, Wissam Sid-Lakhdar, + Sanjay Ranka + +* `ssget` + + MATLAB interface to the SuiteSparse Matrix Collection + + author: Tim Davis + +* `SuiteSparse_config` + + library with common functions and configuration for all the above packages. + `CSparse`, `GraphBLAS`, `LAGraph`, and `MATLAB_Tools` do not use + `SuiteSparse_config`. + + author: Tim Davis + +* `SuiteSparse_demo.m` + + a demo of SuiteSparse for MATLAB + +* `SuiteSparse_install.m` + + install SuiteSparse for MATLAB + +* `SuiteSparse_paths.m` + + set paths for SuiteSparse MATLAB mexFunctions + +* `SuiteSparse_test.m` + + exhaustive test for SuiteSparse in MATLAB + +* `UMFPACK` + + sparse LU factorization. Requires `AMD` and the `BLAS`. + + This is the built-in `lu` and `x=A\b` in MATLAB. + + author: Tim Davis + + algorithm design collaboration: Iain Duff + +Refer to each package for license, copyright, and author information. All +codes are authored or co-authored by Timothy A. Davis (email: davis@tamu.edu), +except for METIS (by George Karypis), `GraphBLAS/cpu_features` (by Google), +GraphBLAS/lz4, zstd, and xxHash (by Yann Collet, now at Facebook), and +GraphBLAS/CUDA/jitify.hpp (by NVIDIA). Parts of GraphBLAS/CUDA are +Copyright (c) by NVIDIA. Please refer to each of these licenses. + +----------------------------------------------------------------------------- +For distro maintainers (Linux, homebrew, spack, R, Octave, Trilinos, ...): +----------------------------------------------------------------------------- + +Thanks for packaging SuiteSparse! Here are some suggestions: + +* GraphBLAS takes a long time to compile because it creates many fast + "FactoryKernels" at compile-time. If you want to reduce the compile time and + library size, enable the `GRAPHBLAS_COMPACT` mode, but keep the JIT compiler + enabled. Then GraphBLAS will compile the kernels it needs at run-time, via + its JIT compiler. Performance will be the same as the FactoryKernels once + the JIT kernels are compiled. User compiled kernels are placed in + `~/.SuiteSparse`, by default. You do not need to distribute the source for + GraphBLAS to enable the JIT compiler: just `libgraphblas.so` and + `GraphBLAS.h` is enough. + +* GraphBLAS needs OpenMP! It's fundamentally a parallel code so please + distribute it with OpenMP enabled. Performance will suffer otherwise. + +* CUDA acceleration: CHOLMOD and SPQR can benefit from their CUDA kernels. If + you do not have CUDA or do not want to include it in your distro, this + version of SuiteSparse skips the building of the `CHOLMOD_CUDA` and `SPQR_CUDA` + libraries, and does not link against the `GPUQREngine` and + `SuiteSparse_GPURuntime` libraries. ----------------------------------------------------------------------------- How to cite the SuiteSparse meta-package and its component packages: @@ -40,193 +513,180 @@ How to cite the SuiteSparse meta-package and its component packages: SuiteSparse is a meta-package of many packages, each with their own published papers. To cite the whole collection, use the URLs: - * https://github.com/DrTimothyAldenDavis/SuiteSparse - * http://suitesparse.com (which is a forwarding URL +* https://github.com/DrTimothyAldenDavis/SuiteSparse +* http://suitesparse.com (which is a forwarding URL to https://people.engr.tamu.edu/davis/suitesparse.html) Please also cite the specific papers for the packages you use. This is a long list; if you want a shorter list, just cite the most recent "Algorithm XXX:" papers in ACM TOMS, for each package. - * For the MATLAB x=A\b, see below for AMD, COLAMD, CHOLMOD, UMFPACK, - and SuiteSparseQR (SPQR). +* For the MATLAB x=A\b, see below for AMD, COLAMD, CHOLMOD, UMFPACK, + and SuiteSparseQR (SPQR). - * for GraphBLAS, and `C=A*B` in MATLAB (sparse-times-sparse): +* for GraphBLAS, and C=AB in MATLAB (sparse-times-sparse): - T. Davis, Algorithm 10xx: SuiteSparse:GraphBLAS: parallel graph - algorithms in the language of sparse linear algebra, ACM Trans on - Mathematical Software, to appear, 2023. See the pdf in - https://github.com/DrTimothyAldenDavis/GraphBLAS/tree/stable/Doc + T. A. Davis. Algorithm 1037: SuiteSparse:GraphBLAS: Parallel Graph Algorithms + in the Language of Sparse Linear Algebra. ACM Trans. Math. Softw. 49, 3, + Article 28 (September 2023), 30 pages. https://doi.org/10.1145/3577195 - T. Davis, Algorithm 1000: SuiteSparse:GraphBLAS: graph algorithms in - the language of sparse linear algebra, ACM Trans on Mathematical - Software, vol 45, no 4, Dec. 2019, Article No 44. - https://doi.org/10.1145/3322125. + T. Davis, Algorithm 1000: SuiteSparse:GraphBLAS: graph algorithms in the + language of sparse linear algebra, ACM Trans on Mathematical Software, vol + 45, no 4, Dec. 2019, Article No 44. https://doi.org/10.1145/3322125. - * for CSparse/CXSParse: +* for LAGraph: - T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM Series on - the Fundamentals of Algorithms, SIAM, Philadelphia, PA, 2006. - https://doi.org/10.1137/1.9780898718881 + G. Szárnyas et al., "LAGraph: Linear Algebra, Network Analysis Libraries, and + the Study of Graph Algorithms," 2021 IEEE International Parallel and + Distributed Processing Symposium Workshops (IPDPSW), Portland, OR, USA, 2021, + pp. 243-252. https://doi.org/10.1109/IPDPSW52791.2021.00046. - * for SuiteSparseQR (SPQR): (also cite AMD, COLAMD): +* for CSparse/CXSParse: - T. A. Davis, Algorithm 915: SuiteSparseQR: Multifrontal multithreaded - rank-revealing sparse QR factorization, ACM Trans. on Mathematical - Software, 38(1), 2011, pp. 8:1--8:22. - https://doi.org/10.1145/2049662.2049670 + T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM Series on the + Fundamentals of Algorithms, SIAM, Philadelphia, PA, 2006. + https://doi.org/10.1137/1.9780898718881 - * for SuiteSparseQR/GPU: +* for SuiteSparseQR (SPQR): (also cite AMD, COLAMD): - Sencer Nuri Yeralan, T. A. Davis, Wissam M. Sid-Lakhdar, and Sanjay - Ranka. 2017. Algorithm 980: Sparse QR Factorization on the GPU. ACM - Trans. Math. Softw. 44, 2, Article 17 (June 2018), 29 pages. - https://doi.org/10.1145/3065870 + T. A. Davis, Algorithm 915: SuiteSparseQR: Multifrontal multithreaded + rank-revealing sparse QR factorization, ACM Trans. on Mathematical Software, + 38(1), 2011, pp. 8:1--8:22. https://doi.org/10.1145/2049662.2049670 - * for CHOLMOD: (also cite AMD, COLAMD): +* for SuiteSparseQR/GPU: - Y. Chen, T. A. Davis, W. W. Hager, and S. Rajamanickam, Algorithm 887: - CHOLMOD, supernodal sparse Cholesky factorization and update/downdate, - ACM Trans. on Mathematical Software, 35(3), 2008, pp. 22:1--22:14. - https://dl.acm.org/doi/abs/10.1145/1391989.1391995 + Sencer Nuri Yeralan, T. A. Davis, Wissam M. Sid-Lakhdar, and Sanjay Ranka. + 2017. Algorithm 980: Sparse QR Factorization on the GPU. ACM Trans. Math. + Softw. 44, 2, Article 17 (June 2018), 29 pages. + https://doi.org/10.1145/3065870 - T. A. Davis and W. W. Hager, Dynamic supernodes in sparse Cholesky - update/downdate and triangular solves, ACM Trans. on Mathematical - Software, 35(4), 2009, pp. 27:1--27:23. - https://doi.org/10.1145/1462173.1462176 +* for CHOLMOD: (also cite AMD, COLAMD): - * for CHOLMOD/Modify Module: (also cite AMD, COLAMD): + Y. Chen, T. A. Davis, W. W. Hager, and S. Rajamanickam, Algorithm 887: + CHOLMOD, supernodal sparse Cholesky factorization and update/downdate, ACM + Trans. on Mathematical Software, 35(3), 2008, pp. 22:1--22:14. + https://dl.acm.org/doi/abs/10.1145/1391989.1391995 - T. A. Davis and William W. Hager, Row Modifications of a Sparse - Cholesky Factorization SIAM Journal on Matrix Analysis and Applications - 2005 26:3, 621-639 - https://doi.org/10.1137/S089547980343641X + T. A. Davis and W. W. Hager, Dynamic supernodes in sparse Cholesky + update/downdate and triangular solves, ACM Trans. on Mathematical Software, + 35(4), 2009, pp. 27:1--27:23. https://doi.org/10.1145/1462173.1462176 - T. A. Davis and William W. Hager, Multiple-Rank Modifications of a - Sparse Cholesky Factorization SIAM Journal on Matrix Analysis and - Applications 2001 22:4, 997-1013 - https://doi.org/10.1137/S0895479899357346 +* for CHOLMOD/Modify Module: (also cite AMD, COLAMD): - T. A. Davis and William W. Hager, Modifying a Sparse Cholesky - Factorization, SIAM Journal on Matrix Analysis and Applications 1999 - 20:3, 606-627 - https://doi.org/10.1137/S0895479897321076 + T. A. Davis and William W. Hager, Row Modifications of a Sparse Cholesky + Factorization SIAM Journal on Matrix Analysis and Applications 2005 26:3, + 621-639. https://doi.org/10.1137/S089547980343641X - * for CHOLMOD/GPU Modules: + T. A. Davis and William W. Hager, Multiple-Rank Modifications of a Sparse + Cholesky Factorization SIAM Journal on Matrix Analysis and Applications 2001 + 22:4, 997-1013. https://doi.org/10.1137/S0895479899357346 - Steven C. Rennich, Darko Stosic, Timothy A. Davis, Accelerating sparse - Cholesky factorization on GPUs, Parallel Computing, Vol 59, 2016, pp - 140-150. - https://doi.org/10.1016/j.parco.2016.06.004 + T. A. Davis and William W. Hager, Modifying a Sparse Cholesky Factorization, + SIAM Journal on Matrix Analysis and Applications 1999 20:3, 606-627. + https://doi.org/10.1137/S0895479897321076 - * for AMD and CAMD: +* for CHOLMOD/GPU Modules: - P. Amestoy, T. A. Davis, and I. S. Duff, Algorithm 837: An approximate - minimum degree ordering algorithm, ACM Trans. on Mathematical Software, - 30(3), 2004, pp. 381--388. - https://dl.acm.org/doi/abs/10.1145/1024074.1024081 + Steven C. Rennich, Darko Stosic, Timothy A. Davis, Accelerating sparse + Cholesky factorization on GPUs, Parallel Computing, Vol 59, 2016, pp 140-150. + https://doi.org/10.1016/j.parco.2016.06.004 - P. Amestoy, T. A. Davis, and I. S. Duff, An approximate minimum degree - ordering algorithm, SIAM J. Matrix Analysis and Applications, 17(4), - 1996, pp. 886--905. - https://doi.org/10.1137/S0895479894278952 +* for AMD and CAMD: - * for COLAMD, SYMAMD, CCOLAMD, and CSYMAMD: + P. Amestoy, T. A. Davis, and I. S. Duff, Algorithm 837: An approximate + minimum degree ordering algorithm, ACM Trans. on Mathematical Software, + 30(3), 2004, pp. 381--388. + https://dl.acm.org/doi/abs/10.1145/1024074.1024081 - T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD, - an approximate column minimum degree ordering algorithm, ACM Trans. on - Mathematical Software, 30(3), 2004, pp. 377--380. - https://doi.org/10.1145/1024074.1024080 + P. Amestoy, T. A. Davis, and I. S. Duff, An approximate minimum degree + ordering algorithm, SIAM J. Matrix Analysis and Applications, 17(4), 1996, + pp. 886--905. https://doi.org/10.1137/S0895479894278952 - T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, A column approximate - minimum degree ordering algorithm, ACM Trans. on Mathematical Software, - 30(3), 2004, pp. 353--376. - https://doi.org/10.1145/1024074.1024079 +* for COLAMD, SYMAMD, CCOLAMD, and CSYMAMD: - * for UMFPACK: (also cite AMD and COLAMD): + T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD, an + approximate column minimum degree ordering algorithm, ACM Trans. on + Mathematical Software, 30(3), 2004, pp. 377--380. + https://doi.org/10.1145/1024074.1024080 - T. A. Davis, Algorithm 832: UMFPACK - an unsymmetric-pattern - multifrontal method with a column pre-ordering strategy, ACM Trans. on - Mathematical Software, 30(2), 2004, pp. 196--199. - https://dl.acm.org/doi/abs/10.1145/992200.992206 + T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, A column approximate minimum + degree ordering algorithm, ACM Trans. on Mathematical Software, 30(3), 2004, + pp. 353--376. https://doi.org/10.1145/1024074.1024079 - T. A. Davis, A column pre-ordering strategy for the unsymmetric-pattern - multifrontal method, ACM Trans. on Mathematical Software, 30(2), 2004, - pp. 165--195. - https://dl.acm.org/doi/abs/10.1145/992200.992205 +* for UMFPACK: (also cite AMD and COLAMD): - T. A. Davis and I. S. Duff, A combined unifrontal/multifrontal method - for unsymmetric sparse matrices, ACM Trans. on Mathematical Software, - 25(1), 1999, pp. 1--19. - https://doi.org/10.1145/305658.287640 + T. A. Davis, Algorithm 832: UMFPACK - an unsymmetric-pattern multifrontal + method with a column pre-ordering strategy, ACM Trans. on Mathematical + Software, 30(2), 2004, pp. 196--199. + https://dl.acm.org/doi/abs/10.1145/992200.992206 - T. A. Davis and I. S. Duff, An unsymmetric-pattern multifrontal method - for sparse LU factorization, SIAM J. Matrix Analysis and Computations, - 18(1), 1997, pp. 140--158. - https://doi.org/10.1137/S0895479894246905 + T. A. Davis, A column pre-ordering strategy for the unsymmetric-pattern + multifrontal method, ACM Trans. on Mathematical Software, 30(2), 2004, pp. + 165--195. https://dl.acm.org/doi/abs/10.1145/992200.992205 - * for the FACTORIZE m-file: + T. A. Davis and I. S. Duff, A combined unifrontal/multifrontal method for + unsymmetric sparse matrices, ACM Trans. on Mathematical Software, 25(1), + 1999, pp. 1--19. https://doi.org/10.1145/305658.287640 - T. A. Davis, Algorithm 930: FACTORIZE, an object-oriented linear system - solver for MATLAB, ACM Trans. on Mathematical Software, 39(4), 2013, - pp. 28:1-28:18. - https://doi.org/10.1145/2491491.2491498 + T. A. Davis and I. S. Duff, An unsymmetric-pattern multifrontal method for + sparse LU factorization, SIAM J. Matrix Analysis and Computations, 18(1), + 1997, pp. 140--158. https://doi.org/10.1137/S0895479894246905 - * for KLU and BTF (also cite AMD and COLAMD): +* for the FACTORIZE m-file: - T. A. Davis and Ekanathan Palamadai Natarajan. 2010. Algorithm 907: - KLU, A Direct Sparse Solver for Circuit Simulation Problems. ACM Trans. - Math. Softw. 37, 3, Article 36 (September 2010), 17 pages. - https://dl.acm.org/doi/abs/10.1145/1824801.1824814 + T. A. Davis, Algorithm 930: FACTORIZE, an object-oriented linear system + solver for MATLAB, ACM Trans. on Mathematical Software, 39(4), 2013, pp. + 28:1-28:18. https://doi.org/10.1145/2491491.2491498 - * for LDL: +* for KLU and BTF (also cite AMD and COLAMD): - T. A. Davis. Algorithm 849: A concise sparse Cholesky factorization - package. ACM Trans. Math. Softw. 31, 4 (December 2005), 587–591. - https://doi.org/10.1145/1114268.1114277 + T. A. Davis and Ekanathan Palamadai Natarajan. 2010. Algorithm 907: KLU, A + Direct Sparse Solver for Circuit Simulation Problems. ACM Trans. Math. + Softw. 37, 3, Article 36 (September 2010), 17 pages. + https://dl.acm.org/doi/abs/10.1145/1824801.1824814 - * for ssget and the SuiteSparse Matrix Collection: +* for LDL: - T. A. Davis and Yifan Hu. 2011. The University of Florida sparse - matrix collection. ACM Trans. Math. Softw. 38, 1, Article 1 (November - 2011), 25 pages. - https://doi.org/10.1145/2049662.2049663 + T. A. Davis. Algorithm 849: A concise sparse Cholesky factorization package. + ACM Trans. Math. Softw. 31, 4 (December 2005), 587–591. + https://doi.org/10.1145/1114268.1114277 - Kolodziej et al., (2019). The SuiteSparse Matrix Collection Website - Interface. Journal of Open Source Software, 4(35), 1244, - https://doi.org/10.21105/joss.01244 +* for ssget and the SuiteSparse Matrix Collection: - * for `spqr_rank`: + T. A. Davis and Yifan Hu. 2011. The University of Florida sparse matrix + collection. ACM Trans. Math. Softw. 38, 1, Article 1 (November 2011), 25 + pages. https://doi.org/10.1145/2049662.2049663 - Leslie V. Foster and T. A. Davis. 2013. Algorithm 933: Reliable - calculation of numerical rank, null space bases, pseudoinverse - solutions, and basic solutions using suitesparseQR. ACM Trans. Math. - Softw. 40, 1, Article 7 (September 2013), 23 pages. - https://doi.org/10.1145/2513109.2513116 + Kolodziej et al., (2019). The SuiteSparse Matrix Collection Website + Interface. Journal of Open Source Software, 4(35), 1244. + https://doi.org/10.21105/joss.01244 - * for Mongoose: +* for `spqr_rank`: - T. A. Davis, William W. Hager, Scott P. Kolodziej, and S. Nuri Yeralan. - 2020. Algorithm 1003: Mongoose, a Graph Coarsening and Partitioning - Library. ACM Trans. Math. Softw. 46, 1, Article 7 (March 2020), 18 - pages. - https://doi.org/10.1145/3337792 + Leslie V. Foster and T. A. Davis. 2013. Algorithm 933: Reliable calculation + of numerical rank, null space bases, pseudoinverse solutions, and basic + solutions using suitesparseQR. ACM Trans. Math. Softw. 40, 1, Article 7 + (September 2013), 23 pages. https://doi.org/10.1145/2513109.2513116 - * for SPEX: +* for Mongoose: - Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and T. A. - Davis. 2022. Algorithm 1021: SPEX Left LU, Exactly Solving Sparse - Linear Systems via a Sparse Left-Looking Integer-Preserving LU - Factorization. ACM Trans. Math. Softw. June 2022. - https://doi.org/10.1145/3519024 + T. A. Davis, William W. Hager, Scott P. Kolodziej, and S. Nuri Yeralan. + 2020. Algorithm 1003: Mongoose, a Graph Coarsening and Partitioning Library. + ACM Trans. Math. Softw. 46, 1, Article 7 (March 2020), 18 pages. + https://doi.org/10.1145/3337792 + +* for SPEX: + + Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and T. A. Davis. + 2022. Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via + a Sparse Left-Looking Integer-Preserving LU Factorization. ACM Trans. Math. + Softw. June 2022. https://doi.org/10.1145/3519024 ----------------------------------------------------------------------------- About the BLAS and LAPACK libraries ----------------------------------------------------------------------------- -NOTE: Use of the Intel MKL BLAS is strongly recommended. In a 2019 test, -OpenBLAS caused result in severe performance degradation. The reason for this -is being investigated, and this may be resolved in the near future. +NOTE: if you use OpenBLAS, be sure to use version 0.3.27 or later. To select your BLAS/LAPACK, see the instructions in SuiteSparseBLAS.cmake in `SuiteSparse_config/cmake_modules`. If `SuiteSparse_config` finds a BLAS with @@ -234,15 +694,17 @@ To select your BLAS/LAPACK, see the instructions in SuiteSparseBLAS.cmake in `SuiteSparse_config.h` with the `SUITESPARSE_BLAS_INT` defined as `int64_t`. Otherwise, if a 32-bit BLAS is found, this type is defined as `int32_t`. If later on, UMFPACK, CHOLMOD, or SPQR are compiled and linked with a BLAS that -has a different integer size, you must override the definition with -DBLAS64 -(to assert the use of 64-bit integers in the BLAS) or -DBLAS32, (to assert the -use of 32-bit integers in the BLAS). +has a different integer size, you must override the definition with `-DBLAS64` +(to assert the use of 64-bit integers in the BLAS) or `-DBLAS32`, (to assert +the use of 32-bit integers in the BLAS). + +The size of the BLAS integer has nothing to do with `sizeof(void *)`. When distributed in a binary form (such as a Debian, Ubuntu, Spack, or Brew package), SuiteSparse should probably be compiled to expect a 32-bit BLAS, since this is the most common case. The default is to use a 32-bit BLAS, but -this can be changed in SuiteSparseBLAS.cmake or by compiling with -`-DALLOW_64BIT_BLAS=1`. +this can be changed by setting the cmake variable +`SUITESPARSE_USE_64BIT_BLAS` to `ON`. By default, SuiteSparse hunts for a suitable BLAS library. To enforce a particular BLAS library use either: @@ -251,263 +713,140 @@ particular BLAS library use either: cd Package ; cmake -DBLA_VENDOR=OpenBLAS .. make To use the default (hunt for a BLAS), do not set `BLA_VENDOR`, or set it to -ANY. In this case, if `ALLOW_64BIT_BLAS` is set, preference is given to a -64-bit BLAS, but a 32-bit BLAS library will be used if no 64-bit library is -found. +`ANY`. In this case, if `SUITESPARSE_USE_64BIT_BLAS` is ON, preference is +given to a 64-bit BLAS, but a 32-bit BLAS library will be used if no 64-bit +library is found. However, if both `SUITESPARSE_USE_64BIT_BLAS` and +`SUITESPARSE_USE_STRICT` are ON, then only a 64-bit BLAS is considered. -When selecting a particular BLAS library, the `ALLOW_64BIT_BLAS` setting is -strictly followed. If set to true, only a 64-bit BLAS library will be used. -If false (the default), only a 32-bit BLAS library will be used. If no such -BLAS is found, the build will fail. +When selecting a particular BLAS library, the `SUITESPARSE_USE_64BIT_BLAS` +setting is strictly followed. If set to true, only a 64-bit BLAS library will +be used. If false (the default), only a 32-bit BLAS library will be used. If +no such BLAS is found, the build will fail. ------------------- -SuiteSparse/README ------------------- +----------------------------------------------------------------------------- +QUICK START FOR THE C/C++ LIBRARIES: +----------------------------------------------------------------------------- -Packages in SuiteSparse, and files in this directory: +Type the following in this directory (requires system priviledge to do the +`sudo make install`): +``` + mkdir -p build && cd build + cmake .. + cmake --build . + sudo cmake --install . +``` + +All libraries will be created and installed into the default system-wide folder +(/usr/local/lib on Linux). All include files needed by the applications that +use SuiteSparse are installed into /usr/local/include/suitesparse (on Linux). + +To build only a subset of libraries, set `SUITESPARSE_ENABLE_PROJECTS` when +configuring with CMake. E.g., to build and install CHOLMOD and CXSparse +(including their dependencies), use the following commands: +``` + mkdir -p build && cd build + cmake -DSUITESPARSE_ENABLE_PROJECTS="cholmod;cxsparse" .. + cmake --build . + sudo cmake --install . +``` + +For Windows (MSVC), import the `CMakeLists.txt` file into MS Visual Studio. +Be sure to specify the build type as Release; for example, to build SuiteSparse +on Windows in the command window, run: +``` + mkdir -p build && cd build + cmake .. + cmake --build . --config Release + cmake --install . +``` + +Be sure to first install all required libraries: BLAS and LAPACK for UMFPACK, +CHOLMOD, and SPQR, and GMP and MPFR for SPEX. Be sure to use the latest +libraries; SPEX requires MPFR 4.0.2 and GMP 6.1.2 (these version numbers +do NOT correspond to the X.Y.Z suffix of libgmp.so.X.Y.Z and libmpfr.so.X.Y.Z; +see the SPEX user guide for details). - GraphBLAS graph algorithms in the language of linear algebra. - https://graphblas.org - author: Tim Davis - - SPEX solves sparse linear systems in exact arithmetic. - Requires the GNU GMP and MPRF libraries. - This will be soon replaced by a more general package, SPEX v3 - that includes this method (exact sparse LU) and others (sparse - exact Cholesky, and sparse exact update/downdate). The API - of v3 will be changing significantly. - - AMD approximate minimum degree ordering. This is the built-in AMD - function in MATLAB. - authors: Tim Davis, Patrick Amestoy, Iain Duff - - bin where programs are placed when compiled - - BTF permutation to block triangular form - authors: Tim Davis, Ekanathan Palamadai - - CAMD constrained approximate minimum degree ordering - authors: Tim Davis, Patrick Amestoy, Iain Duff, Yanqing Chen - - CCOLAMD constrained column approximate minimum degree ordering - authors: Tim Davis, Sivasankaran Rajamanickam, Stefan Larimore. - Algorithm design collaborators: Esmond Ng, John Gilbert - (for COLAMD) - - ChangeLog a summary of changes to SuiteSparse. See */Doc/ChangeLog - for details for each package. - - CHOLMOD sparse Cholesky factorization. Requires AMD, COLAMD, CCOLAMD, - the BLAS, and LAPACK. Optionally uses METIS. This is chol and - x=A\b in MATLAB. - author for all modules: Tim Davis - CHOLMOD/Modify module authors: Tim Davis and William W. Hager - - COLAMD column approximate minimum degree ordering. This is the - built-in COLAMD function in MATLAB. - authors (of the code): Tim Davis and Stefan Larimore - Algorithm design collaborators: Esmond Ng, John Gilbert - - Contents.m a list of contents for 'help SuiteSparse' in MATLAB. - - CSparse a concise sparse matrix package, developed for my - book, "Direct Methods for Sparse Linear Systems", - published by SIAM. Intended primarily for teaching. - Note that the code is (c) Tim Davis, as stated in the book. - For production, use CXSparse instead. In particular, both - CSparse and CXSparse have the same include filename: cs.h. - This package is used for the built-in DMPERM in MATLAB. - author: Tim Davis - - CXSparse CSparse Extended. Includes support for complex matrices - and both int or long integers. Use this instead of CSparse - for production use; it creates a libcsparse.so (or *dylib on - the Mac) with the same name as CSparse. It is a superset - of CSparse. Any code that links against CSparse should - also be able to link against CXSparse instead. - author: Tim Davis, David Bateman - - include 'make install' places user-visible include files for each - package here, after 'make local' - - KLU sparse LU factorization, primarily for circuit simulation. - Requires AMD, COLAMD, and BTF. Optionally uses CHOLMOD, - CAMD, CCOLAMD, and METIS. - authors: Tim Davis, Ekanathan Palamadai - - LDL a very concise LDL' factorization package - author: Tim Davis - - lib 'make install' places shared libraries for each package - here, after 'make local' - - Makefile to compile all of SuiteSparse - - make compiles SuiteSparse libraries. - Subsequent "make install" will install - in just CMAKE_INSTALL_PATH (defaults to - /usr/local/lib on Linux or Mac). - - make both compiles SuiteSparse, and then "make install" - will instal in both ./lib and - CMAKE_INSTALL_PATH). - - make local compiles SuiteSparse. - Subsequent "make install will install only - in ./lib, ./include only. - Does not install in CMAKE_INSTALL_PATH. - - make global compiles SuiteSparse libraries. - Subsequent "make install" will install in - just /usr/local/lib (or whatever your - CMAKE_INSTALL_PREFIX is). - Does not install in ./lib and ./include. - - make install installs in the current directory - (./lib, ./include), and/or in - /usr/local/lib and /usr/local/include, - depending on whether "make", "make local", - "make global", or "make both", - etc has been done. - - make uninstall undoes 'make install' - - make distclean removes all files not in distribution, including - ./bin, ./share, ./lib, and ./include. - - make purge same as 'make distclean' - - make clean removes all files not in distribution, but - keeps compiled libraries and demoes, ./lib, - ./share, and ./include. - - Each individual package also has each of the above 'make' - targets. - - Things you don't need to do: - make docs creates user guides from LaTeX files - make cov runs statement coverage tests (Linux only) - - MATLAB_Tools various m-files for use in MATLAB - author: Tim Davis (all parts) - for spqr_rank: author Les Foster and Tim Davis - - Contents.m list of contents - dimacs10 loads matrices for DIMACS10 collection - Factorize object-oriented x=A\b for MATLAB - find_components finds connected components in an image - GEE simple Gaussian elimination - getversion.m determine MATLAB version - gipper.m create MATLAB archive - hprintf.m print hyperlinks in command window - LINFACTOR predecessor to Factorize package - MESHND nested dissection ordering of regular meshes - pagerankdemo.m illustrates how PageRank works - SFMULT C=S*F where S is sparse and F is full - shellgui display a seashell - sparseinv sparse inverse subset - spok check if a sparse matrix is valid - spqr_rank SPQR_RANK package. MATLAB toolbox for rank - deficient sparse matrices: null spaces, - reliable factorizations, etc. With Leslie - Foster, San Jose State Univ. - SSMULT C=A*B where A and B are both sparse - SuiteSparseCollection for the SuiteSparse Matrix Collection - waitmex waitbar for use inside a mexFunction - - The SSMULT and SFMULT functions are the basis for the - built-in C=A*B functions in MATLAB. - - Mongoose graph partitioning. - authors: Nuri Yeralan, Scott Kolodziej, William Hager, Tim Davis - - CHOLMOD/SuiteSparse_metis: a modified version of METIS, embedded into - the CHOLMOD library. See the README.txt files - for details. author: George Karypis. This is a slightly - modified copy included with SuiteSparse via the open-source - license provided by George Karypis. SuiteSparse cannot use - an unmodified copy METIS. - - RBio read/write sparse matrices in Rutherford/Boeing format - author: Tim Davis - - README.txt this file - - SPQR sparse QR factorization. This the built-in qr and x=A\b in - MATLAB. Also called SuiteSparseQR. - author of the CPU code: Tim Davis - author of GPU modules: Tim Davis, Nuri Yeralan, - Wissam Sid-Lakhdar, Sanjay Ranka - - GPUQREngine: GPU support package for SPQR - (not built into MATLAB, however) - authors: Tim Davis, Nuri Yeralan, Sanjay Ranka, - Wissam Sid-Lakhdar - - SuiteSparse_config configuration file for all the above packages. - CSparse and MATLAB_Tools do not use SuiteSparse_config. - author: Tim Davis - - SuiteSparse_GPURuntime GPU support package for SPQR and CHOLMOD - (not builtin to MATLAB, however). - - SuiteSparse_install.m install SuiteSparse for MATLAB - SuiteSparse_paths.m set paths for SuiteSparse MATLAB mexFunctions - - SuiteSparse_test.m exhaustive test for SuiteSparse in MATLAB - - ssget MATLAB interface to the SuiteSparse Matrix Collection - author: Tim Davis - - UMFPACK sparse LU factorization. Requires AMD and the BLAS. - This is the built-in lu and x=A\b in MATLAB. - author: Tim Davis - algorithm design collaboration: Iain Duff - -Some codes optionally use METIS 5.1.0. This package is located in SuiteSparse -in the `CHOLMOD/SuiteSparse_metis` directory. Its use is optional. To compile -CHOLMOD without it, use the CMAKE_OPTIONS="-DNPARTITION=1" setting. The use of -METIS can improve ordering quality for some matrices, particularly large 3D -discretizations. METIS has been slightly modified for use in SuiteSparse; see -the `CHOLMOD/SuiteSparse_metis/README.txt` file for details. +To compile the libraries and install them only in SuiteSparse/lib (not +/usr/local/lib), do this instead in the top-level of SuiteSparse: +``` + mkdir -p build && cd build + cmake -DCMAKE_INSTALL_PREFIX=.. .. + cmake --build . + cmake --install . +``` -Refer to each package for license, copyright, and author information. All -codes are authored or co-authored by Timothy A. Davis (email: davis@tamu.edu), -except for METIS (by George Karypis), GraphBLAS/cpu_features (by Google), -GraphBLAS/lz4 and zstd (by Yann Collet, now at Facebook), and -GraphBLAS/CUDA/jitify.hpp (by NVIDIA). Parts of GraphBLAS/CUDA are -Copyright (c) by NVIDIA. Please refer to each of these licenses. +If you add /home/me/SuiteSparse/lib to your library search path +(`LD_LIBRARY_PATH` in Linux), you can do the following (for example): +``` + S = /home/me/SuiteSparse + cc myprogram.c -I$(S)/include/suitesparse -lumfpack -lamd -lcholmod -lsuitesparseconfig -lm +``` + +To change the C and C++ compilers, and to compile in parallel use: +``` + cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER==g++ .. +``` + +for example, which changes the compiler to gcc and g++. + +This will work on Linux/Unix and the Mac. It should automatically detect if +you have the Intel compilers or not, and whether or not you have CUDA. + +See `SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake` to select your BLAS. -Licenses for each package are located in the following files, all in -PACKAGENAME/Doc/License.txt, and these files are also concatenated into -the top-level LICENSE.txt file. +You may also need to add SuiteSparse/lib to your path. If your copy of +SuiteSparse is in /home/me/SuiteSparse, for example, then add this to your +`~/.bashrc` file: + +``` +LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/me/SuiteSparse/lib +export LD_LIBRARY_PATH +``` + +For the Mac, use this instead: +``` +DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/home/me/SuiteSparse/lib +export DYLD_LIBRARY_PATH +``` + +Default install location of files is below, where PACKAGE is one of the +packages in SuiteSparse: + + * `CMAKE_INSTALL_PREFIX/include/suitesparse/`: include files + * `CMAKE_INSTALL_PREFIX/lib/`: compiled libraries + * `CMAKE_INSTALL_PREFIX/lib/cmake/SuiteSparse/`: `*.cmake` scripts + for all of SuiteSparse + * `CMAKE_INSTALL_PREFIX/lib/cmake/PACKAGE/`: `*Config.cmake` scripts for a + specific package + * `CMAKE_INSTALL_PREFIX/lib/pkgconfig/PACKAGE.pc`: `.pc` scripts for + a specific package pkgconfig ----------------------------------------------------------------------------- QUICK START FOR MATLAB USERS (Linux or Mac): ----------------------------------------------------------------------------- -Uncompress the SuiteSparse.zip or SuiteSparse.tar.gz archive file (they contain -the same thing). Suppose you place SuiteSparse in the /home/me/SuiteSparse -folder. - -Add the SuiteSparse/lib folder to your run-time library path. On Linux, add -this to your ~/.bashrc script, assuming /home/me/SuiteSparse is the location of -your copy of SuiteSparse: +Suppose you place SuiteSparse in the `/home/me/SuiteSparse` folder. +Add the `SuiteSparse/lib` folder to your run-time library path. On Linux, add +this to your `~/.bashrc` script, assuming `/home/me/SuiteSparse` is the +location of your copy of SuiteSparse: +``` LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/me/SuiteSparse/lib export LD_LIBRARY_PATH +``` -For the Mac, use this instead, in your ~/.zshrc script, assuming you place -SuiteSparse in /Users/me/SuiteSparse: - +For the Mac, use this instead, in your `~/.zshrc` script, assuming you place +SuiteSparse in `/Users/me/SuiteSparse`: +``` DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/Users/me/SuiteSparse/lib export DYLD_LIBRARY_PATH +``` -Compile all of SuiteSparse with "make local". +Compile all of SuiteSparse with `make local`. Next, compile the GraphBLAS MATLAB library. In the system shell while in the -SuiteSparse folder, type "make gbmatlab" if you want to install it system-wide -with "make install", or "make gblocal" if you want to use the library in +SuiteSparse folder, type `make gbmatlab` if you want to install it system-wide +with `make install`, or `make gblocal` if you want to use the library in your own SuiteSparse/lib. Then in the MATLAB Command Window, cd to the SuiteSparse directory and type @@ -521,162 +860,391 @@ Documents/MATLAB/startup.m. You can also use the `SuiteSparse_paths` m-file to set all your paths at the start of each MATLAB session. ----------------------------------------------------------------------------- -QUICK START FOR THE C/C++ LIBRARIES: +Compilation options ----------------------------------------------------------------------------- -For Linux and Mac: type the following in this directory (requires system -priviledge to do the `sudo make install`): +You can set specific options for CMake with the command (for example): +``` + cmake -DCHOLMOD_PARTITION=OFF -DBUILD_STATIC_LIBS=OFF -DCMAKE_BUILD_TYPE=Debug .. +``` - make - sudo make install +That command will compile all of SuiteSparse except for CHOLMOD/Partition +Module (because of `-DCHOLMOD_PARTITION=OFF`). Debug mode will be used (the +build type). The static libraries will not be built (since +`-DBUILD_STATIC_LIBS=OFF` is set). -All libraries will be created and copied into SuiteSparse/lib and into -/usr/local/lib. All include files need by the applications that use -SuiteSparse are copied into SuiteSparse/include and into /usr/local/include. +* `SUITESPARSE_ENABLE_PROJECTS`: -For Windows, import each `*/CMakeLists.txt` file into MS Visual Studio. + Semicolon separated list of projects to be built or `all`. + Default: `all` in which case the following projects are built: -Be sure to first install all required libraries: BLAS and LAPACK for UMFPACK, -CHOLMOD, and SPQR, and GMP and MPFR for SPEX. Be sure to use the latest -libraries; SPEX requires MPFR 4.0.2 and GMP 6.1.2 (these version numbers -do NOT correspond to the X.Y.Z suffix of libgmp.so.X.Y.Z and libmpfr.so.X.Y.Z; -see the SPEX user guide for details). + `suitesparse_config;mongoose;amd;btf;camd;ccolamd;colamd;cholmod;cxsparse;ldl;klu;umfpack;paru;rbio;spqr;spex;graphblas;lagraph` -To compile the libraries and install them only in SuiteSparse/lib (not -/usr/local/lib), do this instead in the top-level of SuiteSparse: + Additionally, `csparse` can be included in that list to build CSparse. - make local +* `CMAKE_BUILD_TYPE`: -If you add /home/me/SuiteSparse/lib to your library search path -(`LD_LIBRARY_PATH` in Linux), you can do the following (for example): + Default: `Release`, use `Debug` for debugging. - S = /home/me/SuiteSparse - cc myprogram.c -I$(S)/include -lumfpack -lamd -lcholmod -lsuitesparseconfig -lm +* `SUITESPARSE_USE_STRICT`: -To change the C and C++ compilers, and to compile in parallel use: + SuiteSparse has many user-definable settings of the form `SUITESPARSE_USE_*` + or `(package)_USE_*` for some particular package. In general, these settings + are not strict. For example, if `SUITESPARSE_USE_OPENMP` is `ON` then OpenMP + is preferred, but SuiteSparse can be used without OpenMP so no error is + generated if OpenMP is not found. However, if `SUITESPARSE_USE_STRICT` is + `ON` then all `*_USE_*` settings are treated strictly and an error occurs + if any are set to `ON` but the corresponding package or setting is not + available. The `*_USE_SYSTEM_*` settings are always treated as strict. + Default: `OFF`. - CC=gcc CX=g++ JOBS=32 make +* `SUITESPARSE_USE_CUDA`: -for example, which changes the compiler to gcc and g++, and runs make with -'make -j32', in parallel with 32 jobs. + If set to `ON`, CUDA is enabled for all of SuiteSparse. Default: `ON`, -This will work on Linux/Unix and the Mac. It should automatically detect if -you have the Intel compilers or not, and whether or not you have CUDA. + CUDA on Windows with MSVC appears to be working with this release, but it + should be considered as a prototype and may not be fully functional. I have + limited resources for testing CUDA on Windows. If you encounter issues, + disable CUDA and post this as an issue on GitHub. -NOTE: Use of the Intel MKL BLAS is strongly recommended. The OpenBLAS can -(rarely) result in severe performance degradation, in CHOLMOD in particular. -The reason for this is still under investigation and might already be resolved -in the current version of OpenBLAS. See -`SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake` to select your BLAS. +* `CHOLMOD_USE_CUDA`: -You may also need to add SuiteSparse/lib to your path. If your copy of -SuiteSparse is in /home/me/SuiteSparse, for example, then add this to your -~/.bashrc file: + Default: `ON`. Both `SUITESPARSE_USE_CUDA` and `CHOLMOD_USE_CUDA` must be + enabled to use CUDA in CHOLMOD. - LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/me/SuiteSparse/lib - export LD_LIBRARY_PATH +* `SPQR_USE_CUDA`: -For the Mac, use this instead: + Default: `ON`. Both `SUITESPARSE_USE_CUDA` and `SPQR_USE_CUDA` must be + enabled to use CUDA in SPQR. - DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/home/me/SuiteSparse/lib - export DYLD_LIBRARY_PATH +* `CMAKE_INSTALL_PREFIX`: ------------------------------------------------------------------------------ -Python interface ------------------------------------------------------------------------------ + Defines the install location (default on Linux is `/usr/local`). For example, + this command while in a folder `build` in the top level SuiteSparse folder + will set the install directory to `/stuff`, used by the subsequent + `sudo cmake --install .`: +``` + cmake -DCMAKE_INSTALL_PREFIX=/stuff .. + sudo cmake --install . +``` -See scikit-sparse and scikit-umfpack for the Python interface via SciPy: +* `SUITESPARSE_PKGFILEDIR`: + + Directory where CMake Config and pkg-config files will be installed. By + default, CMake Config files will be installed in the subfolder `cmake` of the + directory where the (static) libraries will be installed (e.g., `lib`). The + `.pc` files for pkg-config will be installed in the subfolder `pkgconfig` of + the directory where the (static) libraries will be installed. + + This option allows to install them at a location different from the (static) + libraries. This allows to install multiple configurations of the SuiteSparse + libraries at the same time (e.g., by also setting a different + `CMAKE_RELEASE_POSTFIX` and `CMAKE_INSTALL_LIBDIR` for each of them). To pick + up the respective configuration in downstream projects, set, e.g., + `CMAKE_PREFIX_PATH` (for CMake) or `PKG_CONFIG_PATH` (for build systems using + pkg-config) to the path containing the respective CMake Config files or + pkg-config files. + +* `SUITESPARSE_INCLUDEDIR_POSTFIX`: + + Postfix for installation target of header from SuiteSparse. Default: + suitesparse, so the default include directory is: + `CMAKE_INSTALL_PREFIX/include/suitesparse` + +* `BUILD_SHARED_LIBS`: -https://github.com/scikit-sparse/scikit-sparse + If `ON`, shared libraries are built. + Default: `ON`. -https://github.com/scikit-umfpack/scikit-umfpack +* `BUILD_STATIC_LIBS`: + + If `ON`, static libraries are built. + Default: `ON`, except for GraphBLAS, which takes a long time to compile so + the default for GraphBLAS is `OFF` unless `BUILD_SHARED_LIBS` is `OFF`. + +* `SUITESPARSE_CUDA_ARCHITECTURES`: + + A string, such as `"all"` or `"35;50;75;80"` that lists the CUDA + architectures to use when compiling CUDA kernels with `nvcc`. The `"all"` + option requires CMake 3.23 or later. Default: `"52;75;80"`. + +* `BLA_VENDOR`: + + A string. Leave unset, or use `"ANY"` to select any BLAS library (the + default). Or set to the name of a `BLA_VENDOR` defined by FindBLAS.cmake. + See: + https://cmake.org/cmake/help/latest/module/FindBLAS.html#blas-lapack-vendors + +* `SUITESPARSE_USE_64BIT_BLAS`: + + If `ON`, look for a 64-bit BLAS. If `OFF`: 32-bit only. Default: `OFF`. + +* `SUITESPARSE_USE_OPENMP`: + + If `ON`, OpenMP is used by default if it is available. Default: `ON`. + + GraphBLAS, LAGraph, and ParU will be vastly slower if OpenMP is not used. + CHOLMOD will be somewhat slower without OpenMP (as long as it still has a + parallel BLAS/LAPACK). Three packages (UMFPACK, CHOLMOD, and SPQR) rely + heavily on parallel BLAS/LAPACK libraries and those libraries may use OpenMP + internally. If you wish to disable OpenMP in an entire application, select a + single-threaded BLAS/LAPACK, or a parallel BLAS/LAPACK that does not use + OpenMP (such as the Apple Accelerate Framework). Using a single-threaded + BLAS/LAPACK library will cause UMFPACK, CHOLMOD, and SPQR to be vastly + slower. + + WARNING: GraphBLAS may not be thread-safe if built without OpenMP or pthreads + (see the GraphBLAS User Guide for details). + +* `SUITESPARSE_CONFIG_USE_OPENMP`: + + If `ON`, `SuiteSparse_config` uses OpenMP if it is available. + Default: `SUITESPARSE_USE_OPENMP`. + It is not essential and only used to let `SuiteSparse_time` call + `omp_get_wtime`. + +* `CHOLMOD_USE_OPENMP`: + + If `ON`, OpenMP is used in CHOLMOD if it is available. + Default: `SUITESPARSE_USE_OPENMP`. + +* `GRAPHBLAS_USE_OPENMP`: + + If `ON`, OpenMP is used in GraphBLAS if it is available. + Default: `SUITESPARSE_USE_OPENMP`. + +* `LAGRAPH_USE_OPENMP`: + + If `ON`, OpenMP is used in LAGraph if it is available. + Default: `SUITESPARSE_USE_OPENMP`. + +* `PARU_USE_OPENMP`: + + If `ON`, OpenMP is used in ParU if it is available. + Default: `SUITESPARSE_USE_OPENMP`. + +* `SPEX_USE_OPENMP`: + + If `ON`, OpenMP is used in SPEX if it is available. + Default: `SUITESPARSE_USE_OPENMP`. + +* `SUITESPARSE_DEMOS`: + + If `ON`, build the demo programs for each package. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_BTF`: + + If `ON`, use BTF libraries installed on the build system. If `OFF`, + automatically build BTF as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_CHOLMOD`: + + If `ON`, use CHOLMOD libraries installed on the build system. If `OFF`, + automatically build CHOLMOD as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_AMD`: + + If `ON`, use AMD libraries installed on the build system. If `OFF`, + automatically build AMD as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_COLAMD`: + + If `ON`, use COLAMD libraries installed on the build system. If `OFF`, + automatically build COLAMD as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_CAMD`: + + If `ON`, use CAMD libraries installed on the build system. If `OFF`, + automatically build CAMD as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_CCOLAMD`: + + If `ON`, use CCOLAMD libraries installed on the build system. If `OFF`, + automatically build CCOLAMD as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_GRAPHBLAS`: + + If `ON`, use GraphBLAS libraries installed on the build system. If `OFF`, + automatically build GraphBLAS as dependency if needed. Default: `OFF`. + +* `SUITESPARSE_USE_SYSTEM_SUITESPARSE_CONFIG`: + + If `ON`, use `SuiteSparse_config` libraries installed on the build system. If + `OFF`, automatically build `SuiteSparse_config` as dependency if needed. + Default: `OFF`. + +* `SUITESPARSE_USE_FORTRAN` + + If `ON`, use the Fortran compiler to determine how C calls Fortan, and to + build several optional Fortran routines. If `OFF`, use + `SUITESPARSE_C_TO_FORTRAN` to define how C calls Fortran. + Default: `ON`. + +* `SUITESPARSE_C_TO_FORTRAN` + + A string that defines how C calls Fortran (i.e., functions exported by the + BLAS library). This setting is used if no working Fortran compiler could be + detected or `SUITESPARSE_USE_FORTRAN` is set to `OFF`. This string is to be + read as the argument list and the body of a preprocessor macro. The first + argument to that macro is any Fortran function name in lowercase letters. + The second argument is the same function name in uppercase letters. The body + defines by which function name Fortran functions are called. This is + necessary because Fortran is case-insensitive, and different Fortran + compilers use different name mangling conventions. If a MSVC C/C++ compiler + is used, this defaults to `"(name,NAME) name"` (i.e., lower case without + trailing underscore). That is the name mangling convention for the Intel + Fortran compiler on Windows. If any other C/C++ compilers are used, this + defaults to `"(name,NAME) name##_"` (i.e., lower case with trailing + underscore). That is the name mangling convention for most of the commonly + used Fortran compilers (like `ifx` on platforms other than Windows, + `gfortran`, `flang`, ...). The latter name mangling convention is also used + by default by OpenBLAS (independent on the platform or the compiler used to + build OpenBLAS). You might need to configure with + `-DSUITESPARSE_C_TO_FORTRAN="(name,NAME) name##_"` if you'd like to build + SuiteSparse using a MSVC compiler and link to OpenBLAS. + +Additional options are available for specific packages: + +* `UMFPACK_USE_CHOLMOD`: + + If `ON`, UMFPACK uses CHOLMOD for additional (optional) + ordering options. Default: `ON`. + +* `KLU_USE_CHOLMOD`: + + If `ON`, KLU uses CHOLMOD for additional (optional) + ordering options. Default: `ON`. + +CHOLMOD is composed of a set of Modules that can be independently selected; +all options default to `ON`: + +* `CHOLMOD_GPL` + + If `OFF`, do not build any GPL-licensed module (MatrixOps, Modify, Supernodal, + and GPU modules) + +* `CHOLMOD_CHECK` + + If `OFF`, do not build the Check module. + +* `CHOLMOD_MATRIXOPS` + + If `OFF`, do not build the MatrixOps module. + +* `CHOLMOD_CHOLESKY` + If `OFF`, do not build the Cholesky module. This also disables the Supernodal + and Modify modules. + +* `CHOLMOD_MODIFY` + + If `OFF`, do not build the Modify module. + +* `CHOLMOD_CAMD` + + If `OFF`, do not link against CAMD and CCOLAMD. This also disables the + Partition module. + +* `CHOLMOD_PARTITION` + + If `OFF`, do not build the Partition module. + +* `CHOLMOD_SUPERNODAL` + + If `OFF`, do not build the Supernodal module. ----------------------------------------------------------------------------- -Compilation options +Possible build/install issues ----------------------------------------------------------------------------- -You can set specific options for CMake with the command (for example): +One common issue can affect all packages: getting the right #include files +that match the current libraries being built. It's possible that your Linux +distro has an older copy of SuiteSparse headers in /usr/include or +/usr/local/include, or that Homebrew has installed its suite-sparse bundle into +/opt/homebrew/include or other places. Old libraries can appear in in +/usr/local/lib, /usr/lib, etc. When building a new copy of SuiteSparse, the +cmake build system is normally (or always?) able to avoid these, and use the +right header for the right version of each library. + +As an additional guard against this possible error, each time one SuiteSparse +package #include's a header from another one, it checks the version number in +the header file, and reports an #error to the compiler if a stale version is +detected. In addition, the Example package checks both the header version and +the library version (by calling a function in each library). If the versions +mismatch in any way, the Example package reports an error at run time. + +For example, CHOLMOD 5.1.0 requires AMD 3.3.0 or later. If it detects an +older one in `amd.h`, it will report an `#error`: + +``` + #include "amd.h" + #if ( ... AMD version is stale ... ) + #error "CHOLMOD 5.1.0 requires AMD 3.3.0 or later" + #endif +``` + +and the compilation will fail. The Example package makes another check, +by calling `amd_version` and comparing it with the versions from the `amd.h` +header file. + +If this error or one like it occurs, check to see if you have an old copy of +SuiteSparse, and uninstall it before compiling your new copy of SuiteSparse. + +There are other many possible build/install issues that are covered by the +corresponding user guides for each package, such as finding the right BLAS, +OpenMP, and other libraries, and how to compile on the Mac when using GraphBLAS +inside MATLAB, and so on. Refer to the User Guides for more details. - CMAKE_OPTIONS="-DNPARTITION=1 -DNSTATIC=1 -DCMAKE_BUILD_TYPE=Debug" make +----------------------------------------------------------------------------- +Interfaces to SuiteSparse +----------------------------------------------------------------------------- -That command will compile all of SuiteSparse except for CHOLMOD/Partition -Module. Debug mode will be used. The static libraries will not be built -(NSTATIC is true). - - CMAKE_BUILD_TYPE: Default: "Release", use "Debug" for debugging. - - ENABLE_CUDA: if set to true, CUDA is enabled for the project. - Default: true for CHOLMOD and SPQR; false otherwise - - LOCAL_INSTALL: if true, "cmake --install" will install - into SuiteSparse/lib and SuiteSparse/include. - if false, "cmake --install" will install into the - default prefix (or the one configured with - CMAKE_INSTALL_PREFIX). - Default: false - - NSTATIC: if true, static libraries are not built. - Default: false, except for GraphBLAS, which - takes a long time to compile so the default for - GraphBLAS is true. For Mongoose, the NSTATIC setting - is treated as if it always false, since the mongoose - program is built with the static library. - - SUITESPARSE_CUDA_ARCHITECTURES: a string, such as "all" or - "35;50;75;80" that lists the CUDA architectures to use - when compiling CUDA kernels with nvcc. The "all" - option requires cmake 3.23 or later. - Default: "52;75;80". - - BLA_VENDOR a string. Leave unset, or use "ANY" to select any BLAS - library (the default). Or set to the name of a - BLA_VENDOR defined by FindBLAS.cmake. See: - https://cmake.org/cmake/help/latest/module/FindBLAS.html#blas-lapack-vendors - - ALLOW_64BIT_BLAS if true: look for a 64-bit BLAS. If false: 32-bit only. - Default: false. - - NOPENMP if true: OpenMP is not used. Default: false. - UMFPACK, CHOLMOD, SPQR, and GraphBLAS will be slow. - Note that BLAS and LAPACK may still use OpenMP - internally; if you wish to disable OpenMP in an entire - application, select a single-threaded BLAS/LAPACK. - WARNING: GraphBLAS may not be thread-safe if built - without OpenMP (see the User Guide for details). - - DEMO if true: build the demo programs for each package. - Default: false. - -Additional options are available within specific packages: - - NCHOLMOD if true, UMFPACK and KLU do not use CHOLMOD for - additional (optional) ordering options +MATLAB/Octave/R/Mathematica interfaces: -CHOLMOD is composed of a set of Modules that can be independently selected; -all options default to false: - - NGL if true: do not build any GPL-licensed module - (MatrixOps, Modify, Supernodal, and GPU modules) - NCHECK if true: do not build the Check module. - NMATRIXOPS if true: do not build the MatrixOps module. - NCHOLESKY if true: do not build the Cholesky module. - This also disables the Supernodal and Modify modules. - NMODIFY if true: do not build the Modify module. - NCAMD if true: do not link against CAMD and CCOLAMD. - This also disables the Partition module. - NPARTITION if true: do not build the Partition module. - NSUPERNODAL if true: do not build the Supernodal module. + Many built-in methods in MATLAB and Octave rely on SuiteSparse, including + `C=A*B` `x=A\b`, `L=chol(A)`, `[L,U,P,Q]=lu(A)`, `R=qr(A)`, `dmperm(A)`, + `p=amd(A)`, `p=colamd(A)`, ... + See also Mathematica, R, and many many more. The list is too long. + +Julia interface: + + https://github.com/JuliaSparse/SparseArrays.jl + +python interface to GraphBLAS by Anaconda and NVIDIA: + + https://pypi.org/project/python-graphblas + +Intel's Go interface to GraphBLAS: + + https://pkg.go.dev/github.com/intel/forGraphBLASGo + +See scikit-sparse and scikit-umfpack for the Python interface via SciPy: + + https://github.com/scikit-sparse/scikit-sparse + https://github.com/scikit-umfpack/scikit-umfpack + +See math.js by Jos de Jong for a JavaScript port of CSparse: + + https://github.com/josdejong/mathjs + +See russell for a Rust interface: + + https://github.com/cpmech/russell ----------------------------------------------------------------------------- Acknowledgements ----------------------------------------------------------------------------- -I would like to thank François Bissey, Sebastien Villemot, Erik Welch, Jim -Kitchen, Markus Mützel, and Fabian Wein for their valuable feedback on the +Markus Mützel contributed the most recent update of the SuiteSparse build +system for all SuiteSparse packages, extensively porting it and modernizing it. + +I would also like to thank François Bissey, Sebastien Villemot, Erik Welch, Jim +Kitchen, and Fabian Wein for their valuable feedback on the SuiteSparse build system and how it works with various Linux / Python distros and other package managers. If you are a maintainer of a SuiteSparse packaging for a Linux distro, conda-forge, R, spack, brew, vcpkg, etc, please feel free to contact me if there's anything I can do to make your life easier. +I would also like to thank Raye Kimmerer for adding support for 32-bit +row/column indices in SPQR v4.2.0. See also the various Acknowledgements within each package. diff --git a/SuiteSparse_config/Config/SuiteSparse_config.h.in b/SuiteSparse_config/Config/SuiteSparse_config.h.in index 09d05c92..0d203f55 100644 --- a/SuiteSparse_config/Config/SuiteSparse_config.h.in +++ b/SuiteSparse_config/Config/SuiteSparse_config.h.in @@ -368,13 +368,24 @@ int SuiteSparse_divcomplex // determine which timer to use, if any #ifndef NTIMER + // SuiteSparse_config itself can be compiled without OpenMP, + // but other packages can themselves use OpenMP. In this case, + // those packages should use omp_get_wtime() directly. This can + // be done via the SUITESPARSE_TIME macro, defined below: + #cmakedefine SUITESPARSE_HAVE_CLOCK_GETTIME #if defined ( _OPENMP ) #define SUITESPARSE_TIMER_ENABLED - #elif defined ( _POSIX_C_SOURCE ) - #if _POSIX_C_SOURCE >= 199309L + #define SUITESPARSE_TIME (omp_get_wtime ( )) + #elif defined ( SUITESPARSE_HAVE_CLOCK_GETTIME ) #define SUITESPARSE_TIMER_ENABLED - #endif + #define SUITESPARSE_TIME (SuiteSparse_time ( )) + #else + // No timer is available + #define SUITESPARSE_TIME (0) #endif +#else + // The timer is explictly disabled + #define SUITESPARSE_TIME (0) #endif // SuiteSparse printf macro @@ -414,9 +425,14 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_SUB_VERSION @SUITESPARSE_VERSION_MINOR@ #define SUITESPARSE_SUBSUB_VERSION @SUITESPARSE_VERSION_SUB@ +// version format x.y #define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) -#define SUITESPARSE_VERSION \ - SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION) +#define SUITESPARSE_VERSION SUITESPARSE_VER_CODE(@SUITESPARSE_VERSION_MAJOR@, @SUITESPARSE_VERSION_MINOR@) + +// version format x.y.z +#define SUITESPARSE__VERCODE(main,sub,patch) \ + (((main)*1000ULL + (sub))*1000ULL + (patch)) +#define SUITESPARSE__VERSION SUITESPARSE__VERCODE(@SUITESPARSE_VERSION_MAJOR@,@SUITESPARSE_VERSION_MINOR@,@SUITESPARSE_VERSION_SUB@) //============================================================================== // SuiteSparse interface to the BLAS and LAPACK libraries @@ -469,7 +485,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #elif defined ( BLAS_UNDERSCORE ) - // append an undescore, use lower case + // append an underscore, use lower case #define SUITESPARSE_FORTRAN(name,NAME) name ## _ #define SUITESPARSE__FORTRAN(name,NAME) name ## _ @@ -529,12 +545,12 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // If the suffix does not contain "_", use (Sun Perf., for example): -// cd build ; cmake -DBLAS64_SUFFIX="64" .. +// cd build && cmake -DBLAS64_SUFFIX="64" .. // If the suffix contains "_" (OpenBLAS in spack for example), use the // following: -// cd build ; cmake -DBLAS64_SUFFIX="_64" .. +// cd build && cmake -DBLAS64_SUFFIX="_64" .. // This setting could be used by the spack packaging of SuiteSparse when linked // with the spack-installed OpenBLAS with 64-bit integers. See @@ -572,6 +588,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // C names of Fortan BLAS and LAPACK functions used by SuiteSparse //------------------------------------------------------------------------------ +// double #define SUITESPARSE_BLAS_DTRSV SUITESPARSE_BLAS ( dtrsv , DTRSV ) #define SUITESPARSE_BLAS_DGEMV SUITESPARSE_BLAS ( dgemv , DGEMV ) #define SUITESPARSE_BLAS_DTRSM SUITESPARSE_BLAS ( dtrsm , DTRSM ) @@ -579,8 +596,15 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_BLAS_DSYRK SUITESPARSE_BLAS ( dsyrk , DSYRK ) #define SUITESPARSE_BLAS_DGER SUITESPARSE_BLAS ( dger , DGER ) #define SUITESPARSE_BLAS_DSCAL SUITESPARSE_BLAS ( dscal , DSCAL ) +#define SUITESPARSE_BLAS_DNRM2 SUITESPARSE_BLAS ( dnrm2 , DNRM2 ) + #define SUITESPARSE_LAPACK_DPOTRF SUITESPARSE_BLAS ( dpotrf , DPOTRF ) +#define SUITESPARSE_LAPACK_DLARF SUITESPARSE_BLAS ( dlarf , DLARF ) +#define SUITESPARSE_LAPACK_DLARFG SUITESPARSE_BLAS ( dlarfg , DLARFG ) +#define SUITESPARSE_LAPACK_DLARFT SUITESPARSE_BLAS ( dlarft , DLARFT ) +#define SUITESPARSE_LAPACK_DLARFB SUITESPARSE_BLAS ( dlarfb , DLARFB ) +// double complex #define SUITESPARSE_BLAS_ZTRSV SUITESPARSE_BLAS ( ztrsv , ZTRSV ) #define SUITESPARSE_BLAS_ZGEMV SUITESPARSE_BLAS ( zgemv , ZGEMV ) #define SUITESPARSE_BLAS_ZTRSM SUITESPARSE_BLAS ( ztrsm , ZTRSM ) @@ -588,20 +612,46 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_BLAS_ZHERK SUITESPARSE_BLAS ( zherk , ZHERK ) #define SUITESPARSE_BLAS_ZGERU SUITESPARSE_BLAS ( zgeru , ZGERU ) #define SUITESPARSE_BLAS_ZSCAL SUITESPARSE_BLAS ( zscal , ZSCAL ) -#define SUITESPARSE_LAPACK_ZPOTRF SUITESPARSE_BLAS ( zpotrf , ZPOTRF ) - -#define SUITESPARSE_BLAS_DNRM2 SUITESPARSE_BLAS ( dnrm2 , DNRM2 ) -#define SUITESPARSE_LAPACK_DLARF SUITESPARSE_BLAS ( dlarf , DLARF ) -#define SUITESPARSE_LAPACK_DLARFG SUITESPARSE_BLAS ( dlarfg , DLARFG ) -#define SUITESPARSE_LAPACK_DLARFT SUITESPARSE_BLAS ( dlarft , DLARFT ) -#define SUITESPARSE_LAPACK_DLARFB SUITESPARSE_BLAS ( dlarfb , DLARFB ) - #define SUITESPARSE_BLAS_DZNRM2 SUITESPARSE_BLAS ( dznrm2 , DZNRM2 ) + +#define SUITESPARSE_LAPACK_ZPOTRF SUITESPARSE_BLAS ( zpotrf , ZPOTRF ) #define SUITESPARSE_LAPACK_ZLARF SUITESPARSE_BLAS ( zlarf , ZLARF ) #define SUITESPARSE_LAPACK_ZLARFG SUITESPARSE_BLAS ( zlarfg , ZLARFG ) #define SUITESPARSE_LAPACK_ZLARFT SUITESPARSE_BLAS ( zlarft , ZLARFT ) #define SUITESPARSE_LAPACK_ZLARFB SUITESPARSE_BLAS ( zlarfb , ZLARFB ) +// single +#define SUITESPARSE_BLAS_STRSV SUITESPARSE_BLAS ( strsv , STRSV ) +#define SUITESPARSE_BLAS_SGEMV SUITESPARSE_BLAS ( sgemv , SGEMV ) +#define SUITESPARSE_BLAS_STRSM SUITESPARSE_BLAS ( strsm , STRSM ) +#define SUITESPARSE_BLAS_SGEMM SUITESPARSE_BLAS ( sgemm , SGEMM ) +#define SUITESPARSE_BLAS_SSYRK SUITESPARSE_BLAS ( ssyrk , SSYRK ) +#define SUITESPARSE_BLAS_SGER SUITESPARSE_BLAS ( sger , SGER ) +#define SUITESPARSE_BLAS_SSCAL SUITESPARSE_BLAS ( sscal , SSCAL ) +#define SUITESPARSE_BLAS_SNRM2 SUITESPARSE_BLAS ( snrm2 , SNRM2 ) + +#define SUITESPARSE_LAPACK_SPOTRF SUITESPARSE_BLAS ( spotrf , SPOTRF ) +#define SUITESPARSE_LAPACK_SLARF SUITESPARSE_BLAS ( slarf , SLARF ) +#define SUITESPARSE_LAPACK_SLARFG SUITESPARSE_BLAS ( slarfg , SLARFG ) +#define SUITESPARSE_LAPACK_SLARFT SUITESPARSE_BLAS ( slarft , SLARFT ) +#define SUITESPARSE_LAPACK_SLARFB SUITESPARSE_BLAS ( slarfb , SLARFB ) + +// single complex +#define SUITESPARSE_BLAS_CTRSV SUITESPARSE_BLAS ( ctrsv , CTRSV ) +#define SUITESPARSE_BLAS_CGEMV SUITESPARSE_BLAS ( cgemv , CGEMV ) +#define SUITESPARSE_BLAS_CTRSM SUITESPARSE_BLAS ( ctrsm , CTRSM ) +#define SUITESPARSE_BLAS_CGEMM SUITESPARSE_BLAS ( cgemm , CGEMM ) +#define SUITESPARSE_BLAS_CHERK SUITESPARSE_BLAS ( cherk , CHERK ) +#define SUITESPARSE_BLAS_CGERU SUITESPARSE_BLAS ( cgeru , CGERU ) +#define SUITESPARSE_BLAS_CSCAL SUITESPARSE_BLAS ( cscal , CSCAL ) +#define SUITESPARSE_BLAS_SCNRM2 SUITESPARSE_BLAS ( scnrm2 , SCNRM2 ) + +#define SUITESPARSE_LAPACK_CPOTRF SUITESPARSE_BLAS ( cpotrf , CPOTRF ) +#define SUITESPARSE_LAPACK_CLARF SUITESPARSE_BLAS ( clarf , CLARF ) +#define SUITESPARSE_LAPACK_CLARFG SUITESPARSE_BLAS ( clarfg , CLARFG ) +#define SUITESPARSE_LAPACK_CLARFT SUITESPARSE_BLAS ( clarft , CLARFT ) +#define SUITESPARSE_LAPACK_CLARFB SUITESPARSE_BLAS ( clarfb , CLARFB ) + //------------------------------------------------------------------------------ // prototypes of BLAS and SUITESPARSE_LAPACK functions //------------------------------------------------------------------------------ @@ -627,7 +677,11 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #if defined ( SUITESPARSE_BLAS_DEFINITIONS ) -void SUITESPARSE_BLAS_DGEMV // Y = alpha*A*x + beta*Y +//------------------------------------------------------------------------------ +// gemv: Y = alpha*A*x + beta*Y +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DGEMV ( // input: const char *trans, @@ -659,7 +713,39 @@ void SUITESPARSE_BLAS_DGEMV // Y = alpha*A*x + beta*Y } \ } -void SUITESPARSE_BLAS_ZGEMV // Y = alpha*A*X + beta*Y +void SUITESPARSE_BLAS_SGEMV +( + // input: + const char *trans, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const float *alpha, + const float *A, + const SUITESPARSE_BLAS_INT *lda, + const float *X, + const SUITESPARSE_BLAS_INT *incx, + const float *beta, + // input/output: + float *Y, + // input: + const SUITESPARSE_BLAS_INT *incy +) ; + +#define SUITESPARSE_BLAS_sgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_SGEMV (trans, &M_blas_int, &N_blas_int, alpha, A, \ + &LDA_blas_int, X, &INCX_blas_int, beta, Y, &INCY_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZGEMV ( // input: const char *trans, @@ -691,7 +777,43 @@ void SUITESPARSE_BLAS_ZGEMV // Y = alpha*A*X + beta*Y } \ } -void SUITESPARSE_BLAS_DTRSV // solve Lx=b, Ux=b, L'x=b, or U'x=b +void SUITESPARSE_BLAS_CGEMV +( + // input: + const char *trans, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const void *alpha, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + const void *X, + const SUITESPARSE_BLAS_INT *incx, + const void *beta, + // input/output: + void *Y, + // input: + const SUITESPARSE_BLAS_INT *incy +) ; + +#define SUITESPARSE_BLAS_cgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CGEMV (trans, &M_blas_int, &N_blas_int, alpha, A, \ + &LDA_blas_int, X, &INCX_blas_int, beta, Y, &INCY_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// trsv: solve Lx=b, Ux=b, L'x=b, or U'x=b +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DTRSV ( // input: const char *uplo, @@ -718,7 +840,34 @@ void SUITESPARSE_BLAS_DTRSV // solve Lx=b, Ux=b, L'x=b, or U'x=b } \ } -void SUITESPARSE_BLAS_ZTRSV // solve (L, L', L^H, U, U', or U^H)x=b +void SUITESPARSE_BLAS_STRSV +( + // input: + const char *uplo, + const char *trans, + const char *diag, + const SUITESPARSE_BLAS_INT *n, + const float *A, + const SUITESPARSE_BLAS_INT *lda, + // input/output: + float *X, + // input: + const SUITESPARSE_BLAS_INT *incx +) ; + +#define SUITESPARSE_BLAS_strsv(uplo,trans,diag,n,A,lda,X,incx,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_STRSV (uplo, trans, diag, &N_blas_int, A, \ + &LDA_blas_int, X, &INCX_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZTRSV ( // input: const char *uplo, @@ -745,7 +894,38 @@ void SUITESPARSE_BLAS_ZTRSV // solve (L, L', L^H, U, U', or U^H)x=b } \ } -void SUITESPARSE_BLAS_DTRSM // solve LX=B, UX=B, L'X=B, or U'X=B +void SUITESPARSE_BLAS_CTRSV +( + // input: + const char *uplo, + const char *trans, + const char *diag, + const SUITESPARSE_BLAS_INT *n, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + // input/output: + void *X, + // input: + const SUITESPARSE_BLAS_INT *incx +) ; + +#define SUITESPARSE_BLAS_ctrsv(uplo,trans,diag,n,A,lda,X,incx,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CTRSV (uplo, trans, diag, &N_blas_int, A, \ + &LDA_blas_int, X, &INCX_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// trsm: solve LX=B, UX=B, L'X=B, or U'X=B +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DTRSM ( // input: const char *side, @@ -776,7 +956,38 @@ void SUITESPARSE_BLAS_DTRSM // solve LX=B, UX=B, L'X=B, or U'X=B } \ } -void SUITESPARSE_BLAS_ZTRSM // solve (L, L', L^H, U, U', or U^H)X=B +void SUITESPARSE_BLAS_STRSM +( + // input: + const char *side, + const char *uplo, + const char *transa, + const char *diag, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const float *alpha, + const float *A, + const SUITESPARSE_BLAS_INT *lda, + // input/output: + float *B, + // input: + const SUITESPARSE_BLAS_INT *ldb +) ; + +#define SUITESPARSE_BLAS_strsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb,ok)\ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_STRSM (side, uplo, transa, diag, &M_blas_int, \ + &N_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZTRSM ( // input: const char *side, @@ -807,7 +1018,42 @@ void SUITESPARSE_BLAS_ZTRSM // solve (L, L', L^H, U, U', or U^H)X=B } \ } -void SUITESPARSE_BLAS_DGEMM // C = alpha*A*B + beta*C +void SUITESPARSE_BLAS_CTRSM +( + // input: + const char *side, + const char *uplo, + const char *transa, + const char *diag, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const void *alpha, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + // input/output: + void *B, + // input: + const SUITESPARSE_BLAS_INT *ldb +) ; + +#define SUITESPARSE_BLAS_ctrsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb,ok)\ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CTRSM (side, uplo, transa, diag, &M_blas_int, \ + &N_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// gemm: C = alpha*A*B + beta*C +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DGEMM ( // input: const char *transa, @@ -844,7 +1090,7 @@ void SUITESPARSE_BLAS_DGEMM // C = alpha*A*B + beta*C } \ } -void SUITESPARSE_BLAS_ZGEMM // C = alpha*A*B + beta*C +void SUITESPARSE_BLAS_SGEMM ( // input: const char *transa, @@ -852,19 +1098,19 @@ void SUITESPARSE_BLAS_ZGEMM // C = alpha*A*B + beta*C const SUITESPARSE_BLAS_INT *m, const SUITESPARSE_BLAS_INT *n, const SUITESPARSE_BLAS_INT *k, - const void *alpha, - const void *A, + const float *alpha, + const float *A, const SUITESPARSE_BLAS_INT *lda, - const void *B, + const float *B, const SUITESPARSE_BLAS_INT *ldb, - const void *beta, + const float *beta, // input/output: - void *C, + float *C, // input: const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_BLAS_zgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ +#define SUITESPARSE_BLAS_sgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ C,ldc,ok) \ { \ SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ @@ -875,52 +1121,62 @@ void SUITESPARSE_BLAS_ZGEMM // C = alpha*A*B + beta*C SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_ZGEMM (transa, transb, &M_blas_int, &N_blas_int, \ + SUITESPARSE_BLAS_SGEMM (transa, transb, &M_blas_int, &N_blas_int, \ &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ &LDC_blas_int) ; \ } \ } -void SUITESPARSE_BLAS_DSYRK // C = alpha*A*A' + beta*C, or A'A +void SUITESPARSE_BLAS_ZGEMM ( // input: - const char *uplo, - const char *trans, + const char *transa, + const char *transb, + const SUITESPARSE_BLAS_INT *m, const SUITESPARSE_BLAS_INT *n, const SUITESPARSE_BLAS_INT *k, - const double *alpha, - const double *A, + const void *alpha, + const void *A, const SUITESPARSE_BLAS_INT *lda, - const double *beta, + const void *B, + const SUITESPARSE_BLAS_INT *ldb, + const void *beta, // input/output: - double *C, + void *C, // input: const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_BLAS_dsyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +#define SUITESPARSE_BLAS_zgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ + C,ldc,ok) \ { \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_DSYRK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ - A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + SUITESPARSE_BLAS_ZGEMM (transa, transb, &M_blas_int, &N_blas_int, \ + &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ + &LDC_blas_int) ; \ } \ } -void SUITESPARSE_BLAS_ZHERK // C = alpha*A*A^H + beta*C, or A^H*A +void SUITESPARSE_BLAS_CGEMM ( // input: - const char *uplo, - const char *trans, + const char *transa, + const char *transb, + const SUITESPARSE_BLAS_INT *m, const SUITESPARSE_BLAS_INT *n, const SUITESPARSE_BLAS_INT *k, const void *alpha, const void *A, const SUITESPARSE_BLAS_INT *lda, + const void *B, + const SUITESPARSE_BLAS_INT *ldb, const void *beta, // input/output: void *C, @@ -928,47 +1184,206 @@ void SUITESPARSE_BLAS_ZHERK // C = alpha*A*A^H + beta*C, or A^H*A const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +#define SUITESPARSE_BLAS_cgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ + C,ldc,ok) \ { \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_ZHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ - A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + SUITESPARSE_BLAS_CGEMM (transa, transb, &M_blas_int, &N_blas_int, \ + &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ + &LDC_blas_int) ; \ } \ } -void SUITESPARSE_LAPACK_DPOTRF // Cholesky factorization +//------------------------------------------------------------------------------ +// syrk/herk: C = alpha*A*A' + beta*C ; or C = alpha*A'*A + beta*C +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DSYRK ( // input: const char *uplo, + const char *trans, const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const double *alpha, + const double *A, + const SUITESPARSE_BLAS_INT *lda, + const double *beta, // input/output: - double *A, + double *C, // input: - const SUITESPARSE_BLAS_INT *lda, - // output: - SUITESPARSE_BLAS_INT *info + const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_LAPACK_dpotrf(uplo,n,A,lda,info,ok) \ +#define SUITESPARSE_BLAS_dsyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ { \ SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - info = 1 ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ - SUITESPARSE_LAPACK_DPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ - &LAPACK_Info) ; \ - info = (Int) LAPACK_Info ; \ + SUITESPARSE_BLAS_DSYRK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ } \ } -void SUITESPARSE_LAPACK_ZPOTRF // Cholesky factorization +void SUITESPARSE_BLAS_SSYRK +( + // input: + const char *uplo, + const char *trans, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const float *alpha, + const float *A, + const SUITESPARSE_BLAS_INT *lda, + const float *beta, + // input/output: + float *C, + // input: + const SUITESPARSE_BLAS_INT *ldc +) ; + +#define SUITESPARSE_BLAS_ssyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_SSYRK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZHERK +( + // input: + const char *uplo, + const char *trans, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const void *alpha, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + const void *beta, + // input/output: + void *C, + // input: + const SUITESPARSE_BLAS_INT *ldc +) ; + +#define SUITESPARSE_BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_ZHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_CHERK +( + // input: + const char *uplo, + const char *trans, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const void *alpha, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + const void *beta, + // input/output: + void *C, + // input: + const SUITESPARSE_BLAS_INT *ldc +) ; + +#define SUITESPARSE_BLAS_cherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// potrf: Cholesky factorization +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DPOTRF +( + // input: + const char *uplo, + const SUITESPARSE_BLAS_INT *n, + // input/output: + double *A, + // input: + const SUITESPARSE_BLAS_INT *lda, + // output: + SUITESPARSE_BLAS_INT *info +) ; + +#define SUITESPARSE_LAPACK_dpotrf(uplo,n,A,lda,info,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + info = 1 ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ + SUITESPARSE_LAPACK_DPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ + &LAPACK_Info) ; \ + info = (Int) LAPACK_Info ; \ + } \ +} + +void SUITESPARSE_LAPACK_SPOTRF +( + // input: + const char *uplo, + const SUITESPARSE_BLAS_INT *n, + // input/output: + float *A, + // input: + const SUITESPARSE_BLAS_INT *lda, + // output: + SUITESPARSE_BLAS_INT *info +) ; + +#define SUITESPARSE_LAPACK_spotrf(uplo,n,A,lda,info,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + info = 1 ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ + SUITESPARSE_LAPACK_SPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ + &LAPACK_Info) ; \ + info = (Int) LAPACK_Info ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZPOTRF ( // input: const char *uplo, @@ -995,7 +1410,38 @@ void SUITESPARSE_LAPACK_ZPOTRF // Cholesky factorization } \ } -void SUITESPARSE_BLAS_DSCAL // Y = alpha*Y +void SUITESPARSE_LAPACK_CPOTRF +( + // input: + const char *uplo, + const SUITESPARSE_BLAS_INT *n, + // input/output: + void *A, + // input: + const SUITESPARSE_BLAS_INT *lda, + // output: + SUITESPARSE_BLAS_INT *info +) ; + +#define SUITESPARSE_LAPACK_cpotrf(uplo,n,A,lda,info,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + info = 1 ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ + SUITESPARSE_LAPACK_CPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ + &LAPACK_Info) ; \ + info = LAPACK_Info ; \ + } \ +} + +//------------------------------------------------------------------------------ +// scal: Y = alpha*Y +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DSCAL ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1016,7 +1462,28 @@ void SUITESPARSE_BLAS_DSCAL // Y = alpha*Y } \ } -void SUITESPARSE_BLAS_ZSCAL // Y = alpha*Y +void SUITESPARSE_BLAS_SSCAL +( + // input: + const SUITESPARSE_BLAS_INT *n, + const float *alpha, + // input/output: + float *Y, + // input: + const SUITESPARSE_BLAS_INT *incy +) ; + +#define SUITESPARSE_BLAS_sscal(n,alpha,Y,incy,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_SSCAL (&N_blas_int, alpha, Y, &INCY_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZSCAL ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1037,7 +1504,32 @@ void SUITESPARSE_BLAS_ZSCAL // Y = alpha*Y } \ } -void SUITESPARSE_BLAS_DGER // A = alpha*x*y' + A +void SUITESPARSE_BLAS_CSCAL +( + // input: + const SUITESPARSE_BLAS_INT *n, + const void *alpha, + // input/output: + void *Y, + // input: + const SUITESPARSE_BLAS_INT *incy +) ; + +#define SUITESPARSE_BLAS_cscal(n,alpha,Y,incy,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CSCAL (&N_blas_int, alpha, Y, &INCY_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// ger/geru: A = alpha*x*y' + A +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DGER ( // input: const SUITESPARSE_BLAS_INT *m, @@ -1067,7 +1559,37 @@ void SUITESPARSE_BLAS_DGER // A = alpha*x*y' + A } \ } -void SUITESPARSE_BLAS_ZGERU // A = alpha*x*y' + A +void SUITESPARSE_BLAS_SGER +( + // input: + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const float *alpha, + const float *X, + const SUITESPARSE_BLAS_INT *incx, + const float *Y, + const SUITESPARSE_BLAS_INT *incy, + // input/output: + float *A, + // input: + const SUITESPARSE_BLAS_INT *lda +) ; + +#define SUITESPARSE_BLAS_sger(m,n,alpha,X,incx,Y,incy,A,lda,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_SGER (&M_blas_int, &N_blas_int, alpha, X, \ + &INCX_blas_int, Y, &INCY_blas_int, A, &LDA_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZGERU ( // input: const SUITESPARSE_BLAS_INT *m, @@ -1097,7 +1619,41 @@ void SUITESPARSE_BLAS_ZGERU // A = alpha*x*y' + A } \ } -void SUITESPARSE_LAPACK_DLARFT // T = block Householder factor +void SUITESPARSE_BLAS_CGERU +( + // input: + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const void *alpha, + const void *X, + const SUITESPARSE_BLAS_INT *incx, + const void *Y, + const SUITESPARSE_BLAS_INT *incy, + // input/output: + void *A, + // input: + const SUITESPARSE_BLAS_INT *lda +) ; + +#define SUITESPARSE_BLAS_cgeru(m,n,alpha,X,incx,Y,incy,A,lda,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CGERU (&M_blas_int, &N_blas_int, alpha, X, \ + &INCX_blas_int, Y, &INCY_blas_int, A, &LDA_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// larft: T = block Householder factor +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DLARFT ( // input: const char *direct, @@ -1126,7 +1682,36 @@ void SUITESPARSE_LAPACK_DLARFT // T = block Householder factor } \ } -void SUITESPARSE_LAPACK_ZLARFT // T = block Householder factor +void SUITESPARSE_LAPACK_SLARFT +( + // input: + const char *direct, + const char *storev, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const float *V, + const SUITESPARSE_BLAS_INT *ldv, + const float *Tau, + // output: + float *T, + // input: + const SUITESPARSE_BLAS_INT *ldt +) ; + +#define SUITESPARSE_LAPACK_slarft(direct,storev,n,k,V,ldv,Tau,T,ldt,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_SLARFT (direct, storev, &N_blas_int, &K_blas_int, \ + V, &LDV_blas_int, Tau, T, &LDT_blas_int) ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZLARFT ( // input: const char *direct, @@ -1155,7 +1740,40 @@ void SUITESPARSE_LAPACK_ZLARFT // T = block Householder factor } \ } -void SUITESPARSE_LAPACK_DLARFB // apply block Householder reflector +void SUITESPARSE_LAPACK_CLARFT +( + // input: + const char *direct, + const char *storev, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const void *V, + const SUITESPARSE_BLAS_INT *ldv, + const void *Tau, + // output: + void *T, + // input: + const SUITESPARSE_BLAS_INT *ldt +) ; + +#define SUITESPARSE_LAPACK_clarft(direct,storev,n,k,V,ldv,Tau,T,ldt,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_CLARFT (direct, storev, &N_blas_int, &K_blas_int, \ + V, &LDV_blas_int, Tau, T, &LDT_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// larfb: apply block Householder reflector +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DLARFB ( // input: const char *side, @@ -1197,7 +1815,49 @@ void SUITESPARSE_LAPACK_DLARFB // apply block Householder reflector } \ } -void SUITESPARSE_LAPACK_ZLARFB // apply block Householder reflector +void SUITESPARSE_LAPACK_SLARFB +( + // input: + const char *side, + const char *trans, + const char *direct, + const char *storev, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const float *V, + const SUITESPARSE_BLAS_INT *ldv, + const float *T, + const SUITESPARSE_BLAS_INT *ldt, + // input/output: + float *C, + // input: + const SUITESPARSE_BLAS_INT *ldc, + // workspace: + float *Work, + // input: + const SUITESPARSE_BLAS_INT *ldwork +) ; + +#define SUITESPARSE_LAPACK_slarfb(side,trans,direct,storev,m,n,k,V,ldv,T,ldt, \ + C,ldc,Work,ldwork,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDWORK_blas_int, ldwork, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_SLARFB (side, trans, direct, storev, &M_blas_int, \ + &N_blas_int, &K_blas_int, V, &LDV_blas_int, T, &LDT_blas_int, C, \ + &LDC_blas_int, Work, &LDWORK_blas_int) ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZLARFB ( // input: const char *side, @@ -1239,7 +1899,53 @@ void SUITESPARSE_LAPACK_ZLARFB // apply block Householder reflector } \ } -double SUITESPARSE_BLAS_DNRM2 // vector 2-norm +void SUITESPARSE_LAPACK_CLARFB +( + // input: + const char *side, + const char *trans, + const char *direct, + const char *storev, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const void *V, + const SUITESPARSE_BLAS_INT *ldv, + const void *T, + const SUITESPARSE_BLAS_INT *ldt, + // input/output: + void *C, + // input: + const SUITESPARSE_BLAS_INT *ldc, + // workspace: + void *Work, + // input: + const SUITESPARSE_BLAS_INT *ldwork +) ; + +#define SUITESPARSE_LAPACK_clarfb(side,trans,direct,storev,m,n,k,V,ldv,T,ldt, \ + C,ldc,Work,ldwork,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDWORK_blas_int, ldwork, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_CLARFB (side, trans, direct, storev, &M_blas_int, \ + &N_blas_int, &K_blas_int, V, &LDV_blas_int, T, &LDT_blas_int, C, \ + &LDC_blas_int, Work, &LDWORK_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// nrm2: vector 2-norm +//------------------------------------------------------------------------------ + +double SUITESPARSE_BLAS_DNRM2 ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1258,7 +1964,26 @@ double SUITESPARSE_BLAS_DNRM2 // vector 2-norm } \ } -double SUITESPARSE_BLAS_DZNRM2 // vector 2-norm +float SUITESPARSE_BLAS_SNRM2 +( + // input: + const SUITESPARSE_BLAS_INT *n, + const float *X, + const SUITESPARSE_BLAS_INT *incx +) ; + +#define SUITESPARSE_BLAS_snrm2(result,n,X,incx,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + result = 0 ; \ + if (ok) \ + { \ + result = SUITESPARSE_BLAS_SNRM2 (&N_blas_int, X, &INCX_blas_int) ; \ + } \ +} + +double SUITESPARSE_BLAS_DZNRM2 ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1277,7 +2002,30 @@ double SUITESPARSE_BLAS_DZNRM2 // vector 2-norm } \ } -void SUITESPARSE_LAPACK_DLARFG // generate Householder reflector +float SUITESPARSE_BLAS_SCNRM2 +( + // input: + const SUITESPARSE_BLAS_INT *n, + const void *X, + const SUITESPARSE_BLAS_INT *incx +) ; + +#define SUITESPARSE_BLAS_scnrm2(result,n,X,incx,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + result = 0 ; \ + if (ok) \ + { \ + result = SUITESPARSE_BLAS_SCNRM2 (&N_blas_int, X, &INCX_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// larfg: generate Householder reflector +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DLARFG ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1301,7 +2049,31 @@ void SUITESPARSE_LAPACK_DLARFG // generate Householder reflector } \ } -void SUITESPARSE_LAPACK_ZLARFG // generate Householder reflector +void SUITESPARSE_LAPACK_SLARFG +( + // input: + const SUITESPARSE_BLAS_INT *n, + // input/output: + float *alpha, + float *X, + // input: + const SUITESPARSE_BLAS_INT *incx, + // output: + float *tau +) ; + +#define SUITESPARSE_LAPACK_slarfg(n,alpha,X,incx,tau,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_SLARFG (&N_blas_int, alpha, X, &INCX_blas_int, \ + tau) ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZLARFG ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1325,7 +2097,35 @@ void SUITESPARSE_LAPACK_ZLARFG // generate Householder reflector } \ } -void SUITESPARSE_LAPACK_DLARF // apply Householder reflector +void SUITESPARSE_LAPACK_CLARFG +( + // input: + const SUITESPARSE_BLAS_INT *n, + // input/output: + void *alpha, + void *X, + // input: + const SUITESPARSE_BLAS_INT *incx, + // output: + void *tau +) ; + +#define SUITESPARSE_LAPACK_clarfg(n,alpha,X,incx,tau,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_CLARFG (&N_blas_int, alpha, X, &INCX_blas_int, \ + tau) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// larf: apply Householder reflector +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DLARF ( // input: const char *side, @@ -1355,7 +2155,37 @@ void SUITESPARSE_LAPACK_DLARF // apply Householder reflector } \ } -void SUITESPARSE_LAPACK_ZLARF // apply Householder reflector +void SUITESPARSE_LAPACK_SLARF +( + // input: + const char *side, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const float *V, + const SUITESPARSE_BLAS_INT *incv, + const float *tau, + // input/output: + float *C, + // input: + const SUITESPARSE_BLAS_INT *ldc, + // workspace: + float *Work +) ; + +#define SUITESPARSE_LAPACK_slarf(side,m,n,V,incv,tau,C,ldc,Work,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCV_blas_int, incv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_SLARF (side, &M_blas_int, &N_blas_int, V, \ + &INCV_blas_int, tau, C, &LDC_blas_int, Work) ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZLARF ( // input: const char *side, @@ -1385,6 +2215,36 @@ void SUITESPARSE_LAPACK_ZLARF // apply Householder reflector } \ } +void SUITESPARSE_LAPACK_CLARF +( + // input: + const char *side, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const void *V, + const SUITESPARSE_BLAS_INT *incv, + const void *tau, + // input/output: + void *C, + // input: + const SUITESPARSE_BLAS_INT *ldc, + // workspace: + void *Work +) ; + +#define SUITESPARSE_LAPACK_clarf(side,m,n,V,incv,tau,C,ldc,Work,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCV_blas_int, incv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_CLARF (side, &M_blas_int, &N_blas_int, V, \ + &INCV_blas_int, tau, C, &LDC_blas_int, Work) ; \ + } \ +} + #endif //------------------------------------------------------------------------------ diff --git a/SuiteSparse_config/Config/SuiteSparse_config.pc.in b/SuiteSparse_config/Config/SuiteSparse_config.pc.in new file mode 100644 index 00000000..f082c226 --- /dev/null +++ b/SuiteSparse_config/Config/SuiteSparse_config.pc.in @@ -0,0 +1,16 @@ +# SuiteSparse_config, Copyright (c) 2012-2023, Timothy A. Davis. +# All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: SuiteSparseConfig +URL: https://github.com/DrTimothyAldenDavis/SuiteSparse +Description: Configuration for SuiteSparse +Version: @SUITESPARSE_VERSION_MAJOR@.@SUITESPARSE_VERSION_MINOR@.@SUITESPARSE_VERSION_SUB@ +Libs: -L${libdir} -l@SUITESPARSE_LIB_BASE_NAME@ +Libs.private: @SUITESPARSE_CONFIG_STATIC_LIBS@ +Cflags: -I${includedir} diff --git a/SuiteSparse_config/Config/SuiteSparse_configConfig.cmake.in b/SuiteSparse_config/Config/SuiteSparse_configConfig.cmake.in new file mode 100644 index 00000000..1831e466 --- /dev/null +++ b/SuiteSparse_config/Config/SuiteSparse_configConfig.cmake.in @@ -0,0 +1,171 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/SuiteSparse_config/cmake_modules/SuiteSparse_configConfig.cmake +#------------------------------------------------------------------------------- + +# The following copyright and license applies to just this file only, not to +# the library itself: +# SuiteSparse_configConfig.cmake, Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +#------------------------------------------------------------------------------- + +# Finds the SuiteSparse_config include file and compiled library. +# The following targets are defined: +# SuiteSparseConfig - for the shared library (if available) +# SuiteSparseConfig_static - for the static library (if available) + +# For backward compatibility the following variables are set: + +# SUITESPARSE_CONFIG_INCLUDE_DIR - where to find SuiteSparse_config.h +# SUITESPARSE_CONFIG_LIBRARY - dynamic SuiteSparse_config library +# SUITESPARSE_CONFIG_STATIC - static SuiteSparse_config library +# SUITESPARSE_CONFIG_LIBRARIES - libraries when using SuiteSparse_config +# SUITESPARSE_CONFIG_FOUND - true if SuiteSparse_config found + +# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is +# installed. + +#------------------------------------------------------------------------------- + +@PACKAGE_INIT@ + +set ( SUITESPARSE_DATE "@SUITESPARSE_DATE@" ) +set ( SUITESPARSE_CONFIG_VERSION_MAJOR @SUITESPARSE_VERSION_MAJOR@ ) +set ( SUITESPARSE_CONFIG_VERSION_MINOR @SUITESPARSE_VERSION_MINOR@ ) +set ( SUITESPARSE_CONFIG_VERSION_PATCH @SUITESPARSE_VERSION_SUB@ ) +set ( SUITESPARSE_CONFIG_VERSION "@SUITESPARSE_VERSION_MAJOR@.@SUITESPARSE_VERSION_MINOR@.@SUITESPARSE_VERSION_SUB@" ) + +# Check for dependent targets +include ( CMakeFindDependencyMacro ) +set ( _dependencies_found ON ) + +# Look for OpenMP +if ( @SUITESPARSE_CONFIG_HAS_OPENMP@ AND NOT OpenMP_C_FOUND ) + find_dependency ( OpenMP COMPONENTS C ) + if ( NOT OpenMP_C_FOUND ) + set ( _dependencies_found OFF ) + endif ( ) +endif ( ) + +if ( NOT _dependencies_found ) + set ( SuiteSparse_config_FOUND OFF ) + return ( ) +endif ( ) + + +# Import target +include ( ${CMAKE_CURRENT_LIST_DIR}/SuiteSparse_configTargets.cmake ) + +if ( @SUITESPARSE_CONFIG_HAS_OPENMP@ ) + if ( TARGET SuiteSparse::SuiteSparseConfig ) + get_property ( _suitesparse_config_aliased TARGET SuiteSparse::SuiteSparseConfig + PROPERTY ALIASED_TARGET ) + if ( "${_suitesparse_config_aliased}" STREQUAL "" ) + target_include_directories ( SuiteSparse::SuiteSparseConfig SYSTEM AFTER INTERFACE + "$" ) + else ( ) + target_include_directories ( ${_suitesparse_config_aliased} SYSTEM AFTER INTERFACE + "$" ) + endif ( ) + endif ( ) + if ( TARGET SuiteSparse::SuiteSparseConfig_static ) + get_property ( _suitesparse_config_aliased TARGET SuiteSparse::SuiteSparseConfig_static + PROPERTY ALIASED_TARGET ) + if ( "${_suitesparse_config_aliased}" STREQUAL "" ) + target_include_directories ( SuiteSparse::SuiteSparseConfig_static SYSTEM AFTER INTERFACE + "$" ) + else ( ) + target_include_directories ( ${_suitesparse_config_aliased} SYSTEM AFTER INTERFACE + "$" ) + endif ( ) + endif ( ) +endif ( ) + + +# The following is only for backward compatibility with FindSuiteSparse_config. + +set ( _target_shared SuiteSparse::SuiteSparseConfig ) +set ( _target_static SuiteSparse::SuiteSparseConfig_static ) +set ( _var_prefix "SUITESPARSE_CONFIG" ) + +if ( NOT @BUILD_SHARED_LIBS@ AND NOT TARGET ${_target_shared} ) + # make sure there is always an import target without suffix ) + add_library ( ${_target_shared} ALIAS ${_target_static} ) +endif ( ) + +get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) +if ( ${_var_prefix}_INCLUDE_DIR ) + # First item in SuiteSparse targets contains the "main" header directory. + list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) +endif ( ) +get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) +if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) +endif ( ) +if ( TARGET ${_target_static} ) + get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) +endif ( ) + +# Check for most common build types +set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) + +get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) +if ( _isMultiConfig ) + # For multi-configuration generators (e.g., Visual Studio), prefer those + # configurations. + list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) +else ( ) + # For single-configuration generators, prefer the current configuration. + list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) +endif ( ) + +list ( REMOVE_DUPLICATES _config_types ) + +foreach ( _config ${_config_types} ) + string ( TOUPPER ${_config} _uc_config ) + if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} + IMPORTED_IMPLIB_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) + endif ( ) + if ( NOT ${_var_prefix}_LIBRARY ) + get_target_property ( _library_chk ${_target_shared} + IMPORTED_LOCATION_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_LIBRARY ${_library_chk} ) + endif ( ) + endif ( ) + if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) + get_target_property ( _library_chk ${_target_static} + IMPORTED_LOCATION_${_uc_config} ) + if ( EXISTS ${_library_chk} ) + set ( ${_var_prefix}_STATIC ${_library_chk} ) + endif ( ) + endif ( ) +endforeach ( ) + +set ( SUITESPARSE_CONFIG_LIBRARIES ${SUITESPARSE_CONFIG_LIBRARY} ) + +macro ( suitesparse_check_exist _var _files ) + # ignore generator expressions + string ( GENEX_STRIP "${_files}" _files2 ) + + foreach ( _file ${_files2} ) + if ( NOT EXISTS "${_file}" ) + message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) + endif ( ) + endforeach () +endmacro ( ) + +suitesparse_check_exist ( SUITESPARSE_CONFIG_INCLUDE_DIR ${SUITESPARSE_CONFIG_INCLUDE_DIR} ) +suitesparse_check_exist ( SUITESPARSE_CONFIG_LIBRARY ${SUITESPARSE_CONFIG_LIBRARY} ) + +message ( STATUS "SuiteSparse_config version: ${SUITESPARSE_CONFIG_VERSION}" ) +message ( STATUS "SuiteSparse_config include: ${SUITESPARSE_CONFIG_INCLUDE_DIR}" ) +message ( STATUS "SuiteSparse_config library: ${SUITESPARSE_CONFIG_LIBRARY}" ) +message ( STATUS "SuiteSparse_config static: ${SUITESPARSE_CONFIG_STATIC}" ) diff --git a/SuiteSparse_config/Makefile b/SuiteSparse_config/Makefile index 9893afe7..a14ac2fd 100644 --- a/SuiteSparse_config/Makefile +++ b/SuiteSparse_config/Makefile @@ -37,18 +37,18 @@ default: library # default is to install only in /usr/local library: - ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . --config Release -j${JOBS} ) # install only in SuiteSparse/lib and SuiteSparse/include local: - ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=1 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=1 .. && cmake --build . --config Release -j${JOBS} ) # install only in /usr/local (default) global: - ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=0 .. && cmake --build . -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=0 .. && cmake --build . --config Release -j${JOBS} ) debug: - ( cd build ; cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. ; cmake --build . ) + ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. ; cmake --build . --config Debug ) all: library @@ -56,14 +56,14 @@ demos: library # just compile after running cmake; do not run cmake again remake: - ( cd build ; cmake --build . ) + ( cd build && cmake --build . ) # just run cmake to set things up setup: - ( cd build ; cmake $(CMAKE_OPTIONS) .. ) + ( cd build && cmake $(CMAKE_OPTIONS) .. ) install: - ( cd build ; cmake --install . ) + ( cd build && cmake --install . ) # remove any installed libraries and #include files uninstall: diff --git a/SuiteSparse_config/README.txt b/SuiteSparse_config/README.txt index 4ff01953..9d306c9e 100644 --- a/SuiteSparse_config/README.txt +++ b/SuiteSparse_config/README.txt @@ -1,4 +1,4 @@ -SuiteSparse_config, Copyright (c) 2012-2023, Timothy A. Davis. +SuiteSparse_config, Copyright (c) 2012-2024, Timothy A. Davis. All Rights Reserved. SPDX-License-Identifier: BSD-3-clause diff --git a/SuiteSparse_config/SuiteSparse_config.c b/SuiteSparse_config/SuiteSparse_config.c index 07909371..ee220a77 100644 --- a/SuiteSparse_config/SuiteSparse_config.c +++ b/SuiteSparse_config/SuiteSparse_config.c @@ -11,7 +11,6 @@ /* SuiteSparse configuration : memory manager and printf functions. */ -#define SUITESPARSE_LIBRARY #include "SuiteSparse_config.h" /* -------------------------------------------------------------------------- */ @@ -496,7 +495,7 @@ void *SuiteSparse_free /* always returns NULL */ tic [1] = 0 ; } -#else +#else /* ---------------------------------------------------------------------- */ /* POSIX timer */ @@ -617,7 +616,7 @@ double SuiteSparse_hypot (double x, double y) r = x / y ; s = y * sqrt (1.0 + r*r) ; } - } + } return (s) ; } @@ -760,6 +759,10 @@ const char *SuiteSparse_BLAS_library ( void ) return ((sizeof (SUITESPARSE_BLAS_INT) == 8) ? "OpenBLAS (64-bit integers)" : "OpenBLAS (32-bit integers)") ; + #elif defined ( BLAS_FLAME ) + return ((sizeof (SUITESPARSE_BLAS_INT) == 8) ? + "FLAME (64-bit integers)" : + "FLAME (32-bit integers)") ; #elif defined ( BLAS_Generic ) return ((sizeof (SUITESPARSE_BLAS_INT) == 8) ? "Reference BLAS (64-bit integers)" : diff --git a/SuiteSparse_config/SuiteSparse_config.h b/SuiteSparse_config/SuiteSparse_config.h index 7b0196f2..258e7601 100644 --- a/SuiteSparse_config/SuiteSparse_config.h +++ b/SuiteSparse_config/SuiteSparse_config.h @@ -368,13 +368,24 @@ int SuiteSparse_divcomplex // determine which timer to use, if any #ifndef NTIMER + // SuiteSparse_config itself can be compiled without OpenMP, + // but other packages can themselves use OpenMP. In this case, + // those packages should use omp_get_wtime() directly. This can + // be done via the SUITESPARSE_TIME macro, defined below: + #define SUITESPARSE_HAVE_CLOCK_GETTIME #if defined ( _OPENMP ) #define SUITESPARSE_TIMER_ENABLED - #elif defined ( _POSIX_C_SOURCE ) - #if _POSIX_C_SOURCE >= 199309L + #define SUITESPARSE_TIME (omp_get_wtime ( )) + #elif defined ( SUITESPARSE_HAVE_CLOCK_GETTIME ) #define SUITESPARSE_TIMER_ENABLED - #endif + #define SUITESPARSE_TIME (SuiteSparse_time ( )) + #else + // No timer is available + #define SUITESPARSE_TIME (0) #endif +#else + // The timer is explictly disabled + #define SUITESPARSE_TIME (0) #endif // SuiteSparse printf macro @@ -409,14 +420,19 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_HAS_VERSION_FUNCTION -#define SUITESPARSE_DATE "Mar FIXME, 2023" +#define SUITESPARSE_DATE "Mar 22, 2024" #define SUITESPARSE_MAIN_VERSION 7 -#define SUITESPARSE_SUB_VERSION 1 +#define SUITESPARSE_SUB_VERSION 7 #define SUITESPARSE_SUBSUB_VERSION 0 +// version format x.y #define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) -#define SUITESPARSE_VERSION \ - SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION) +#define SUITESPARSE_VERSION SUITESPARSE_VER_CODE(7, 7) + +// version format x.y.z +#define SUITESPARSE__VERCODE(main,sub,patch) \ + (((main)*1000ULL + (sub))*1000ULL + (patch)) +#define SUITESPARSE__VERSION SUITESPARSE__VERCODE(7,7,0) //============================================================================== // SuiteSparse interface to the BLAS and LAPACK libraries @@ -469,7 +485,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #elif defined ( BLAS_UNDERSCORE ) - // append an undescore, use lower case + // append an underscore, use lower case #define SUITESPARSE_FORTRAN(name,NAME) name ## _ #define SUITESPARSE__FORTRAN(name,NAME) name ## _ @@ -529,12 +545,12 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // If the suffix does not contain "_", use (Sun Perf., for example): -// cd build ; cmake -DBLAS64_SUFFIX="64" .. +// cd build && cmake -DBLAS64_SUFFIX="64" .. // If the suffix contains "_" (OpenBLAS in spack for example), use the // following: -// cd build ; cmake -DBLAS64_SUFFIX="_64" .. +// cd build && cmake -DBLAS64_SUFFIX="_64" .. // This setting could be used by the spack packaging of SuiteSparse when linked // with the spack-installed OpenBLAS with 64-bit integers. See @@ -572,6 +588,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // C names of Fortan BLAS and LAPACK functions used by SuiteSparse //------------------------------------------------------------------------------ +// double #define SUITESPARSE_BLAS_DTRSV SUITESPARSE_BLAS ( dtrsv , DTRSV ) #define SUITESPARSE_BLAS_DGEMV SUITESPARSE_BLAS ( dgemv , DGEMV ) #define SUITESPARSE_BLAS_DTRSM SUITESPARSE_BLAS ( dtrsm , DTRSM ) @@ -579,8 +596,15 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_BLAS_DSYRK SUITESPARSE_BLAS ( dsyrk , DSYRK ) #define SUITESPARSE_BLAS_DGER SUITESPARSE_BLAS ( dger , DGER ) #define SUITESPARSE_BLAS_DSCAL SUITESPARSE_BLAS ( dscal , DSCAL ) +#define SUITESPARSE_BLAS_DNRM2 SUITESPARSE_BLAS ( dnrm2 , DNRM2 ) + #define SUITESPARSE_LAPACK_DPOTRF SUITESPARSE_BLAS ( dpotrf , DPOTRF ) +#define SUITESPARSE_LAPACK_DLARF SUITESPARSE_BLAS ( dlarf , DLARF ) +#define SUITESPARSE_LAPACK_DLARFG SUITESPARSE_BLAS ( dlarfg , DLARFG ) +#define SUITESPARSE_LAPACK_DLARFT SUITESPARSE_BLAS ( dlarft , DLARFT ) +#define SUITESPARSE_LAPACK_DLARFB SUITESPARSE_BLAS ( dlarfb , DLARFB ) +// double complex #define SUITESPARSE_BLAS_ZTRSV SUITESPARSE_BLAS ( ztrsv , ZTRSV ) #define SUITESPARSE_BLAS_ZGEMV SUITESPARSE_BLAS ( zgemv , ZGEMV ) #define SUITESPARSE_BLAS_ZTRSM SUITESPARSE_BLAS ( ztrsm , ZTRSM ) @@ -588,20 +612,46 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_BLAS_ZHERK SUITESPARSE_BLAS ( zherk , ZHERK ) #define SUITESPARSE_BLAS_ZGERU SUITESPARSE_BLAS ( zgeru , ZGERU ) #define SUITESPARSE_BLAS_ZSCAL SUITESPARSE_BLAS ( zscal , ZSCAL ) -#define SUITESPARSE_LAPACK_ZPOTRF SUITESPARSE_BLAS ( zpotrf , ZPOTRF ) - -#define SUITESPARSE_BLAS_DNRM2 SUITESPARSE_BLAS ( dnrm2 , DNRM2 ) -#define SUITESPARSE_LAPACK_DLARF SUITESPARSE_BLAS ( dlarf , DLARF ) -#define SUITESPARSE_LAPACK_DLARFG SUITESPARSE_BLAS ( dlarfg , DLARFG ) -#define SUITESPARSE_LAPACK_DLARFT SUITESPARSE_BLAS ( dlarft , DLARFT ) -#define SUITESPARSE_LAPACK_DLARFB SUITESPARSE_BLAS ( dlarfb , DLARFB ) - #define SUITESPARSE_BLAS_DZNRM2 SUITESPARSE_BLAS ( dznrm2 , DZNRM2 ) + +#define SUITESPARSE_LAPACK_ZPOTRF SUITESPARSE_BLAS ( zpotrf , ZPOTRF ) #define SUITESPARSE_LAPACK_ZLARF SUITESPARSE_BLAS ( zlarf , ZLARF ) #define SUITESPARSE_LAPACK_ZLARFG SUITESPARSE_BLAS ( zlarfg , ZLARFG ) #define SUITESPARSE_LAPACK_ZLARFT SUITESPARSE_BLAS ( zlarft , ZLARFT ) #define SUITESPARSE_LAPACK_ZLARFB SUITESPARSE_BLAS ( zlarfb , ZLARFB ) +// single +#define SUITESPARSE_BLAS_STRSV SUITESPARSE_BLAS ( strsv , STRSV ) +#define SUITESPARSE_BLAS_SGEMV SUITESPARSE_BLAS ( sgemv , SGEMV ) +#define SUITESPARSE_BLAS_STRSM SUITESPARSE_BLAS ( strsm , STRSM ) +#define SUITESPARSE_BLAS_SGEMM SUITESPARSE_BLAS ( sgemm , SGEMM ) +#define SUITESPARSE_BLAS_SSYRK SUITESPARSE_BLAS ( ssyrk , SSYRK ) +#define SUITESPARSE_BLAS_SGER SUITESPARSE_BLAS ( sger , SGER ) +#define SUITESPARSE_BLAS_SSCAL SUITESPARSE_BLAS ( sscal , SSCAL ) +#define SUITESPARSE_BLAS_SNRM2 SUITESPARSE_BLAS ( snrm2 , SNRM2 ) + +#define SUITESPARSE_LAPACK_SPOTRF SUITESPARSE_BLAS ( spotrf , SPOTRF ) +#define SUITESPARSE_LAPACK_SLARF SUITESPARSE_BLAS ( slarf , SLARF ) +#define SUITESPARSE_LAPACK_SLARFG SUITESPARSE_BLAS ( slarfg , SLARFG ) +#define SUITESPARSE_LAPACK_SLARFT SUITESPARSE_BLAS ( slarft , SLARFT ) +#define SUITESPARSE_LAPACK_SLARFB SUITESPARSE_BLAS ( slarfb , SLARFB ) + +// single complex +#define SUITESPARSE_BLAS_CTRSV SUITESPARSE_BLAS ( ctrsv , CTRSV ) +#define SUITESPARSE_BLAS_CGEMV SUITESPARSE_BLAS ( cgemv , CGEMV ) +#define SUITESPARSE_BLAS_CTRSM SUITESPARSE_BLAS ( ctrsm , CTRSM ) +#define SUITESPARSE_BLAS_CGEMM SUITESPARSE_BLAS ( cgemm , CGEMM ) +#define SUITESPARSE_BLAS_CHERK SUITESPARSE_BLAS ( cherk , CHERK ) +#define SUITESPARSE_BLAS_CGERU SUITESPARSE_BLAS ( cgeru , CGERU ) +#define SUITESPARSE_BLAS_CSCAL SUITESPARSE_BLAS ( cscal , CSCAL ) +#define SUITESPARSE_BLAS_SCNRM2 SUITESPARSE_BLAS ( scnrm2 , SCNRM2 ) + +#define SUITESPARSE_LAPACK_CPOTRF SUITESPARSE_BLAS ( cpotrf , CPOTRF ) +#define SUITESPARSE_LAPACK_CLARF SUITESPARSE_BLAS ( clarf , CLARF ) +#define SUITESPARSE_LAPACK_CLARFG SUITESPARSE_BLAS ( clarfg , CLARFG ) +#define SUITESPARSE_LAPACK_CLARFT SUITESPARSE_BLAS ( clarft , CLARFT ) +#define SUITESPARSE_LAPACK_CLARFB SUITESPARSE_BLAS ( clarfb , CLARFB ) + //------------------------------------------------------------------------------ // prototypes of BLAS and SUITESPARSE_LAPACK functions //------------------------------------------------------------------------------ @@ -627,7 +677,11 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #if defined ( SUITESPARSE_BLAS_DEFINITIONS ) -void SUITESPARSE_BLAS_DGEMV // Y = alpha*A*x + beta*Y +//------------------------------------------------------------------------------ +// gemv: Y = alpha*A*x + beta*Y +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DGEMV ( // input: const char *trans, @@ -659,7 +713,39 @@ void SUITESPARSE_BLAS_DGEMV // Y = alpha*A*x + beta*Y } \ } -void SUITESPARSE_BLAS_ZGEMV // Y = alpha*A*X + beta*Y +void SUITESPARSE_BLAS_SGEMV +( + // input: + const char *trans, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const float *alpha, + const float *A, + const SUITESPARSE_BLAS_INT *lda, + const float *X, + const SUITESPARSE_BLAS_INT *incx, + const float *beta, + // input/output: + float *Y, + // input: + const SUITESPARSE_BLAS_INT *incy +) ; + +#define SUITESPARSE_BLAS_sgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_SGEMV (trans, &M_blas_int, &N_blas_int, alpha, A, \ + &LDA_blas_int, X, &INCX_blas_int, beta, Y, &INCY_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZGEMV ( // input: const char *trans, @@ -691,7 +777,43 @@ void SUITESPARSE_BLAS_ZGEMV // Y = alpha*A*X + beta*Y } \ } -void SUITESPARSE_BLAS_DTRSV // solve Lx=b, Ux=b, L'x=b, or U'x=b +void SUITESPARSE_BLAS_CGEMV +( + // input: + const char *trans, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const void *alpha, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + const void *X, + const SUITESPARSE_BLAS_INT *incx, + const void *beta, + // input/output: + void *Y, + // input: + const SUITESPARSE_BLAS_INT *incy +) ; + +#define SUITESPARSE_BLAS_cgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CGEMV (trans, &M_blas_int, &N_blas_int, alpha, A, \ + &LDA_blas_int, X, &INCX_blas_int, beta, Y, &INCY_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// trsv: solve Lx=b, Ux=b, L'x=b, or U'x=b +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DTRSV ( // input: const char *uplo, @@ -718,7 +840,34 @@ void SUITESPARSE_BLAS_DTRSV // solve Lx=b, Ux=b, L'x=b, or U'x=b } \ } -void SUITESPARSE_BLAS_ZTRSV // solve (L, L', L^H, U, U', or U^H)x=b +void SUITESPARSE_BLAS_STRSV +( + // input: + const char *uplo, + const char *trans, + const char *diag, + const SUITESPARSE_BLAS_INT *n, + const float *A, + const SUITESPARSE_BLAS_INT *lda, + // input/output: + float *X, + // input: + const SUITESPARSE_BLAS_INT *incx +) ; + +#define SUITESPARSE_BLAS_strsv(uplo,trans,diag,n,A,lda,X,incx,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_STRSV (uplo, trans, diag, &N_blas_int, A, \ + &LDA_blas_int, X, &INCX_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZTRSV ( // input: const char *uplo, @@ -745,7 +894,38 @@ void SUITESPARSE_BLAS_ZTRSV // solve (L, L', L^H, U, U', or U^H)x=b } \ } -void SUITESPARSE_BLAS_DTRSM // solve LX=B, UX=B, L'X=B, or U'X=B +void SUITESPARSE_BLAS_CTRSV +( + // input: + const char *uplo, + const char *trans, + const char *diag, + const SUITESPARSE_BLAS_INT *n, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + // input/output: + void *X, + // input: + const SUITESPARSE_BLAS_INT *incx +) ; + +#define SUITESPARSE_BLAS_ctrsv(uplo,trans,diag,n,A,lda,X,incx,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CTRSV (uplo, trans, diag, &N_blas_int, A, \ + &LDA_blas_int, X, &INCX_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// trsm: solve LX=B, UX=B, L'X=B, or U'X=B +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DTRSM ( // input: const char *side, @@ -776,7 +956,38 @@ void SUITESPARSE_BLAS_DTRSM // solve LX=B, UX=B, L'X=B, or U'X=B } \ } -void SUITESPARSE_BLAS_ZTRSM // solve (L, L', L^H, U, U', or U^H)X=B +void SUITESPARSE_BLAS_STRSM +( + // input: + const char *side, + const char *uplo, + const char *transa, + const char *diag, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const float *alpha, + const float *A, + const SUITESPARSE_BLAS_INT *lda, + // input/output: + float *B, + // input: + const SUITESPARSE_BLAS_INT *ldb +) ; + +#define SUITESPARSE_BLAS_strsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb,ok)\ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_STRSM (side, uplo, transa, diag, &M_blas_int, \ + &N_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZTRSM ( // input: const char *side, @@ -807,7 +1018,42 @@ void SUITESPARSE_BLAS_ZTRSM // solve (L, L', L^H, U, U', or U^H)X=B } \ } -void SUITESPARSE_BLAS_DGEMM // C = alpha*A*B + beta*C +void SUITESPARSE_BLAS_CTRSM +( + // input: + const char *side, + const char *uplo, + const char *transa, + const char *diag, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const void *alpha, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + // input/output: + void *B, + // input: + const SUITESPARSE_BLAS_INT *ldb +) ; + +#define SUITESPARSE_BLAS_ctrsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb,ok)\ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CTRSM (side, uplo, transa, diag, &M_blas_int, \ + &N_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// gemm: C = alpha*A*B + beta*C +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DGEMM ( // input: const char *transa, @@ -844,7 +1090,7 @@ void SUITESPARSE_BLAS_DGEMM // C = alpha*A*B + beta*C } \ } -void SUITESPARSE_BLAS_ZGEMM // C = alpha*A*B + beta*C +void SUITESPARSE_BLAS_SGEMM ( // input: const char *transa, @@ -852,19 +1098,19 @@ void SUITESPARSE_BLAS_ZGEMM // C = alpha*A*B + beta*C const SUITESPARSE_BLAS_INT *m, const SUITESPARSE_BLAS_INT *n, const SUITESPARSE_BLAS_INT *k, - const void *alpha, - const void *A, + const float *alpha, + const float *A, const SUITESPARSE_BLAS_INT *lda, - const void *B, + const float *B, const SUITESPARSE_BLAS_INT *ldb, - const void *beta, + const float *beta, // input/output: - void *C, + float *C, // input: const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_BLAS_zgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ +#define SUITESPARSE_BLAS_sgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ C,ldc,ok) \ { \ SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ @@ -875,52 +1121,62 @@ void SUITESPARSE_BLAS_ZGEMM // C = alpha*A*B + beta*C SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_ZGEMM (transa, transb, &M_blas_int, &N_blas_int, \ + SUITESPARSE_BLAS_SGEMM (transa, transb, &M_blas_int, &N_blas_int, \ &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ &LDC_blas_int) ; \ } \ } -void SUITESPARSE_BLAS_DSYRK // C = alpha*A*A' + beta*C, or A'A +void SUITESPARSE_BLAS_ZGEMM ( // input: - const char *uplo, - const char *trans, + const char *transa, + const char *transb, + const SUITESPARSE_BLAS_INT *m, const SUITESPARSE_BLAS_INT *n, const SUITESPARSE_BLAS_INT *k, - const double *alpha, - const double *A, + const void *alpha, + const void *A, const SUITESPARSE_BLAS_INT *lda, - const double *beta, + const void *B, + const SUITESPARSE_BLAS_INT *ldb, + const void *beta, // input/output: - double *C, + void *C, // input: const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_BLAS_dsyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +#define SUITESPARSE_BLAS_zgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ + C,ldc,ok) \ { \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_DSYRK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ - A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + SUITESPARSE_BLAS_ZGEMM (transa, transb, &M_blas_int, &N_blas_int, \ + &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ + &LDC_blas_int) ; \ } \ } -void SUITESPARSE_BLAS_ZHERK // C = alpha*A*A^H + beta*C, or A^H*A +void SUITESPARSE_BLAS_CGEMM ( // input: - const char *uplo, - const char *trans, + const char *transa, + const char *transb, + const SUITESPARSE_BLAS_INT *m, const SUITESPARSE_BLAS_INT *n, const SUITESPARSE_BLAS_INT *k, const void *alpha, const void *A, const SUITESPARSE_BLAS_INT *lda, + const void *B, + const SUITESPARSE_BLAS_INT *ldb, const void *beta, // input/output: void *C, @@ -928,47 +1184,206 @@ void SUITESPARSE_BLAS_ZHERK // C = alpha*A*A^H + beta*C, or A^H*A const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +#define SUITESPARSE_BLAS_cgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ + C,ldc,ok) \ { \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_ZHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ - A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + SUITESPARSE_BLAS_CGEMM (transa, transb, &M_blas_int, &N_blas_int, \ + &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ + &LDC_blas_int) ; \ } \ } -void SUITESPARSE_LAPACK_DPOTRF // Cholesky factorization +//------------------------------------------------------------------------------ +// syrk/herk: C = alpha*A*A' + beta*C ; or C = alpha*A'*A + beta*C +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DSYRK ( // input: const char *uplo, + const char *trans, const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const double *alpha, + const double *A, + const SUITESPARSE_BLAS_INT *lda, + const double *beta, // input/output: - double *A, + double *C, // input: - const SUITESPARSE_BLAS_INT *lda, - // output: - SUITESPARSE_BLAS_INT *info + const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_LAPACK_dpotrf(uplo,n,A,lda,info,ok) \ +#define SUITESPARSE_BLAS_dsyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ { \ SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - info = 1 ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ - SUITESPARSE_LAPACK_DPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ - &LAPACK_Info) ; \ - info = (Int) LAPACK_Info ; \ + SUITESPARSE_BLAS_DSYRK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ } \ } -void SUITESPARSE_LAPACK_ZPOTRF // Cholesky factorization +void SUITESPARSE_BLAS_SSYRK +( + // input: + const char *uplo, + const char *trans, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const float *alpha, + const float *A, + const SUITESPARSE_BLAS_INT *lda, + const float *beta, + // input/output: + float *C, + // input: + const SUITESPARSE_BLAS_INT *ldc +) ; + +#define SUITESPARSE_BLAS_ssyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_SSYRK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZHERK +( + // input: + const char *uplo, + const char *trans, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const void *alpha, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + const void *beta, + // input/output: + void *C, + // input: + const SUITESPARSE_BLAS_INT *ldc +) ; + +#define SUITESPARSE_BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_ZHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_CHERK +( + // input: + const char *uplo, + const char *trans, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const void *alpha, + const void *A, + const SUITESPARSE_BLAS_INT *lda, + const void *beta, + // input/output: + void *C, + // input: + const SUITESPARSE_BLAS_INT *ldc +) ; + +#define SUITESPARSE_BLAS_cherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// potrf: Cholesky factorization +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DPOTRF +( + // input: + const char *uplo, + const SUITESPARSE_BLAS_INT *n, + // input/output: + double *A, + // input: + const SUITESPARSE_BLAS_INT *lda, + // output: + SUITESPARSE_BLAS_INT *info +) ; + +#define SUITESPARSE_LAPACK_dpotrf(uplo,n,A,lda,info,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + info = 1 ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ + SUITESPARSE_LAPACK_DPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ + &LAPACK_Info) ; \ + info = (Int) LAPACK_Info ; \ + } \ +} + +void SUITESPARSE_LAPACK_SPOTRF +( + // input: + const char *uplo, + const SUITESPARSE_BLAS_INT *n, + // input/output: + float *A, + // input: + const SUITESPARSE_BLAS_INT *lda, + // output: + SUITESPARSE_BLAS_INT *info +) ; + +#define SUITESPARSE_LAPACK_spotrf(uplo,n,A,lda,info,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + info = 1 ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ + SUITESPARSE_LAPACK_SPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ + &LAPACK_Info) ; \ + info = (Int) LAPACK_Info ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZPOTRF ( // input: const char *uplo, @@ -995,7 +1410,38 @@ void SUITESPARSE_LAPACK_ZPOTRF // Cholesky factorization } \ } -void SUITESPARSE_BLAS_DSCAL // Y = alpha*Y +void SUITESPARSE_LAPACK_CPOTRF +( + // input: + const char *uplo, + const SUITESPARSE_BLAS_INT *n, + // input/output: + void *A, + // input: + const SUITESPARSE_BLAS_INT *lda, + // output: + SUITESPARSE_BLAS_INT *info +) ; + +#define SUITESPARSE_LAPACK_cpotrf(uplo,n,A,lda,info,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + info = 1 ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ + SUITESPARSE_LAPACK_CPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ + &LAPACK_Info) ; \ + info = LAPACK_Info ; \ + } \ +} + +//------------------------------------------------------------------------------ +// scal: Y = alpha*Y +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DSCAL ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1016,7 +1462,28 @@ void SUITESPARSE_BLAS_DSCAL // Y = alpha*Y } \ } -void SUITESPARSE_BLAS_ZSCAL // Y = alpha*Y +void SUITESPARSE_BLAS_SSCAL +( + // input: + const SUITESPARSE_BLAS_INT *n, + const float *alpha, + // input/output: + float *Y, + // input: + const SUITESPARSE_BLAS_INT *incy +) ; + +#define SUITESPARSE_BLAS_sscal(n,alpha,Y,incy,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_SSCAL (&N_blas_int, alpha, Y, &INCY_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZSCAL ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1037,7 +1504,32 @@ void SUITESPARSE_BLAS_ZSCAL // Y = alpha*Y } \ } -void SUITESPARSE_BLAS_DGER // A = alpha*x*y' + A +void SUITESPARSE_BLAS_CSCAL +( + // input: + const SUITESPARSE_BLAS_INT *n, + const void *alpha, + // input/output: + void *Y, + // input: + const SUITESPARSE_BLAS_INT *incy +) ; + +#define SUITESPARSE_BLAS_cscal(n,alpha,Y,incy,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CSCAL (&N_blas_int, alpha, Y, &INCY_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// ger/geru: A = alpha*x*y' + A +//------------------------------------------------------------------------------ + +void SUITESPARSE_BLAS_DGER ( // input: const SUITESPARSE_BLAS_INT *m, @@ -1067,7 +1559,37 @@ void SUITESPARSE_BLAS_DGER // A = alpha*x*y' + A } \ } -void SUITESPARSE_BLAS_ZGERU // A = alpha*x*y' + A +void SUITESPARSE_BLAS_SGER +( + // input: + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const float *alpha, + const float *X, + const SUITESPARSE_BLAS_INT *incx, + const float *Y, + const SUITESPARSE_BLAS_INT *incy, + // input/output: + float *A, + // input: + const SUITESPARSE_BLAS_INT *lda +) ; + +#define SUITESPARSE_BLAS_sger(m,n,alpha,X,incx,Y,incy,A,lda,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_SGER (&M_blas_int, &N_blas_int, alpha, X, \ + &INCX_blas_int, Y, &INCY_blas_int, A, &LDA_blas_int) ; \ + } \ +} + +void SUITESPARSE_BLAS_ZGERU ( // input: const SUITESPARSE_BLAS_INT *m, @@ -1097,7 +1619,41 @@ void SUITESPARSE_BLAS_ZGERU // A = alpha*x*y' + A } \ } -void SUITESPARSE_LAPACK_DLARFT // T = block Householder factor +void SUITESPARSE_BLAS_CGERU +( + // input: + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const void *alpha, + const void *X, + const SUITESPARSE_BLAS_INT *incx, + const void *Y, + const SUITESPARSE_BLAS_INT *incy, + // input/output: + void *A, + // input: + const SUITESPARSE_BLAS_INT *lda +) ; + +#define SUITESPARSE_BLAS_cgeru(m,n,alpha,X,incx,Y,incy,A,lda,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_BLAS_CGERU (&M_blas_int, &N_blas_int, alpha, X, \ + &INCX_blas_int, Y, &INCY_blas_int, A, &LDA_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// larft: T = block Householder factor +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DLARFT ( // input: const char *direct, @@ -1126,7 +1682,36 @@ void SUITESPARSE_LAPACK_DLARFT // T = block Householder factor } \ } -void SUITESPARSE_LAPACK_ZLARFT // T = block Householder factor +void SUITESPARSE_LAPACK_SLARFT +( + // input: + const char *direct, + const char *storev, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const float *V, + const SUITESPARSE_BLAS_INT *ldv, + const float *Tau, + // output: + float *T, + // input: + const SUITESPARSE_BLAS_INT *ldt +) ; + +#define SUITESPARSE_LAPACK_slarft(direct,storev,n,k,V,ldv,Tau,T,ldt,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_SLARFT (direct, storev, &N_blas_int, &K_blas_int, \ + V, &LDV_blas_int, Tau, T, &LDT_blas_int) ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZLARFT ( // input: const char *direct, @@ -1155,7 +1740,40 @@ void SUITESPARSE_LAPACK_ZLARFT // T = block Householder factor } \ } -void SUITESPARSE_LAPACK_DLARFB // apply block Householder reflector +void SUITESPARSE_LAPACK_CLARFT +( + // input: + const char *direct, + const char *storev, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const void *V, + const SUITESPARSE_BLAS_INT *ldv, + const void *Tau, + // output: + void *T, + // input: + const SUITESPARSE_BLAS_INT *ldt +) ; + +#define SUITESPARSE_LAPACK_clarft(direct,storev,n,k,V,ldv,Tau,T,ldt,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_CLARFT (direct, storev, &N_blas_int, &K_blas_int, \ + V, &LDV_blas_int, Tau, T, &LDT_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// larfb: apply block Householder reflector +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DLARFB ( // input: const char *side, @@ -1197,7 +1815,49 @@ void SUITESPARSE_LAPACK_DLARFB // apply block Householder reflector } \ } -void SUITESPARSE_LAPACK_ZLARFB // apply block Householder reflector +void SUITESPARSE_LAPACK_SLARFB +( + // input: + const char *side, + const char *trans, + const char *direct, + const char *storev, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const float *V, + const SUITESPARSE_BLAS_INT *ldv, + const float *T, + const SUITESPARSE_BLAS_INT *ldt, + // input/output: + float *C, + // input: + const SUITESPARSE_BLAS_INT *ldc, + // workspace: + float *Work, + // input: + const SUITESPARSE_BLAS_INT *ldwork +) ; + +#define SUITESPARSE_LAPACK_slarfb(side,trans,direct,storev,m,n,k,V,ldv,T,ldt, \ + C,ldc,Work,ldwork,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDWORK_blas_int, ldwork, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_SLARFB (side, trans, direct, storev, &M_blas_int, \ + &N_blas_int, &K_blas_int, V, &LDV_blas_int, T, &LDT_blas_int, C, \ + &LDC_blas_int, Work, &LDWORK_blas_int) ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZLARFB ( // input: const char *side, @@ -1239,7 +1899,53 @@ void SUITESPARSE_LAPACK_ZLARFB // apply block Householder reflector } \ } -double SUITESPARSE_BLAS_DNRM2 // vector 2-norm +void SUITESPARSE_LAPACK_CLARFB +( + // input: + const char *side, + const char *trans, + const char *direct, + const char *storev, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const SUITESPARSE_BLAS_INT *k, + const void *V, + const SUITESPARSE_BLAS_INT *ldv, + const void *T, + const SUITESPARSE_BLAS_INT *ldt, + // input/output: + void *C, + // input: + const SUITESPARSE_BLAS_INT *ldc, + // workspace: + void *Work, + // input: + const SUITESPARSE_BLAS_INT *ldwork +) ; + +#define SUITESPARSE_LAPACK_clarfb(side,trans,direct,storev,m,n,k,V,ldv,T,ldt, \ + C,ldc,Work,ldwork,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDWORK_blas_int, ldwork, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_CLARFB (side, trans, direct, storev, &M_blas_int, \ + &N_blas_int, &K_blas_int, V, &LDV_blas_int, T, &LDT_blas_int, C, \ + &LDC_blas_int, Work, &LDWORK_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// nrm2: vector 2-norm +//------------------------------------------------------------------------------ + +double SUITESPARSE_BLAS_DNRM2 ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1258,7 +1964,26 @@ double SUITESPARSE_BLAS_DNRM2 // vector 2-norm } \ } -double SUITESPARSE_BLAS_DZNRM2 // vector 2-norm +float SUITESPARSE_BLAS_SNRM2 +( + // input: + const SUITESPARSE_BLAS_INT *n, + const float *X, + const SUITESPARSE_BLAS_INT *incx +) ; + +#define SUITESPARSE_BLAS_snrm2(result,n,X,incx,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + result = 0 ; \ + if (ok) \ + { \ + result = SUITESPARSE_BLAS_SNRM2 (&N_blas_int, X, &INCX_blas_int) ; \ + } \ +} + +double SUITESPARSE_BLAS_DZNRM2 ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1277,7 +2002,30 @@ double SUITESPARSE_BLAS_DZNRM2 // vector 2-norm } \ } -void SUITESPARSE_LAPACK_DLARFG // generate Householder reflector +float SUITESPARSE_BLAS_SCNRM2 +( + // input: + const SUITESPARSE_BLAS_INT *n, + const void *X, + const SUITESPARSE_BLAS_INT *incx +) ; + +#define SUITESPARSE_BLAS_scnrm2(result,n,X,incx,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + result = 0 ; \ + if (ok) \ + { \ + result = SUITESPARSE_BLAS_SCNRM2 (&N_blas_int, X, &INCX_blas_int) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// larfg: generate Householder reflector +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DLARFG ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1301,7 +2049,31 @@ void SUITESPARSE_LAPACK_DLARFG // generate Householder reflector } \ } -void SUITESPARSE_LAPACK_ZLARFG // generate Householder reflector +void SUITESPARSE_LAPACK_SLARFG +( + // input: + const SUITESPARSE_BLAS_INT *n, + // input/output: + float *alpha, + float *X, + // input: + const SUITESPARSE_BLAS_INT *incx, + // output: + float *tau +) ; + +#define SUITESPARSE_LAPACK_slarfg(n,alpha,X,incx,tau,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_SLARFG (&N_blas_int, alpha, X, &INCX_blas_int, \ + tau) ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZLARFG ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1325,7 +2097,35 @@ void SUITESPARSE_LAPACK_ZLARFG // generate Householder reflector } \ } -void SUITESPARSE_LAPACK_DLARF // apply Householder reflector +void SUITESPARSE_LAPACK_CLARFG +( + // input: + const SUITESPARSE_BLAS_INT *n, + // input/output: + void *alpha, + void *X, + // input: + const SUITESPARSE_BLAS_INT *incx, + // output: + void *tau +) ; + +#define SUITESPARSE_LAPACK_clarfg(n,alpha,X,incx,tau,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_CLARFG (&N_blas_int, alpha, X, &INCX_blas_int, \ + tau) ; \ + } \ +} + +//------------------------------------------------------------------------------ +// larf: apply Householder reflector +//------------------------------------------------------------------------------ + +void SUITESPARSE_LAPACK_DLARF ( // input: const char *side, @@ -1355,7 +2155,37 @@ void SUITESPARSE_LAPACK_DLARF // apply Householder reflector } \ } -void SUITESPARSE_LAPACK_ZLARF // apply Householder reflector +void SUITESPARSE_LAPACK_SLARF +( + // input: + const char *side, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const float *V, + const SUITESPARSE_BLAS_INT *incv, + const float *tau, + // input/output: + float *C, + // input: + const SUITESPARSE_BLAS_INT *ldc, + // workspace: + float *Work +) ; + +#define SUITESPARSE_LAPACK_slarf(side,m,n,V,incv,tau,C,ldc,Work,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCV_blas_int, incv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_SLARF (side, &M_blas_int, &N_blas_int, V, \ + &INCV_blas_int, tau, C, &LDC_blas_int, Work) ; \ + } \ +} + +void SUITESPARSE_LAPACK_ZLARF ( // input: const char *side, @@ -1385,6 +2215,36 @@ void SUITESPARSE_LAPACK_ZLARF // apply Householder reflector } \ } +void SUITESPARSE_LAPACK_CLARF +( + // input: + const char *side, + const SUITESPARSE_BLAS_INT *m, + const SUITESPARSE_BLAS_INT *n, + const void *V, + const SUITESPARSE_BLAS_INT *incv, + const void *tau, + // input/output: + void *C, + // input: + const SUITESPARSE_BLAS_INT *ldc, + // workspace: + void *Work +) ; + +#define SUITESPARSE_LAPACK_clarf(side,m,n,V,incv,tau,C,ldc,Work,ok) \ +{ \ + SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ + SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ + SUITESPARSE_TO_BLAS_INT (INCV_blas_int, incv, ok) ; \ + SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ + if (ok) \ + { \ + SUITESPARSE_LAPACK_CLARF (side, &M_blas_int, &N_blas_int, V, \ + &INCV_blas_int, tau, C, &LDC_blas_int, Work) ; \ + } \ +} + #endif //------------------------------------------------------------------------------ diff --git a/SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake b/SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake deleted file mode 100644 index b9859150..00000000 --- a/SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake +++ /dev/null @@ -1,141 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake -#------------------------------------------------------------------------------- - -# The following copyright and license applies to just this file only, not to -# the library itself: -# FindSuiteSparse_config.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# Finds the SuiteSparse_config include file and compiled library and sets: - -# SUITESPARSE_CONFIG_INCLUDE_DIR - where to find SuiteSparse_config.h -# SUITESPARSE_CONFIG_LIBRARY - dynamic SuiteSparse_config library -# SUITESPARSE_CONFIG_STATIC - static SuiteSparse_config library -# SUITESPARSE_CONFIG_LIBRARIES - libraries when using SuiteSparse_config -# SUITESPARSE_CONFIG_FOUND - true if SuiteSparse_config found - -# set ``SUITESPARSE_CONFIG_ROOT`` or ``SuiteSparse_config_ROOT`` to a -# SuiteSparse_config installation root to tell this module where to look. - -# All the Find*.cmake files in SuiteSparse are installed by 'make install' into -# /usr/local/lib/cmake/SuiteSparse (where '/usr/local' is the -# ${CMAKE_INSTALL_PREFIX}). To access this file, place the following commands -# in your CMakeLists.txt file. See also SuiteSparse/Example/CMakeLists.txt: -# -# set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} -# ${CMAKE_INSTALL_PREFIX}/lib/cmake/SuiteSparse ) - -#------------------------------------------------------------------------------- - -# include files for SuiteSparse_config -find_path ( SUITESPARSE_CONFIG_INCLUDE_DIR - NAMES SuiteSparse_config.h - HINTS ${SUITESPARSE_CONFIG_ROOT} - HINTS ENV SUITESPARSE_CONFIG_ROOT - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SuiteSparse_config - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config - PATH_SUFFIXES include Include -) - -# dynamic SuiteSparse_config (or static if no dynamic library was built) -find_library ( SUITESPARSE_CONFIG_LIBRARY - NAMES suitesparseconfig suitesparseconfig_static - HINTS ${SUITESPARSE_CONFIG_ROOT} - HINTS ENV SUITESPARSE_CONFIG_ROOT - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SuiteSparse_config - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config - PATH_SUFFIXES lib build build/Release build/Debug -) - -if ( MSVC ) - set ( STATIC_NAME suitesparseconfig_static suitesparseconfig ) -else ( ) - set ( STATIC_NAME suitesparseconfig ) - set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) - message ( STATUS "original library suffixes: ${CMAKE_FIND_LIBRARY_SUFFIXES}" ) - set ( CMAKE_FIND_LIBRARY_SUFFIXES - ${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) - message ( STATUS "revised for static search: ${CMAKE_FIND_LIBRARY_SUFFIXES}" ) -endif ( ) - -# static libraries for SuiteSparse_config -find_library ( SUITESPARSE_CONFIG_STATIC - NAMES ${STATIC_NAME} - HINTS ${SUITESPARSE_CONFIG_ROOT} - HINTS ENV SUITESPARSE_CONFIG_ROOT - HINTS ${CMAKE_SOURCE_DIR}/.. - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SuiteSparse_config - HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config - PATH_SUFFIXES lib build build/Release build/Debug -) - -if ( NOT MSVC ) - # restore the CMAKE_FIND_LIBRARY_SUFFIXES variable - set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) -endif ( ) - -# get version of the library from the dynamic library filename, if present -get_filename_component ( SUITESPARSE_CONFIG_LIBRARY ${SUITESPARSE_CONFIG_LIBRARY} REALPATH ) -get_filename_component ( SUITESPARSE_CONFIG_FILENAME ${SUITESPARSE_CONFIG_LIBRARY} NAME ) -string ( - REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" - SUITESPARSE_CONFIG_VERSION - ${SUITESPARSE_CONFIG_FILENAME} -) - -# set ( SUITESPARSE_CONFIG_VERSION "" ) -if ( EXISTS "${SUITESPARSE_CONFIG_INCLUDE_DIR}" AND NOT SUITESPARSE_CONFIG_VERSION ) - # if the version does not appear in the filename, read the include file - file ( STRINGS ${SUITESPARSE_CONFIG_INCLUDE_DIR}/SuiteSparse_config.h SUITESPARSE_CONFIG_MAJOR_STR - REGEX "define SUITESPARSE_MAIN_VERSION" ) - file ( STRINGS ${SUITESPARSE_CONFIG_INCLUDE_DIR}/SuiteSparse_config.h SUITESPARSE_CONFIG_MINOR_STR - REGEX "define SUITESPARSE_SUB_VERSION" ) - file ( STRINGS ${SUITESPARSE_CONFIG_INCLUDE_DIR}/SuiteSparse_config.h SUITESPARSE_CONFIG_PATCH_STR - REGEX "define SUITESPARSE_SUBSUB_VERSION" ) - message ( STATUS "major: ${SUITESPARSE_CONFIG_MAJOR_STR}" ) - message ( STATUS "minor: ${SUITESPARSE_CONFIG_MINOR_STR}" ) - message ( STATUS "patch: ${SUITESPARSE_CONFIG_PATCH_STR}" ) - string ( REGEX MATCH "[0-9]+" SUITESPARSE_CONFIG_MAJOR ${SUITESPARSE_CONFIG_MAJOR_STR} ) - string ( REGEX MATCH "[0-9]+" SUITESPARSE_CONFIG_MINOR ${SUITESPARSE_CONFIG_MINOR_STR} ) - string ( REGEX MATCH "[0-9]+" SUITESPARSE_CONFIG_PATCH ${SUITESPARSE_CONFIG_PATCH_STR} ) - set (SUITESPARSE_CONFIG_VERSION "${SUITESPARSE_CONFIG_MAJOR}.${SUITESPARSE_CONFIG_MINOR}.${SUITESPARSE_CONFIG_PATCH}") -endif ( ) - -# libaries when using SuiteSparse_config -set (SUITESPARSE_CONFIG_LIBRARIES ${SUITESPARSE_CONFIG_LIBRARY}) - -include ( FindPackageHandleStandardArgs ) - -find_package_handle_standard_args ( SuiteSparse_config - REQUIRED_VARS SUITESPARSE_CONFIG_LIBRARY SUITESPARSE_CONFIG_INCLUDE_DIR - VERSION_VAR SUITESPARSE_CONFIG_VERSION - REASON_FAILURE_MESSAGE result -) - -message (STATUS "result: ${result}") - -mark_as_advanced ( - SUITESPARSE_CONFIG_INCLUDE_DIR - SUITESPARSE_CONFIG_LIBRARY - SUITESPARSE_CONFIG_STATIC - SUITESPARSE_CONFIG_LIBRARIES -) - -if ( SUITESPARSE_CONFIG_FOUND ) - message ( STATUS "SuiteSparse_config version: ${SUITESPARSE_CONFIG_VERSION}" ) - message ( STATUS "SuiteSparse_config include: ${SUITESPARSE_CONFIG_INCLUDE_DIR}" ) - message ( STATUS "SuiteSparse_config library: ${SUITESPARSE_CONFIG_LIBRARY}" ) - message ( STATUS "SuiteSparse_config static: ${SUITESPARSE_CONFIG_STATIC}" ) -else ( ) - message ( STATUS "SuiteSparse_config not found" ) - set ( SUITESPARSE_CONFIG_INCLUDE_DIR "" ) - set ( SUITESPARSE_CONFIG_LIBRARIES "" ) - set ( SUITESPARSE_CONFIG_LIBRARY "" ) - set ( SUITESPARSE_CONFIG_STATIC "" ) -endif ( ) - diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake index 9e4b779a..adcd4266 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake @@ -24,13 +24,24 @@ endif ( ) set ( BLA_VENDOR "ANY" CACHE STRING "if ANY (default): searches for any BLAS. Otherwise: search for a specific BLAS" ) -# To allow the use of a BLAS with 64-bit integers, set this to true -option ( ALLOW_64BIT_BLAS - "OFF (default): use only 32-bit BLAS. ON: look for 32 or 64-bit BLAS" off ) +# To allow the use of a BLAS with 64-bit integers, set this to ON +option ( SUITESPARSE_USE_64BIT_BLAS + "OFF (default): use only 32-bit BLAS. ON: look for 32 or 64-bit BLAS" OFF ) # dynamic/static linking with BLAS option ( BLA_STATIC - "OFF (default): dynamic linking of BLAS. ON: static linking of BLAS" off ) + "OFF (default): dynamic linking of BLAS. ON: static linking of BLAS" OFF ) + +if ( DEFINED BLAS_LIBRARIES OR DEFINED BLAS_INCLUDE_DIRS ) + # User supplied variables for libraries and/or include directories. + # Use them as-is. + if ( SUITESPARSE_USE_64BIT_BLAS ) + include ( SuiteSparseBLAS64 ) + else ( ) + include ( SuiteSparseBLAS32 ) + endif ( ) + return ( ) +endif ( ) #------------------------------------------------------------------------------- # look for a specific BLAS library @@ -39,32 +50,34 @@ option ( BLA_STATIC # To request specific BLAS, use either (for example): # # CMAKE_OPTIONS="-DBLA_VENDOR=Apple" make -# cd build ; cmake -DBLA_VENDOR=Apple .. ; make +# cd build && cmake -DBLA_VENDOR=Apple .. ; make # -# Use the ALLOW_64BIT_BLAS to select 64-bit or 32-bit BLAS. This setting is -# strictly enforced. If set to true, then only a 64-bit BLAS is allowed. -# If this is not found, no 32-bit BLAS is considered, and the build will fail. +# Use SUITESPARSE_USE_64BIT_BLAS to select 64-bit or 32-bit BLAS. If +# BLA_VENDOR is also defined, this setting is strictly enforced. If set to +# ON, then only a 64-bit BLAS is allowed. If this is not found, no 32-bit +# BLAS is considered, and the build will fail. # -# If the BLA_VENDOR string implies a 64-bit BLAS, then ALLOW_64BIT_BLAS is set -# to true, ignoring the setting from the user (Intel10_64ilp* and Arm_64ilp*). +# If the BLA_VENDOR string implies a 64-bit BLAS, then +# SUITESPARSE_USE_64BIT_BLAS is set to ON, ignoring the setting of this value +# from the user (Intel10_64ilp* and Arm_64ilp*). # -# The default for ALLOW_64BIT_BLAS is false. +# The default for SUITESPARSE_USE_64BIT_BLAS is OFF. if ( NOT (BLA_VENDOR STREQUAL "ANY" ) ) # only look for the BLAS from a single vendor if ( ( BLA_VENDOR MATCHES "64ilp" ) OR ( BLA_VENDOR MATCHES "ilp64" ) ) # Intel10_64ilp* or Arm_ilp64* - set ( ALLOW_64BIT_BLAS true ) + set ( SUITESPARSE_USE_64BIT_BLAS ON ) # OK; overidden by BLA_VENDOR endif ( ) - if ( ALLOW_64BIT_BLAS ) + if ( SUITESPARSE_USE_64BIT_BLAS ) # only look for 64-bit BLAS set ( BLA_SIZEOF_INTEGER 8 ) message ( STATUS "Looking for 64-BLAS: " ${BLA_VENDOR} ) else ( ) # only look for 32-bit BLAS - message ( STATUS "Looking for 32-BLAS: " ${BLA_VENDOR} ) set ( BLA_SIZEOF_INTEGER 4 ) + message ( STATUS "Looking for 32-BLAS: " ${BLA_VENDOR} ) endif ( ) find_package ( BLAS REQUIRED ) if ( BLA_SIZEOF_INTEGER EQUAL 8 ) @@ -76,6 +89,7 @@ if ( NOT (BLA_VENDOR STREQUAL "ANY" ) ) include ( SuiteSparseBLAS32 ) endif ( ) message ( STATUS "Specific BLAS: ${BLA_VENDOR} found: ${BLAS_FOUND}" ) + message ( STATUS "BLAS integer size: ${BLA_SIZEOF_INTEGER}" ) return ( ) endif ( ) @@ -83,10 +97,19 @@ endif ( ) # Look for any 64-bit BLAS, if allowed #------------------------------------------------------------------------------- -# If ALLOW_64BIT_BLAS is true, then a 64-bit BLAS is preferred. -# If not found, a 32-bit BLAS is sought (below) +# If SUITESPARSE_USE_64BIT_BLAS is ON and SUITESPARSE_USE_STRICT is OFF, then a +# 64-bit BLAS is preferred. If not found, a 32-bit BLAS is sought. +# The setting of SUITESPARSE_USE_64BIT_BLAS not strict by default. + +# If SUITESPARSE_USE_64BIT_BLAS is ON and SUITESPARSE_USE_STRICT is ON, then a +# only a 64-bit BLAS is considered. An error occurs if a 64-bit BLAS is not +# found. -if ( ALLOW_64BIT_BLAS ) +# If SUITESPARSE_USE_64BIT_BLAS is OFF, only a 32-bit BLAS is considered. An +# error occurs if a 32-bit BLAS is not found (the SUITESPARSE_USE_STRICT +# setting is ignored). + +if ( SUITESPARSE_USE_64BIT_BLAS ) # Look for Intel MKL BLAS with 64-bit integers message ( STATUS "Looking for Intel 64-bit BLAS" ) @@ -139,6 +162,11 @@ if ( ALLOW_64BIT_BLAS ) return ( ) endif ( ) + # report an error if strict + if ( SUITESPARSE_USE_STRICT ) + message ( FATAL_ERROR "64-bit BLAS required, but not found" ) + endif ( ) + endif ( ) #------------------------------------------------------------------------------- diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS64.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS64.cmake index 744aaef9..72efcd5c 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS64.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS64.cmake @@ -25,19 +25,19 @@ set ( SuiteSparse_BLAS_integer "int64_t" ) # If the suffix does not contain "_", use (Sun Perf., for example): -# cd build ; cmake -DBLAS64_SUFFIX="64" .. +# cd build && cmake -DBLAS64_SUFFIX="64" .. # If the suffix contains "_" (OpenBLAS in spack for example), use the # following: -# cd build ; cmake -DBLAS64_SUFFIX="_64" .. +# cd build && cmake -DBLAS64_SUFFIX="_64" .. # This setting could be used by the spack packaging of SuiteSparse when linked # with the spack-installed OpenBLAS with 64-bit integers. See # https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/suite-sparse/package.py if ( DEFINED BLAS64_SUFFIX ) - # append BLAS64_SUFFIX to each BLAS and LAPACK name + # append BLAS64_SUFFIX to each BLAS and LAPACK function name string ( FIND ${BLAS64_SUFFIX} "_" HAS_UNDERSCORE ) message ( STATUS "BLAS64_suffix: ${BLAS64_SUFFIX}" ) if ( HAS_UNDERSCORE EQUAL -1 ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseLAPACK.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseLAPACK.cmake index 27ff73ca..82366e0a 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseLAPACK.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseLAPACK.cmake @@ -20,18 +20,19 @@ cmake_minimum_required ( VERSION 3.22 ) -if ( BLA_VENDOR STREQUAL "FLAME" ) - # FLAME has the BLAS but not LAPACK +if ( DEFINED LAPACK_LIBRARIES OR DEFINED LAPACK_INCLUDE_DIRS ) + # User supplied variables for libraries and/or include directories. + # Use them as-is. + return ( ) +endif ( ) - set ( BLA_VENDOR "Generic" ) - message ( STATUS "Looking for generic LAPACK to use with BLIS/FLAME BLAS" ) +if ( BLA_VENDOR STREQUAL "FLAME" ) - # look for the generic dynamic LAPACK library (usually liblagraph.so) find_library ( LAPACK_LIBRARY - NAMES lapack + NAMES flame PATH_SUFFIXES lib build ) - # look for the static LAPACK library (usually liblagraph.a) + # look for the static LAPACK library (usually liblapack.a) if ( MSVC ) set ( STATIC_SUFFIX .lib ) else ( ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake b/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake index 88f956a3..b6b19540 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake @@ -14,22 +14,25 @@ # To use the "Debug" policy, precede this with # set ( CMAKE_BUILD_TYPE Debug ) # -# ENABLE_CUDA: if set to true, CUDA is enabled for the project. -# Default: true for CHOLMOD and SPQR, false for GraphBLAS -# (for which CUDA is in progress and not ready for -# production use). +# SUITESPARSE_USE_CUDA: if OFF, CUDA is disabled. if ON, CUDA is enabled, +# if available. Default: ON. # -# LOCAL_INSTALL: if true, "cmake --install" will install +# SUITESPARSE_LOCAL_INSTALL: if true, "cmake --install" will install # into SuiteSparse/lib and SuiteSparse/include. # if false, "cmake --install" will install into the # default prefix (or the one configured with -# CMAKE_INSTALL_PREFIX). -# Default: false +# CMAKE_INSTALL_PREFIX). Requires cmake 3.19. +# This is ignored when using the root CMakeLists.txt. +# Set CMAKE_INSTALL_PREFIX instead. +# Default: OFF # -# NSTATIC: if true, static libraries are not built. -# Default: false, except for GraphBLAS, which +# BUILD_SHARED_LIBS: if true, shared libraries are built. +# Default: ON. +# +# BUILD_STATIC_LIBS: if true, static libraries are built. +# Default: ON, except for GraphBLAS, which # takes a long time to compile so the default for -# GraphBLAS is true. +# GraphBLAS is false. # # SUITESPARSE_CUDA_ARCHITECTURES: a string, such as "all" or # "35;50;75;80" that lists the CUDA architectures to use @@ -45,12 +48,12 @@ # Both settings must appear, or neither. # Default: neither are defined. # -# BLA_STATIC: if true, use static linkage for BLAS and LAPACK. -# Default: false +# BLA_STATIC: if ON, use static linkage for BLAS and LAPACK. +# Default: not set (that is, the same as OFF) # -# ALLOW_64BIT_BLAS if true, SuiteSparse will search for both 32-bit and -# 64-bit BLAS. If false, only 32-bit BLAS will be -# searched for. Ignored if BLA_VENDOR and +# SUITESPARSE_USE_64BIT_BLAS if true, SuiteSparse will search for both +# 32-bit and 64-bit BLAS. If false, only 32-bit BLAS +# will be searched for. Ignored if BLA_VENDOR and # BLA_SIZEOF_INTEGER are defined. # # SUITESPARSE_C_TO_FORTRAN: a string that defines how C calls Fortran. @@ -61,30 +64,64 @@ # This setting is only used if no Fortran compiler is # found. # -# NFORTRAN: if true, no Fortan files are compiled, and the Fortran -# language is not enabled in any cmake scripts. The -# built-in cmake script FortranCInterface is skipped. -# This will require SUITESPARSE_C_TO_FORTRAN to be defined -# explicitly, if the defaults are not appropriate for your -# system. -# Default: false - -cmake_minimum_required ( VERSION 3.19 ) - -message ( STATUS "Source: ${CMAKE_SOURCE_DIR} ") -message ( STATUS "Build: ${CMAKE_BINARY_DIR} ") +# SUITESPARSE_USE_FORTRAN: if OFF, no Fortan files are compiled, and the +# Fortran language is not enabled in any cmake scripts. +# The built-in cmake script FortranCInterface is skipped. +# This will require SUITESPARSE_C_TO_FORTRAN to be +# defined explicitly, if the defaults are not appropriate +# for your system. +# Default: ON +# +# SUITESPARSE_PKGFILEDIR: Directory where CMake Config and pkg-config files +# will be installed. By default, CMake Config files will +# be installed in the subfolder `cmake` of the directory +# where the (static) libraries will be installed (e.g., +# `lib`). The `.pc` files for pkg-config will be +# installed in the subfolder `pkgconfig` of the directory +# where the (static) libraries will be installed. +# Default: CMAKE_INSTALL_PREFIX, or SuiteSparse/lib if +# SUITESPARSE_LOCAL_INSTALL is enabled. +# +# SUITESPARSE_INCLUDEDIR_POSTFIX : Postfix for installation target of +# header from SuiteSparse. Default: suitesparse, so the +# default include directory is: +# CMAKE_INSTALL_PREFIX/include/suitesparse +# +# SUITESPARSE_USE_STRICT: SuiteSparse has many user-definable settings of the +# form SUITESPARSE_USE_* or (package)_USE_* for some +# particular package. In general, these settings are not +# strict. For example, if SUITESPARSE_USE_OPENMP is +# ON then OpenMP is preferred, but SuiteSparse can be +# used without OpenMP so no error is generated if OpenMP +# is not found. However, if SUITESPARSE_USE_STRICT is +# ON then all *_USE_* settings are treated strictly +# and an error occurs if any are set to ON but the +# corresponding package or setting is not available. The +# *_USE_SYSTEM_* settings are always treated as strict. +# Default: OFF. + +message ( STATUS "Source: ${CMAKE_SOURCE_DIR} ") +message ( STATUS "Build: ${CMAKE_BINARY_DIR} ") + +if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.18.0" ) + cmake_policy ( SET CMP0104 NEW ) # initialize CUDA architectures +endif ( ) -cmake_policy ( SET CMP0042 NEW ) # enable MACOSX_RPATH by default -cmake_policy ( SET CMP0048 NEW ) # VERSION variable policy -cmake_policy ( SET CMP0054 NEW ) # if ( expression ) handling policy -cmake_policy ( SET CMP0104 NEW ) # initialize CUDA architectures +# SuiteSparse packages have many intentional extra semicolons, for code +# readability (such as "/* do nothing */ ;" in SuiteSparse_config.c). Disable +# the clang warning for these statements: +if ( CMAKE_C_COMPILER_ID STREQUAL "Clang" ) + set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-extra-semi-stmt" ) +endif ( ) +if ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) + set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-extra-semi-stmt" ) +endif ( ) if ( WIN32 ) set ( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS true ) add_compile_definitions ( _CRT_SECURE_NO_WARNINGS ) endif ( ) -set ( CMAKE_MACOSX_RPATH TRUE ) enable_language ( C ) include ( GNUInstallDirs ) @@ -92,15 +129,40 @@ include ( GNUInstallDirs ) set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake_modules ) -# NSTATIC option -if ( NSTATIC_DEFAULT_ON ) - option ( NSTATIC "ON (default): do not build static libraries. OFF: build static libraries" on ) +# Use OpenMP +option ( SUITESPARSE_USE_OPENMP "ON (default): Use OpenMP in libraries by default if available. OFF: Do not use OpenMP by default." ON ) + +# strict usage +option ( SUITESPARSE_USE_STRICT "ON: treat all _USE__ settings as strict if they are ON. OFF (default): consider *_USE_* as preferences, not strict" OFF ) + +# build the demos +option ( SUITESPARSE_DEMOS "ON: Build the demo programs. OFF (default): do not build the demo programs." OFF ) + +# BUILD_SHARED_LIBS and BUILD_STATIC_LIBS options +option ( BUILD_SHARED_LIBS "OFF: do not build shared libraries. ON (default): build shared libraries" ON ) + +if ( BUILD_STATIC_LIBS_DEFAULT_OFF ) + option ( BUILD_STATIC_LIBS "OFF (default): do not build static libraries. ON: build static libraries" OFF ) else ( ) - option ( NSTATIC "ON: do not build static libraries. OFF (default): build static libraries" off ) + # For backwards compatibility, use NSTATIC if it is set. + if ( NSTATIC ) + option ( BUILD_STATIC_LIBS "OFF: do not build static libraries. ON (default): build static libraries" OFF ) + else ( ) + option ( BUILD_STATIC_LIBS "OFF: do not build static libraries. ON (default): build static libraries" ON ) + endif ( ) +endif ( ) + +if ( NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS ) + message ( FATAL_ERROR "At least one of BUILD_SHARED_LIBS or BUILD_STATIC_LIBS must be set to ON." ) endif ( ) # installation options -option ( LOCAL_INSTALL "Install in SuiteSparse/lib" off ) +if ( NOT SUITESPARSE_ROOT_CMAKELISTS AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.19.0" ) + # the SUITESPARSE_LOCAL_INSTALL option requires cmake 3.19.0 or later + option ( SUITESPARSE_LOCAL_INSTALL "Install in SuiteSparse/lib" OFF ) +else ( ) + set ( SUITESPARSE_LOCAL_INSTALL OFF ) +endif ( ) if ( SUITESPARSE_SECOND_LEVEL ) # some packages in SuiteSparse are in SuiteSparse/Package/Package @@ -112,94 +174,127 @@ else ( ) ${CMAKE_SOURCE_DIR}/../lib/cmake ) endif ( ) -# add the ./build folder to the runpath so other SuiteSparse packages can -# find this one without "make install" -set ( CMAKE_BUILD_RPATH ${CMAKE_BUILD_RPATH} ${CMAKE_BINARY_DIR} ) - -# determine if this Package is inside the SuiteSparse folder -set ( INSIDE_SUITESPARSE false ) -if ( LOCAL_INSTALL ) - # if you do not want to install local copies of SuiteSparse - # packages in SuiteSparse/lib and SuiteSparse/, set - # LOCAL_INSTALL to false in your CMake options. - if ( SUITESPARSE_SECOND_LEVEL ) - # the package is normally located at the 2nd level inside SuiteSparse - # (SuiteSparse/GraphBLAS/GraphBLAS/ for example) - if ( EXISTS ${CMAKE_SOURCE_DIR}/../../SuiteSparse_config ) - set ( INSIDE_SUITESPARSE true ) +# allow libraries to "see" each other if they are installed in a non-default LIBRARY_PATH +list ( FIND CMAKE_INSTALL_RPATH "$ORIGIN" _idx ) +if ( _idx LESS 0 ) + # "$ORIGIN" not yet included in CMAKE_INSTALL_RPATH + list ( PREPEND CMAKE_INSTALL_RPATH "$ORIGIN" ) +endif ( ) + +set ( INSIDE_SUITESPARSE OFF ) +if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) + # determine if this Package is inside the SuiteSparse folder + if ( SUITESPARSE_LOCAL_INSTALL ) + # if you do not want to install local copies of SuiteSparse + # packages in SuiteSparse/lib and SuiteSparse/, set + # SUITESPARSE_LOCAL_INSTALL to false in your CMake options. + if ( SUITESPARSE_SECOND_LEVEL ) + # the package is normally located at the 2nd level inside SuiteSparse + # (SuiteSparse/GraphBLAS/GraphBLAS/ for example) + if ( EXISTS ${CMAKE_SOURCE_DIR}/../../SuiteSparse_config ) + set ( INSIDE_SUITESPARSE true ) + endif ( ) + else ( ) + # typical case, the package is at the 1st level inside SuiteSparse + # (SuiteSparse/AMD for example) + if ( EXISTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config ) + set ( INSIDE_SUITESPARSE true ) + endif ( ) endif ( ) - else ( ) - # typical case, the package is at the 1st level inside SuiteSparse - # (SuiteSparse/AMD for example) - if ( EXISTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config ) - set ( INSIDE_SUITESPARSE true ) + + if ( NOT INSIDE_SUITESPARSE ) + message ( FATAL_ERROR "Unsupported layout for local installation. Correct the directory layout or unset SUITESPARSE_LOCAL_INSTALL." ) endif ( ) - endif ( ) - if ( NOT INSIDE_SUITESPARSE ) - message ( FATAL_ERROR "Unsupported layout for local installation. Correct the directory layout or unset LOCAL_INSTALL." ) endif ( ) - endif ( ) -if ( INSIDE_SUITESPARSE ) - # ../lib and ../include exist: the package is inside SuiteSparse. - # find ( REAL_PATH ...) requires cmake 3.19. - if ( SUITESPARSE_SECOND_LEVEL ) - file ( REAL_PATH ${CMAKE_SOURCE_DIR}/../.. SUITESPARSE_LOCAL_PREFIX ) - else ( ) - file ( REAL_PATH ${CMAKE_SOURCE_DIR}/.. SUITESPARSE_LOCAL_PREFIX ) - endif ( ) -endif ( ) +set ( SUITESPARSE_INCLUDEDIR_POSTFIX "suitesparse" CACHE STRING + "Postfix for installation target of header from SuiteSparse (default: \"suitesparse\")" ) -if ( LOCAL_INSTALL ) +if ( SUITESPARSE_LOCAL_INSTALL ) + if ( INSIDE_SUITESPARSE ) + # ../lib and ../include exist: the package is inside SuiteSparse. + # find ( REAL_PATH ...) requires cmake 3.19. + if ( SUITESPARSE_SECOND_LEVEL ) + file ( REAL_PATH ${CMAKE_SOURCE_DIR}/../.. + SUITESPARSE_LOCAL_PREFIX ) + else ( ) + file ( REAL_PATH ${CMAKE_SOURCE_DIR}/.. + SUITESPARSE_LOCAL_PREFIX ) + endif ( ) + endif ( ) set ( SUITESPARSE_LIBDIR ${SUITESPARSE_LOCAL_PREFIX}/lib ) - set ( SUITESPARSE_INCLUDEDIR ${SUITESPARSE_LOCAL_PREFIX}/include ) + set ( SUITESPARSE_INCLUDEDIR ${SUITESPARSE_LOCAL_PREFIX}/include/${SUITESPARSE_INCLUDEDIR_POSTFIX} ) set ( SUITESPARSE_BINDIR ${SUITESPARSE_LOCAL_PREFIX}/bin ) else ( ) set ( SUITESPARSE_LIBDIR ${CMAKE_INSTALL_LIBDIR} ) - set ( SUITESPARSE_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR} ) + set ( SUITESPARSE_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}/${SUITESPARSE_INCLUDEDIR_POSTFIX} ) set ( SUITESPARSE_BINDIR ${CMAKE_INSTALL_BINDIR} ) endif ( ) if ( INSIDE_SUITESPARSE ) # append ../lib to the install and build runpaths - set ( CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} ${SUITESPARSE_LIBDIR} ) - set ( CMAKE_BUILD_RPATH ${CMAKE_BUILD_RPATH} ${SUITESPARSE_LIBDIR} ) + list ( APPEND CMAKE_INSTALL_RPATH ${SUITESPARSE_LIBDIR} ) + list ( APPEND CMAKE_BUILD_RPATH ${SUITESPARSE_LIBDIR} ) endif ( ) -message ( STATUS "Install lib: ${SUITESPARSE_LIBDIR}" ) -message ( STATUS "Install include: ${SUITESPARSE_INCLUDEDIR}" ) -message ( STATUS "Install bin: ${SUITESPARSE_BINDIR}" ) -message ( STATUS "Install rpath: ${CMAKE_INSTALL_RPATH}" ) -message ( STATUS "Build rpath: ${CMAKE_BUILD_RPATH}" ) +set ( SUITESPARSE_PKGFILEDIR ${SUITESPARSE_LIBDIR} CACHE STRING + "Directory where CMake Config and pkg-config files will be installed" ) + +message ( STATUS "Install lib: ${SUITESPARSE_LIBDIR}" ) +message ( STATUS "Install include: ${SUITESPARSE_INCLUDEDIR}" ) +message ( STATUS "Install bin: ${SUITESPARSE_BINDIR}" ) +message ( STATUS "Install pkg-file: ${SUITESPARSE_PKGFILEDIR}" ) +message ( STATUS "Install rpath: ${CMAKE_INSTALL_RPATH}" ) +message ( STATUS "Build rpath: ${CMAKE_BUILD_RPATH}" ) if ( NOT CMAKE_BUILD_TYPE ) set ( CMAKE_BUILD_TYPE Release ) endif ( ) -message ( STATUS "Build type: ${CMAKE_BUILD_TYPE} ") +message ( STATUS "Build type: ${CMAKE_BUILD_TYPE} ") set ( CMAKE_INCLUDE_CURRENT_DIR ON ) +#------------------------------------------------------------------------------- +# Workaround for math.h on old macOS +#------------------------------------------------------------------------------- + +if ( APPLE AND CMAKE_SYSTEM_VERSION VERSION_LESS 11 ) + # Older versions of math.h on the Mac define Real and Imag, which + # conflict with the internal use of those symbols in CHOLMOD, KLU, SPQR, + # UMFPACK, and ParU. + # This can be disabled with -D__NOEXTENSIONS__ + message ( STATUS "MacOS: disable extensions in math.h" ) + add_compile_definitions ( "__NOEXTENSIONS__" ) +endif ( ) + #------------------------------------------------------------------------------- # check if Fortran is available and enabled #------------------------------------------------------------------------------- include ( CheckLanguage ) -option ( NFORTRAN "ON: do not try to use Fortran. OFF (default): try Fortran" off ) -if ( NFORTRAN ) - message ( STATUS "Fortran: not enabled" ) -else ( ) +option ( SUITESPARSE_USE_FORTRAN "ON (default): use Fortran. OFF: do not use Fortran" ON ) +if ( SUITESPARSE_USE_FORTRAN ) check_language ( Fortran ) if ( CMAKE_Fortran_COMPILER ) enable_language ( Fortran ) - message ( STATUS "Fortran: ${CMAKE_Fortran_COMPILER}" ) + message ( STATUS "Fortran: ${CMAKE_Fortran_COMPILER}" ) + set ( SUITESPARSE_HAS_FORTRAN ON ) else ( ) # Fortran not available: - set ( NFORTRAN true ) - message ( STATUS "Fortran: not available" ) + set ( SUITESPARSE_HAS_FORTRAN OFF ) + message ( STATUS "Fortran: not available" ) endif ( ) +else ( ) + message ( STATUS "Fortran: not enabled" ) + set ( SUITESPARSE_HAS_FORTRAN OFF ) +endif ( ) + +# check for strict usage +if ( SUITESPARSE_USE_STRICT AND SUITESPARSE_USE_FORTRAN AND NOT SUITESPARSE_HAS_FORTRAN ) + message ( FATAL_ERROR "Fortran required for SuiteSparse but not found" ) endif ( ) # default C-to-Fortran name mangling if Fortran compiler not found @@ -217,48 +312,54 @@ endif ( ) # find CUDA #------------------------------------------------------------------------------- -if ( ENABLE_CUDA ) +option ( SUITESPARSE_USE_CUDA "ON (default): enable CUDA acceleration for SuiteSparse, OFF: do not use CUDA" ON ) + +if ( SUITESPARSE_USE_CUDA ) # try finding CUDA check_language ( CUDA ) - message ( STATUS "Looking for CUDA" ) + # message ( STATUS "Looking for CUDA" ) if ( CMAKE_CUDA_COMPILER ) # with CUDA: - message ( STATUS "Find CUDA tool kit:" ) + # message ( STATUS "Find CUDA tool kit:" ) # FindCUDAToolKit needs to have C or CXX enabled first (see above) - include ( FindCUDAToolkit ) - message ( STATUS "CUDA toolkit found: " ${CUDAToolkit_FOUND} ) - message ( STATUS "CUDA toolkit version: " ${CUDAToolkit_VERSION} ) - message ( STATUS "CUDA toolkit include: " ${CUDAToolkit_INCLUDE_DIRS} ) - message ( STATUS "CUDA toolkit lib dir: " ${CUDAToolkit_LIBRARY_DIR} ) + find_package ( CUDAToolkit ) + message ( STATUS "CUDA toolkit : " ${CUDAToolkit_FOUND} ) + message ( STATUS "CUDA toolkit ver: " ${CUDAToolkit_VERSION} ) + message ( STATUS "CUDA toolkit inc: " ${CUDAToolkit_INCLUDE_DIRS} ) + message ( STATUS "CUDA toolkit lib: " ${CUDAToolkit_LIBRARY_DIR} ) if ( CUDAToolkit_VERSION VERSION_LESS "11.2" ) # CUDA is present but too old - message ( STATUS "CUDA: not enabled (CUDA 11.2 or later required)" ) - set ( SUITESPARSE_CUDA off ) + message ( STATUS "CUDA: not enabled (CUDA 11.2 or later required)" ) + set ( SUITESPARSE_HAS_CUDA OFF ) else ( ) # CUDA 11.2 or later present enable_language ( CUDA ) - set ( SUITESPARSE_CUDA on ) + set ( SUITESPARSE_HAS_CUDA ON ) endif ( ) else ( ) # without CUDA: - message ( STATUS "CUDA: not found" ) - set ( SUITESPARSE_CUDA off ) + message ( STATUS "CUDA: not found" ) + set ( SUITESPARSE_HAS_CUDA OFF ) endif ( ) else ( ) # CUDA is disabled - set ( SUITESPARSE_CUDA off ) + set ( SUITESPARSE_HAS_CUDA OFF ) endif ( ) -if ( SUITESPARSE_CUDA ) - message ( STATUS "CUDA: enabled" ) - add_compile_definitions ( SUITESPARSE_CUDA ) +if ( SUITESPARSE_HAS_CUDA ) + message ( STATUS "CUDA: enabled" ) set ( SUITESPARSE_CUDA_ARCHITECTURES "52;75;80" CACHE STRING "CUDA architectures" ) set ( CMAKE_CUDA_ARCHITECTURES ${SUITESPARSE_CUDA_ARCHITECTURES} ) else ( ) - message ( STATUS "CUDA: not enabled" ) + message ( STATUS "CUDA: not enabled" ) +endif ( ) + +# check for strict usage +if ( SUITESPARSE_USE_STRICT AND SUITESPARSE_USE_CUDA AND NOT SUITESPARSE_HAS_CUDA ) + message ( FATAL_ERROR "CUDA required for SuiteSparse but not found" ) endif ( ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseReport.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseReport.cmake index 9271c4a9..0b47f34c 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseReport.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseReport.cmake @@ -10,21 +10,15 @@ #------------------------------------------------------------------------------- message ( STATUS "------------------------------------------------------------------------" ) -message ( STATUS "SuiteSparse CMAKE report for: ${CMAKE_PROJECT_NAME}" ) +message ( STATUS "SuiteSparse CMAKE report for: ${PROJECT_NAME}" ) message ( STATUS "------------------------------------------------------------------------" ) -message ( STATUS "inside common SuiteSparse root: ${INSIDE_SUITESPARSE}" ) -message ( STATUS "install in SuiteSparse/lib and SuiteSparse/include: ${LOCAL_INSTALL}" ) -message ( STATUS "build type: ${CMAKE_BUILD_TYPE}" ) -if ( NSTATIC ) - message ( STATUS "NSTATIC: true (do not build static library)" ) -else ( ) - message ( STATUS "NSTATIC: false (build static library)" ) -endif ( ) -if ( OPENMP_FOUND ) - message ( STATUS "use OpenMP: yes ") -else ( ) - message ( STATUS "use OpenMP: no ") +if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) + message ( STATUS "inside common SuiteSparse root: ${INSIDE_SUITESPARSE}" ) + message ( STATUS "install in SuiteSparse/lib and SuiteSparse/include: ${SUITESPARSE_LOCAL_INSTALL}" ) endif ( ) +message ( STATUS "build type: ${CMAKE_BUILD_TYPE}" ) +message ( STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}" ) +message ( STATUS "BUILD_STATIC_LIBS: ${BUILD_STATIC_LIBS}" ) message ( STATUS "C compiler: ${CMAKE_C_COMPILER} ") message ( STATUS "C flags: ${CMAKE_C_FLAGS}" ) message ( STATUS "C++ compiler: ${CMAKE_CXX_COMPILER}" ) @@ -36,10 +30,10 @@ else ( ) message ( STATUS "C Flags release: ${CMAKE_C_FLAGS_RELEASE} ") message ( STATUS "C++ Flags release: ${CMAKE_CXX_FLAGS_RELEASE} ") endif ( ) -if ( NFORTRAN ) - message ( STATUS "Fortran compiler: none" ) -else ( ) +if ( SUITESPARSE_HAS_FORTRAN ) message ( STATUS "Fortran compiler: ${CMAKE_Fortran_COMPILER} " ) +else ( ) + message ( STATUS "Fortran compiler: none" ) endif ( ) get_property ( CDEFN DIRECTORY PROPERTY COMPILE_DEFINITIONS ) message ( STATUS "compile definitions: ${CDEFN}") @@ -49,7 +43,4 @@ endif ( ) if ( DEFINED CMAKE_CUDA_ARCHITECTURES ) message ( STATUS "CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}" ) endif ( ) -if ( NPARTITION ) - message ( STATUS "NPARTITION: do not use METIS" ) -endif ( ) message ( STATUS "------------------------------------------------------------------------" ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparse__thread.cmake b/SuiteSparse_config/cmake_modules/SuiteSparse__thread.cmake index 75c5cb61..1c52185b 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparse__thread.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparse__thread.cmake @@ -10,7 +10,7 @@ # determine if the __thread keyword is available, which is an extension by # gcc but supported by many compilers, to indicate thread-local-storage. -include ( CheckCSourceRuns ) +include ( CheckCSourceCompiles ) set ( thread_src " #include @@ -43,11 +43,11 @@ set ( thread_local_src } " ) -check_c_source_runs ( "${declspec_thread_src}" HAVE_KEYWORD__DECLSPEC_THREAD ) +check_c_source_compiles ( "${declspec_thread_src}" HAVE_KEYWORD__DECLSPEC_THREAD ) -check_c_source_runs ( "${thread_src}" HAVE_KEYWORD__THREAD ) +check_c_source_compiles ( "${thread_src}" HAVE_KEYWORD__THREAD ) -check_c_source_runs ( "${thread_local_src}" HAVE_KEYWORD__THREAD_LOCAL ) +check_c_source_compiles ( "${thread_local_src}" HAVE_KEYWORD__THREAD_LOCAL ) if ( HAVE_KEYWORD__DECLSPEC_THREAD ) add_compile_definitions ( HAVE_KEYWORD__DECLSPEC_THREAD ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparse_ssize_t.cmake b/SuiteSparse_config/cmake_modules/SuiteSparse_ssize_t.cmake deleted file mode 100644 index 2b74bae8..00000000 --- a/SuiteSparse_config/cmake_modules/SuiteSparse_ssize_t.cmake +++ /dev/null @@ -1,32 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/cmake_modules/SuiteSparse_ssize_t.cmake -#------------------------------------------------------------------------------- - -# Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# determine if the compiler defines ssize_t - -include ( CheckCSourceCompiles ) - -set ( ssize_t_source -" #include - int main (void) - { - ssize_t x = 0 ; - return (0) ; - } -" ) - -check_c_source_compiles ( "${ssize_t_source}" TEST_FOR_SSIZE_T ) - -if ( TEST_FOR_SSIZE_T ) - set ( HAVE_SSIZE_T true ) - message ( STATUS "#include and ssize_t: OK" ) -else ( ) - set ( HAVE_SSIZE_T false ) - message ( STATUS "#include and ssize_t: not found" ) -endif ( ) - From 025cf31c1996f080a8016e20148e427414f00d17 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 25 Mar 2024 10:51:53 -0500 Subject: [PATCH 2/2] oops: revert this branch to 3.0.0 (last commit for 3.1.0 was made to the wronge branch) --- .gitattributes | 2 - .github/ISSUE_TEMPLATE/bug_report.md | 28 - .github/ISSUE_TEMPLATE/feature_request.md | 20 - .github/dependabot.yml | 8 - .github/pull_request_template.md | 1 - .github/workflows/build-arch-emu.yaml | 245 --- .github/workflows/build.yaml | 520 ------ .github/workflows/codeql-analysis.yaml | 204 --- .github/workflows/macos.yaml | 159 -- .github/workflows/root-cmakelists.yaml | 570 ------ .gitignore | 4 - AMD/CMakeLists.txt | 259 +-- AMD/Config/AMD.pc.in | 17 - AMD/Config/AMDConfig.cmake.in | 152 -- AMD/Config/amd.h.in | 24 +- AMD/Demo/amd_demo.c | 15 +- AMD/Demo/amd_demo.out | 6 +- AMD/Demo/amd_demo2.out | 4 +- AMD/Demo/amd_l_demo.c | 15 +- AMD/Demo/amd_l_demo.out | 6 +- AMD/Doc/AMD_UserGuide.pdf | Bin 238498 -> 237985 bytes AMD/Doc/AMD_UserGuide.tex | 18 +- AMD/Doc/ChangeLog | 26 - AMD/Doc/amd_version.tex | 2 +- AMD/Include/amd.h | 30 +- AMD/Include/amd_internal.h | 9 +- AMD/Makefile | 34 +- AMD/Source/amd_order.c | 17 +- AMD/Source/amd_version.c | 19 - AMD/cmake_modules/FindAMD.cmake | 129 ++ CITATION.bib | 91 - COLAMD/CMakeLists.txt | 224 +-- COLAMD/Config/COLAMD.pc.in | 17 - COLAMD/Config/COLAMDConfig.cmake.in | 152 -- COLAMD/Config/colamd.h.in | 27 +- COLAMD/Demo/colamd_example.c | 15 - COLAMD/Demo/colamd_example.out | 5 +- COLAMD/Demo/colamd_l_example.c | 15 - COLAMD/Demo/colamd_l_example.out | 5 +- COLAMD/Doc/ChangeLog | 29 - COLAMD/Include/colamd.h | 31 +- COLAMD/Makefile | 20 +- COLAMD/Source/colamd.c | 1 + COLAMD/Source/colamd_version.c | 19 - COLAMD/cmake_modules/FindCOLAMD.cmake | 129 ++ CONTRIBUTING.md | 18 - CONTRIBUTOR-LICENSE.txt | 177 -- LICENSE.txt | 113 -- Makefile | 17 +- README.md | 174 +- SPEX/CMakeLists.txt | 582 ++---- SPEX/Config/SPEX.h.in | 140 +- SPEX/Config/SPEX.pc.in | 18 - SPEX/Config/SPEXConfig.cmake.in | 190 -- SPEX/Config/Tcov_Makefile.in | 69 +- SPEX/Config/spex_deps.m.in | 10 +- .../Demo/Utilities/spex_demo_check_solution.c | 88 +- .../Utilities/spex_demo_determine_error.c | 24 +- .../spex_demo_process_command_line.c | 4 +- SPEX/Demo/Utilities/spex_demo_read_dense.c | 4 +- SPEX/Demo/Utilities/spex_demo_tripread.c | 13 +- SPEX/Demo/spex_demo_backslash.c | 76 +- SPEX/Demo/spex_demo_cholesky_extended.c | 95 +- SPEX/Demo/spex_demo_cholesky_simple.c | 115 +- SPEX/Demo/spex_demo_lu_doub.c | 184 +- SPEX/Demo/spex_demo_lu_extended.c | 157 +- SPEX/Demo/spex_demo_lu_simple1.c | 69 +- SPEX/Demo/spex_demo_lu_simple2.c | 74 +- SPEX/Demo/spex_demo_threaded.c | 68 +- SPEX/Demo/spex_demos.h | 56 +- SPEX/Doc/ChangeLog | 16 - SPEX/Doc/Makefile | 4 +- SPEX/Doc/SPEX-3.0_UserGuide.pdf | Bin 0 -> 416827 bytes ...X_UserGuide.tex => SPEX-3.0_UserGuide.tex} | 96 +- SPEX/Doc/SPEX-3.0_User_Guide.pdf | Bin 0 -> 424711 bytes SPEX/Doc/SPEX_UserGuide.pdf | Bin 386707 -> 0 bytes SPEX/Doc/SPEX_version.tex | 2 +- SPEX/Include/SPEX.h | 140 +- SPEX/LICENSE.txt | 4 +- SPEX/MATLAB/Source/SPEX_mex.h | 4 +- SPEX/MATLAB/Source/spex_mex_check_for_inf.c | 4 +- SPEX/MATLAB/Source/spex_mex_error.c | 4 +- SPEX/MATLAB/Source/spex_mex_get_A_and_b.c | 4 +- .../Source/spex_mex_get_matlab_options.c | 4 +- SPEX/MATLAB/spex_backslash.m | 4 +- SPEX/MATLAB/spex_backslash_mex_soln.c | 4 +- SPEX/MATLAB/spex_cholesky_backslash.m | 4 +- SPEX/MATLAB/spex_cholesky_mex_soln.c | 4 +- SPEX/MATLAB/spex_lu_backslash.m | 4 +- SPEX/MATLAB/spex_lu_mex_soln.c | 4 +- SPEX/MATLAB/spex_mex_demo.m | 4 +- SPEX/MATLAB/spex_mex_install.m | 38 +- SPEX/MATLAB/spex_mex_test.m | 6 +- SPEX/Makefile | 21 +- SPEX/Python/SPEXpy/Options.py | 4 +- SPEX/Python/SPEXpy/SPEX_error.py | 4 +- .../SPEXpy/Source/spex_python_connect.c | 4 +- .../SPEXpy/Source/spex_python_connect.h | 4 +- SPEX/Python/SPEXpy/__init__.py | 4 +- SPEX/Python/SPEXpy/backslash.py | 4 +- SPEX/Python/SPEXpy/cholesky_backslash.py | 4 +- SPEX/Python/SPEXpy/lu_backslash.py | 4 +- SPEX/Python/SPEXpy/spex_connect.py | 4 +- SPEX/Python/SPEXpy/spex_matrix_from_file.py | 4 +- SPEX/Python/spex_python_demo.py | 4 +- SPEX/SPEX_Backslash/License/license.txt | 4 +- SPEX/SPEX_Backslash/Source/SPEX_backslash.c | 4 +- SPEX/SPEX_Cholesky/License/license.txt | 4 +- .../Source/SPEX_cholesky_analyze.c | 4 +- .../Source/SPEX_cholesky_backslash.c | 4 +- .../Source/SPEX_cholesky_factorize.c | 4 +- .../Source/SPEX_cholesky_solve.c | 4 +- .../Source/spex_cholesky_backward_sub.c | 4 +- .../Source/spex_cholesky_counts.c | 4 +- .../Source/spex_cholesky_ereach.c | 4 +- .../Source/spex_cholesky_etree.c | 4 +- .../Source/spex_cholesky_factor.c | 6 +- .../Source/spex_cholesky_forward_sub.c | 4 +- .../Source/spex_cholesky_internal.h | 4 +- .../SPEX_Cholesky/Source/spex_cholesky_leaf.c | 4 +- .../Source/spex_cholesky_left_factor.c | 4 +- .../spex_cholesky_left_triangular_solve.c | 12 +- .../Source/spex_cholesky_permute_A.c | 4 +- .../SPEX_Cholesky/Source/spex_cholesky_post.c | 4 +- .../Source/spex_cholesky_pre_left_factor.c | 4 +- .../Source/spex_cholesky_preorder.c | 4 +- .../Source/spex_cholesky_symbolic_analysis.c | 6 +- .../SPEX_Cholesky/Source/spex_cholesky_tdfs.c | 4 +- .../Source/spex_cholesky_up_factor.c | 8 +- .../spex_cholesky_up_triangular_solve.c | 38 +- SPEX/SPEX_LU/License/license.txt | 4 +- SPEX/SPEX_LU/Source/SPEX_lu_analyze.c | 4 +- SPEX/SPEX_LU/Source/SPEX_lu_backslash.c | 4 +- SPEX/SPEX_LU/Source/SPEX_lu_factorize.c | 4 +- SPEX/SPEX_LU/Source/SPEX_lu_solve.c | 4 +- SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c | 4 +- SPEX/SPEX_LU/Source/spex_left_lu_dfs.c | 4 +- .../SPEX_LU/Source/spex_left_lu_forward_sub.c | 4 +- .../Source/spex_left_lu_get_largest_pivot.c | 8 +- .../Source/spex_left_lu_get_nonzero_pivot.c | 4 +- SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c | 12 +- .../Source/spex_left_lu_get_smallest_pivot.c | 8 +- SPEX/SPEX_LU/Source/spex_left_lu_reach.c | 4 +- .../spex_left_lu_ref_triangular_solve.c | 10 +- SPEX/SPEX_LU/Source/spex_lu_internal.h | 4 +- SPEX/SPEX_Utilities/License/license.txt | 4 +- SPEX/SPEX_Utilities/Source/SPEX_calloc.c | 4 +- .../Source/SPEX_create_default_options.c | 4 +- .../Source/SPEX_determine_symmetry.c | 4 +- .../Source/SPEX_factorization_free.c | 6 +- SPEX/SPEX_Utilities/Source/SPEX_finalize.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_free.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 166 +- SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 13 +- .../Source/SPEX_initialize_expert.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_malloc.c | 4 +- .../Source/SPEX_matrix_allocate.c | 17 +- .../SPEX_Utilities/Source/SPEX_matrix_check.c | 22 +- SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 95 +- SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c | 6 +- SPEX/SPEX_Utilities/Source/SPEX_realloc.c | 4 +- .../Source/SPEX_symbolic_analysis_free.c | 4 +- .../Source/SPEX_thread_finalize.c | 4 +- .../Source/SPEX_thread_initialize.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_transpose.c | 4 +- SPEX/SPEX_Utilities/Source/SPEX_version.c | 4 +- SPEX/SPEX_Utilities/Source/spex_amd.c | 4 +- SPEX/SPEX_Utilities/Source/spex_cast_array.c | 11 +- SPEX/SPEX_Utilities/Source/spex_cast_matrix.c | 4 +- SPEX/SPEX_Utilities/Source/spex_colamd.c | 4 +- .../Source/spex_create_mpfr_array.c | 12 +- SPEX/SPEX_Utilities/Source/spex_create_mpq.c | 37 + .../Source/spex_create_mpq_array.c | 12 +- .../Source/spex_create_mpz_array.c | 17 +- SPEX/SPEX_Utilities/Source/spex_cumsum.c | 4 +- .../Source/spex_expand_double_array.c | 14 +- .../Source/spex_expand_mpfr_array.c | 32 +- .../Source/spex_expand_mpq_array.c | 8 +- .../Source/spex_free_mpfr_array.c | 50 - .../Source/spex_free_mpq_array.c | 50 - .../Source/spex_free_mpz_array.c | 50 - SPEX/SPEX_Utilities/Source/spex_gmp.h | 101 +- SPEX/SPEX_Utilities/Source/spex_matrix_mul.c | 4 +- .../Source/spex_permute_dense_matrix.c | 4 +- .../Source/spex_sparse_collapse.c | 4 +- .../Source/spex_sparse_realloc.c | 4 +- .../Source/spex_util_internal.h | 206 +-- SPEX/Tcov/.gitignore | 25 +- SPEX/Tcov/simple_rand.c | 4 +- SPEX/Tcov/simple_rand.h | 4 +- SPEX/Tcov/tcov_for_cholesky.c | 55 +- SPEX/Tcov/tcov_for_lu.c | 9 +- SPEX/Tcov/tcov_for_lu2.c | 29 +- SPEX/Tcov/tcov_for_other.c | 104 -- SPEX/Tcov/tcov_utilities.c | 16 +- SPEX/Tcov/tcov_utilities.h | 4 +- SPEX/cmake_modules/FindGMP.cmake | 4 +- SPEX/cmake_modules/FindMPFR.cmake | 4 +- SPEX/cmake_modules/FindSPEX.cmake | 114 ++ SuiteSparse_config/CMakeLists.txt | 302 +--- SuiteSparse_config/Config/README.md.in | 1574 ++++++----------- .../Config/SuiteSparse_config.h.in | 956 +--------- .../Config/SuiteSparse_config.pc.in | 16 - .../Config/SuiteSparse_configConfig.cmake.in | 171 -- SuiteSparse_config/Makefile | 14 +- SuiteSparse_config/README.txt | 2 +- SuiteSparse_config/SuiteSparse_config.c | 9 +- SuiteSparse_config/SuiteSparse_config.h | 960 +--------- .../FindSuiteSparse_config.cmake | 141 ++ .../cmake_modules/SuiteSparseBLAS.cmake | 62 +- .../cmake_modules/SuiteSparseBLAS64.cmake | 6 +- .../cmake_modules/SuiteSparseLAPACK.cmake | 15 +- .../cmake_modules/SuiteSparsePolicy.cmake | 313 ++-- .../cmake_modules/SuiteSparseReport.cmake | 29 +- .../cmake_modules/SuiteSparse__thread.cmake | 8 +- .../cmake_modules/SuiteSparse_ssize_t.cmake | 32 + 217 files changed, 3077 insertions(+), 9431 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/dependabot.yml delete mode 100644 .github/pull_request_template.md delete mode 100644 .github/workflows/build-arch-emu.yaml delete mode 100644 .github/workflows/build.yaml delete mode 100644 .github/workflows/codeql-analysis.yaml delete mode 100644 .github/workflows/macos.yaml delete mode 100644 .github/workflows/root-cmakelists.yaml delete mode 100644 AMD/Config/AMD.pc.in delete mode 100644 AMD/Config/AMDConfig.cmake.in delete mode 100644 AMD/Source/amd_version.c create mode 100644 AMD/cmake_modules/FindAMD.cmake delete mode 100644 CITATION.bib delete mode 100644 COLAMD/Config/COLAMD.pc.in delete mode 100644 COLAMD/Config/COLAMDConfig.cmake.in delete mode 100644 COLAMD/Source/colamd_version.c create mode 100644 COLAMD/cmake_modules/FindCOLAMD.cmake delete mode 100644 CONTRIBUTING.md delete mode 100644 CONTRIBUTOR-LICENSE.txt delete mode 100644 LICENSE.txt delete mode 100644 SPEX/Config/SPEX.pc.in delete mode 100644 SPEX/Config/SPEXConfig.cmake.in create mode 100644 SPEX/Doc/SPEX-3.0_UserGuide.pdf rename SPEX/Doc/{SPEX_UserGuide.tex => SPEX-3.0_UserGuide.tex} (97%) create mode 100644 SPEX/Doc/SPEX-3.0_User_Guide.pdf delete mode 100644 SPEX/Doc/SPEX_UserGuide.pdf create mode 100644 SPEX/SPEX_Utilities/Source/spex_create_mpq.c delete mode 100644 SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c delete mode 100644 SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c delete mode 100644 SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c delete mode 100644 SPEX/Tcov/tcov_for_other.c create mode 100644 SPEX/cmake_modules/FindSPEX.cmake delete mode 100644 SuiteSparse_config/Config/SuiteSparse_config.pc.in delete mode 100644 SuiteSparse_config/Config/SuiteSparse_configConfig.cmake.in create mode 100644 SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake create mode 100644 SuiteSparse_config/cmake_modules/SuiteSparse_ssize_t.cmake diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 49e7a27f..00000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# line endings in repository match line endings on disc -* -text diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dfde282e..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior. - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - compiler [e.g. gcc 7.4, icc 19.0] - - BLAS and LAPACK library, if applicable - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7d..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index df4d15b3..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: 2 -updates: - - - package-ecosystem: "github-actions" - directory: "/" - schedule: - # Check for updates to GitHub Actions every week - interval: "weekly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 94813bcc..00000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1 +0,0 @@ -No pull request can be accepted unless you first sign the Contributor License Agreement [ CONTRIBUTOR-LICENSE.txt ]. Print it as a PDF and email me a signed PDF (digital signature OK). Submit all PRs to the dev2 branch only. diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml deleted file mode 100644 index 5ff0ec40..00000000 --- a/.github/workflows/build-arch-emu.yaml +++ /dev/null @@ -1,245 +0,0 @@ -name: arch-emu -on: - workflow_dispatch: - push: - branches-ignore: - - '**/dev2' - - '**/*dev2' - pull_request: - -concurrency: ci-arch-emu-${{ github.ref }} - -env: - # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" - # string with name of libraries to be checked - CHECK_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" - # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" - - -jobs: - - alpine: - runs-on: ubuntu-latest - - defaults: - run: - # Use emulated shell as default - shell: alpine.sh {0} - - strategy: - # Allow other runners in the matrix to continue if some fail - fail-fast: false - - matrix: - # For available CPU architectures, see: - # https://github.com/marketplace/actions/setup-alpine-linux-environment - arch: [x86, aarch64, armv7, ppc64le, s390x] - include: - - arch: x86 - ccache-max: 80M - - arch: aarch64 - ccache-max: 42M - - arch: armv7 - ccache-max: 42M - - arch: ppc64le - ccache-max: 45M - - arch: s390x - ccache-max: 42M - - name: alpine (${{ matrix.arch }}) - - steps: - - name: get CPU information (host) - shell: bash - run: lscpu - - - name: checkout repository - uses: actions/checkout@v4 - # shell: bash - - - name: install dependencies - uses: jirutka/setup-alpine@v1 - # shell: bash - with: - arch: ${{ matrix.arch }} - packages: > - build-base - ccache - cmake - gfortran - m4 - gmp-dev - mpfr-dev - lapack-dev - python3 - valgrind - util-linux-misc - autoconf - automake - libtool - - - name: get CPU information (emulated) - run: lscpu - - - name: prepare ccache - # create key with human readable timestamp - # used in action/cache/restore and action/cache/save steps - id: ccache-prepare - run: | - echo "key=ccache:alpine:${{ matrix.arch }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - - - name: restore ccache - # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 - with: - # location of the ccache of the chroot in the root file system - path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache - key: ${{ steps.ccache-prepare.outputs.key }} - # Prefer caches from the same branch. Fall back to caches from the dev branch. - restore-keys: | - ccache:alpine:${{ matrix.arch }}:${{ github.ref }} - ccache:alpine:${{ matrix.arch }} - - - name: configure ccache - env: - CCACHE_MAX: ${{ matrix.ccache-max }} - run: | - test -d ~/.ccache || mkdir ~/.ccache - echo "max_size = $CCACHE_MAX" >> ~/.ccache/ccache.conf - echo "compression = true" >> ~/.ccache/ccache.conf - ccache -s - which ccache - # echo "/usr/lib/ccache" >> $GITHUB_PATH - - - name: build - run: | - echo "gcc --version" - gcc --version - echo "gcc -dumpmachine" - gcc -dumpmachine - IFS=: - BUILD_LIBS="${BUILD_LIBS}${{ matrix.extra-build-libs }}" - for lib in ${BUILD_LIBS}; do - printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" - echo "::group::Configure $lib" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ - -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ - -DBUILD_SHARED_LIBS=ON \ - -DBUILD_STATIC_LIBS=OFF \ - -DBLA_VENDOR="Generic" \ - -DGRAPHBLAS_COMPACT=ON \ - -DSUITESPARSE_DEMOS=OFF \ - -DBUILD_TESTING=OFF \ - .. - echo "::endgroup::" - echo "::group::Build $lib" - cmake --build . --config Release - echo "::endgroup::" - done - - - name: check - timeout-minutes: 60 - run: | - IFS=':' - CHECK_LIBS="${CHECK_LIBS}${{ matrix.extra-check-libs }}" - for lib in ${CHECK_LIBS}; do - printf "::group:: \033[0;32m==>\033[0m Checking library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/${lib} - make demos CMAKE_OPTIONS="-DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON" - echo "::endgroup::" - done - - - name: ccache status - continue-on-error: true - run: ccache -s - - - name: save ccache - # Save the cache after we are done (successfully) building - # This helps to retain the ccache even if the subsequent steps are failing. - uses: actions/cache/save@v4 - with: - path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache - key: ${{ steps.ccache-prepare.outputs.key }} - - - name: install - run: | - IFS=':' - BUILD_LIBS="${BUILD_LIBS}${{ matrix.extra-build-libs }}" - for lib in ${BUILD_LIBS}; do - printf "::group::\033[0;32m==>\033[0m Installing library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake --install . - echo "::endgroup::" - done - - - name: build example using CMake - run: | - cd ${GITHUB_WORKSPACE}/Example/build - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ - -DBLA_VENDOR="Generic" \ - .. - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - cmake --build . - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - printf "\033[1;35m C binary with shared libraries\033[0m\n" - ./my_demo - printf "\033[1;35m C++ binary with shared libraries\033[0m\n" - ./my_cxx_demo - echo "::endgroup::" - - - name: test Config - run: | - IFS=: - INSTALLED_LIBS="${INSTALLED_LIBS}${{ matrix.extra-build-libs }}" - for lib in ${INSTALLED_LIBS}; do - printf "::group:: \033[0;32m==>\033[0m Building with Config.cmake with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - cd build - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ - .. - cmake --build . --config Release - echo "::endgroup::" - done - - - name: build example using autotools - run: | - cd ${GITHUB_WORKSPACE}/Example - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - autoreconf -fi - mkdir build-autotools - cd build-autotools - PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ - ../configure --enable-shared --disable-static - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - make all - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - printf "\033[1;35m C binary\033[0m\n" - LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_demo - printf "\033[1;35m C++ binary\033[0m\n" - LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_cxx_demo - echo "::endgroup::" - IFS=: - INSTALLED_LIBS="${INSTALLED_LIBS}${{ matrix.extra-build-libs }}" - for lib in ${INSTALLED_LIBS}; do - printf "::group:: \033[0;32m==>\033[0m Building test with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - autoreconf -fi - mkdir build-autotools && cd build-autotools - PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ - ../configure --enable-shared --disable-static - make all - echo "::endgroup::" - done diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml deleted file mode 100644 index 07c9d397..00000000 --- a/.github/workflows/build.yaml +++ /dev/null @@ -1,520 +0,0 @@ -name: build -on: - workflow_dispatch: - push: - branches-ignore: - - '**/dev2' - - '**/*dev2' - pull_request: - -concurrency: ci-${{ github.ref }} - -env: - # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" - # string with name of libraries to be checked - CHECK_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" - # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" - -jobs: - - ubuntu: - # For available GitHub-hosted runners, see: - # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners - runs-on: ubuntu-latest - - name: ubuntu (${{ matrix.compiler }} ${{ matrix.cuda }} CUDA ${{ matrix.openmp }} OpenMP, ${{ matrix.link }}) - - strategy: - # Allow other runners in the matrix to continue if some fail - fail-fast: false - - matrix: - compiler: [gcc, clang] - cuda: [with, without] - openmp: [with] - link: [both] - include: - - compiler: gcc - compiler-pkgs: "g++ gcc" - cc: "gcc" - cxx: "g++" - - compiler: clang - compiler-pkgs: "clang libomp-dev" - cc: "clang" - cxx: "clang++" - # Clang seems to generally require less cache size (smaller object files?). - - compiler: gcc - ccache-max: 600M - - compiler: clang - ccache-max: 500M - - cuda: with - cuda-pkgs: "nvidia-cuda-dev nvidia-cuda-toolkit" - cuda-cmake-flags: - -DSUITESPARSE_USE_CUDA=ON - -DSUITESPARSE_USE_STRICT=ON - -DCUDAToolkit_INCLUDE_DIRS="/usr/include" - -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" - - compiler: gcc - compiler-pkgs: "g++ gcc" - cc: "gcc" - cxx: "g++" - ccache-max: 600M - cuda: without - openmp: without - openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" - - compiler: gcc - compiler-pkgs: "g++ gcc" - cc: "gcc" - cxx: "g++" - ccache-max: 600M - cuda: with - cuda-pkgs: "nvidia-cuda-dev nvidia-cuda-toolkit" - cuda-cmake-flags: - -DSUITESPARSE_USE_CUDA=ON - -DSUITESPARSE_USE_STRICT=ON - -DCUDAToolkit_INCLUDE_DIRS="/usr/include" - -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" - openmp: with - link: static - # "Fake" a cross-compilation to exercise that build system path - link-cmake-flags: - -DBUILD_SHARED_LIBS=OFF - -DBUILD_STATIC_LIBS=ON - -DCMAKE_SYSTEM_NAME="Linux" - - env: - CC: ${{ matrix.cc }} - CXX: ${{ matrix.cxx }} - - steps: - - name: get CPU information - run: lscpu - - - name: checkout repository - uses: actions/checkout@v4 - - - name: install dependencies - env: - COMPILER_PKGS: ${{ matrix.compiler-pkgs }} - CUDA_PKGS: ${{ matrix.cuda-pkgs }} - run: | - sudo apt -qq update - sudo apt install -y ${COMPILER_PKGS} autoconf automake ccache cmake \ - dvipng gfortran libgmp-dev liblapack-dev libmpfr-dev valgrind \ - libopenblas-dev ${CUDA_PKGS} - - - name: prepare ccache - # create key with human readable timestamp - # used in action/cache/restore and action/cache/save steps - id: ccache-prepare - run: | - echo "key=ccache:ubuntu:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.openmp }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - - - name: restore ccache - # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 - with: - path: ~/.ccache - key: ${{ steps.ccache-prepare.outputs.key }} - # Prefer caches from the same branch. Fall back to caches from the dev branch. - restore-keys: | - ccache:ubuntu:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.openmp }}:${{ matrix.link }}:${{ github.ref }} - ccache:ubuntu:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.openmp }}:${{ matrix.link }}: - - - name: create empty libraries - # This is to work around a bug in nvlink. - # See: https://forums.developer.nvidia.com/t/nvlink-fatal-could-not-open-input-file-when-linking-with-empty-static-library/208517 - if: matrix.cuda == 'with' - run: | - touch empty.c - gcc -fPIC -c empty.c -oempty.o - ar rcsv libdl.a empty.o - ar rcsv librt.a empty.o - ar rcsv libpthread.a empty.o - # overwrite system libraries with "valid" empty libraries - sudo mv ./libdl.a /usr/lib/x86_64-linux-gnu/libdl.a - sudo mv ./librt.a /usr/lib/x86_64-linux-gnu/librt.a - sudo mv ./libpthread.a /usr/lib/x86_64-linux-gnu/libpthread.a - - - name: configure ccache - env: - CCACHE_MAX: ${{ matrix.ccache-max }} - run: | - test -d ~/.ccache || mkdir ~/.ccache - echo "max_size = $CCACHE_MAX" >> ~/.ccache/ccache.conf - echo "compression = true" >> ~/.ccache/ccache.conf - ccache -s - echo "/usr/lib/ccache" >> $GITHUB_PATH - - - name: build - run: | - IFS=':' read -r -a libs <<< "${BUILD_LIBS}" - for lib in "${libs[@]}"; do - printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" - echo "::group::Configure $lib" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ - -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ - -DBLA_VENDOR="OpenBLAS" \ - -DSUITESPARSE_DEMOS=OFF \ - -DBUILD_TESTING=OFF \ - ${{ matrix.cuda-cmake-flags }} \ - ${{ matrix.openmp-cmake-flags }} \ - ${{ matrix.link-cmake-flags }} \ - .. - echo "::endgroup::" - echo "::group::Build $lib" - cmake --build . --config Release - echo "::endgroup::" - done - - - name: check - timeout-minutes: 20 - run: | - IFS=':' read -r -a libs <<< "${CHECK_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Checking library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/${lib} - make demos CMAKE_OPTIONS="-DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON" - echo "::endgroup::" - done - - - name: ccache status - continue-on-error: true - run: ccache -s - - - name: save ccache - # Save the cache after we are done (successfully) building - # This helps to retain the ccache even if the subsequent steps are failing. - uses: actions/cache/save@v4 - with: - path: ~/.ccache - key: ${{ steps.ccache-prepare.outputs.key }} - - - name: install - run: | - IFS=':' read -r -a libs <<< "${BUILD_LIBS}" - for lib in "${libs[@]}"; do - printf "::group::\033[0;32m==>\033[0m Installing library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake --install . - echo "::endgroup::" - done - - - name: build example using CMake - run: | - cd ${GITHUB_WORKSPACE}/Example/build - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ - -DBLA_VENDOR="OpenBLAS" \ - ${{ matrix.cuda-cmake-flags }} \ - ${{ matrix.link-cmake-flags }} \ - .. - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - cmake --build . - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - if [ -f ./my_demo -a -f ./my_cxx_demo ]; then - printf "\033[1;35m C binary with shared libraries\033[0m\n" - ./my_demo - printf "\033[1;35m C++ binary with shared libraries\033[0m\n" - ./my_cxx_demo - fi - printf "\033[1;35m C binary with statically linked libraries\033[0m\n" - ./my_demo_static - printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" - ./my_cxx_demo_static - echo "::endgroup::" - - - name: test Config - run: | - IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Building with Config.cmake with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - cd build - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ - .. - cmake --build . --config Release - echo "::endgroup::" - done - - - name: build example using autotools - run: | - cd ${GITHUB_WORKSPACE}/Example - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - autoreconf -fi - mkdir build-autotools - cd build-autotools - if [ "${{ matrix.link }}" = static ]; then - _extra_config_flags="--enable-static --disable-shared" - else - _extra_config_flags="--enable-shared --disable-static" - fi - PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ - ../configure ${_extra_config_flags} - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - make all - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - printf "\033[1;35m C binary\033[0m\n" - LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_demo - printf "\033[1;35m C++ binary\033[0m\n" - LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_cxx_demo - echo "::endgroup::" - IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Building test with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - autoreconf -fi - mkdir build-autotools && cd build-autotools - PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ - ../configure ${_extra_config_flags} - make all - echo "::endgroup::" - done - - mingw: - # For available GitHub-hosted runners, see: - # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners - runs-on: windows-latest - - defaults: - run: - # Use MSYS2 as default shell - shell: msys2 {0} - - strategy: - # Allow other runners in the matrix to continue if some fail - fail-fast: false - - # CLANG32 is broken, as of Mar 21, 2024. The stable branch CI also fails - # the same way, even though it succeeded on Mar 2, with the same - # SuiteSparse 7.6.1 and same workflow file. Between that time, clang and - # openmp were upgraded. clang-openmp went from 17.0.6-1 to 18.1.1-1, and - # clang itself went from 17.0.6-7 to 18.1.1-3. Nothing else changed, so - # it must be a problem with the github runner (changed from 2.313.0 to - # 2.314.1). So for now, CLANG32 is excluded from this CI test. - - matrix: -# CLANG32 disabled for now: -# msystem: [MINGW64, MINGW32, CLANG64, CLANG32] - msystem: [MINGW64, MINGW32, UCRT64, CLANG64] - include: - - msystem: MINGW64 - target-prefix: mingw-w64-x86_64 - f77-package: mingw-w64-x86_64-fc - - msystem: MINGW32 - target-prefix: mingw-w64-i686 - f77-package: mingw-w64-i686-fc - - msystem: UCRT64 - target-prefix: mingw-w64-ucrt-x86_64 - # Purposefully don't install a Fortran compiler to test that configuration - f77-package: mingw-w64-ucrt-x86_64-cc - - msystem: CLANG64 - target-prefix: mingw-w64-clang-x86_64 - f77-package: mingw-w64-clang-x86_64-fc -# CLANG32 disabled for now: -# - msystem: CLANG32 -# target-prefix: mingw-w64-clang-i686 -# # There's no Fortran compiler for this environment. -# f77-package: mingw-w64-clang-i686-cc - - env: - CHERE_INVOKING: 1 - - steps: - - name: get CPU name - shell: pwsh - run : | - Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - - - name: install MSYS2 build environment - uses: msys2/setup-msys2@v2 - with: - update: true - - # Use pre-installed version to save disc space on partition with source. - release: false - - install: >- - base-devel - ${{ matrix.target-prefix }}-autotools - ${{ matrix.target-prefix }}-cmake - ${{ matrix.target-prefix }}-cc - ${{ matrix.f77-package }} - ${{ matrix.target-prefix }}-ccache - ${{ matrix.target-prefix }}-openblas - ${{ matrix.target-prefix }}-omp - ${{ matrix.target-prefix }}-python - ${{ matrix.target-prefix }}-gmp - ${{ matrix.target-prefix }}-mpfr - - msystem: ${{ matrix.msystem }} - - - name: checkout repository - uses: actions/checkout@v4 - - - name: prepare ccache - # create key with human readable timestamp - # used in action/cache/restore and action/cache/save steps - id: ccache-prepare - run: | - echo "ccachedir=$(cygpath -m $(ccache -k cache_dir))" >> $GITHUB_OUTPUT - echo "key=ccache:mingw:${{ matrix.msystem }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - - - name: restore ccache - # Setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 - with: - path: ${{ steps.ccache-prepare.outputs.ccachedir }} - key: ${{ steps.ccache-prepare.outputs.key }} - # Prefer caches from the same branch. Fall back to caches from the dev branch. - restore-keys: | - ccache:mingw:${{ matrix.msystem }}:${{ github.ref }} - ccache:mingw:${{ matrix.msystem }} - - - name: configure ccache - # Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota. - run: | - which ccache - test -d ${{ steps.ccache_cache_timestamp.outputs.ccachedir }} || mkdir -p ${{ steps.ccache_cache_timestamp.outputs.ccachedir }} - echo "max_size = 250M" > ${{ steps.ccache_cache_timestamp.outputs.ccachedir }}/ccache.conf - echo "compression = true" >> ${{ steps.ccache_cache_timestamp.outputs.ccachedir }}/ccache.conf - ccache -p - ccache -s - - - name: build - run: | - IFS=':' read -r -a libs <<< "${BUILD_LIBS}" - for lib in "${libs[@]}"; do - printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" - echo "::group::Configure $lib" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ - -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ - -DBLA_VENDOR="OpenBLAS" \ - -DPython_EXECUTABLE="$(which python)" \ - -DSUITESPARSE_DEMOS=OFF \ - -DBUILD_TESTING=OFF \ - .. - echo "::endgroup::" - echo "::group::Build $lib" - cmake --build . --config Release - echo "::endgroup::" - done - - - name: check - timeout-minutes: 20 - # Need to install the libraries for the tests - run: | - echo "::group::Install libraries" - make install - echo "::endgroup::" - IFS=':' read -r -a libs <<< "${CHECK_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Checking library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/${lib} - PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ - make demos CMAKE_OPTIONS="-DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON" - echo "::endgroup::" - done - - - name: ccache status - continue-on-error: true - run: ccache -s - - - name: save ccache - # Save the cache after we are done (successfully) building - # This helps to retain the ccache even if the subsequent steps are failing. - uses: actions/cache/save@v4 - with: - path: ${{ steps.ccache-prepare.outputs.ccachedir }} - key: ${{ steps.ccache-prepare.outputs.key }} - - - name: build example using CMake - run: | - cd ${GITHUB_WORKSPACE}/Example/build - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ - .. - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - cmake --build . - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - printf "\033[1;35m C binary with shared libraries\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ - ./my_demo - printf "\033[1;35m C++ binary with shared libraries\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ - ./my_cxx_demo - # We don't build a static version of GraphBLAS in CI. - # So we need to prepare the environment also for the following tests. - printf "\033[1;35m C binary with statically linked libraries\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ - ./my_demo_static - printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ - ./my_cxx_demo_static - echo "::endgroup::" - - - name: test Config - run: | - IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Building with Config.cmake with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - cd build - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ - .. - cmake --build . --config Release - echo "::endgroup::" - done - - - name: build example using autotools - run: | - cd ${GITHUB_WORKSPACE}/Example - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - autoreconf -fi - mkdir build-autotools - cd build-autotools - PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ - ../configure --enable-shared --disable-static - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - make all - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - printf "\033[1;35m C binary\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ - ./my_demo - printf "\033[1;35m C++ binary\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin:${PATH}" \ - ./my_cxx_demo - echo "::endgroup::" - IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Building test with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - autoreconf -fi - mkdir build-autotools && cd build-autotools - PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ - ../configure --enable-shared --disable-static - make all - echo "::endgroup::" - done diff --git a/.github/workflows/codeql-analysis.yaml b/.github/workflows/codeql-analysis.yaml deleted file mode 100644 index b098e21e..00000000 --- a/.github/workflows/codeql-analysis.yaml +++ /dev/null @@ -1,204 +0,0 @@ -name: "CodeQL" - -on: - workflow_dispatch: - schedule: - # Run job every Saturday at 10:20 UTC - - cron: '20 10 * * 6' - -concurrency: codeql-${{ github.ref }} - -# # See: https://github.com/github/codeql-action/issues/1082 -# env: -# CODEQL_ACTION_EXTRA_OPTIONS: '{"database": {"run-queries": ["--off-heap-ram=0"]}}' - - -jobs: - - ubuntu: - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - # Override automatic language detection by changing the below list - # Supported options are ['c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'] - language: ['c-cpp'] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection - group: [other] -# GraphBLAS and LAGraph disabled (the runners run out of memory or -# disk space) -# group: [other, graph] - include: - - group: other - build-libs: SuiteSparse_config:AMD:COLAMD:SPEX -# - group: graph -# build-libs: GraphBLAS:LAGraph - - name: CodeQL (Ubuntu, ${{ matrix.group }}) - - steps: - - name: checkout repository - uses: actions/checkout@v4 - - - name: install dependencies - run: | - sudo apt -qq update - sudo apt install -y g++ gcc autoconf automake cmake \ - dvipng gfortran libgmp-dev liblapack-dev libmpfr-dev \ - libopenblas-dev nvidia-cuda-dev nvidia-cuda-toolkit - - - name: create empty libraries - # This is to work around a bug in nvlink. - # See: https://forums.developer.nvidia.com/t/nvlink-fatal-could-not-open-input-file-when-linking-with-empty-static-library/208517 - run: | - touch empty.c - gcc -fPIC -c empty.c -oempty.o - ar rcsv libdl.a empty.o - ar rcsv librt.a empty.o - ar rcsv libpthread.a empty.o - # overwrite system libraries with "valid" empty libraries - sudo mv ./libdl.a /usr/lib/x86_64-linux-gnu/libdl.a - sudo mv ./librt.a /usr/lib/x86_64-linux-gnu/librt.a - sudo mv ./libpthread.a /usr/lib/x86_64-linux-gnu/libpthread.a - - - name: initialize CodeQL - # Initialize the CodeQL tools for scanning. - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - - name: build - # The analysis with factory kernels of the GraphBLAS library is too - # extensive for the free GitHub-hosted runners. Disable them to work - # around that. That means they aren't scanned. - run: | - IFS=':' - BUILD_LIBS="${{ matrix.build-libs }}" - for lib in ${BUILD_LIBS}; do - printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" - echo "::group::Configure $lib" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ - -DBLA_VENDOR="OpenBLAS" \ - -DNSTATIC=ON \ - -DCOMPACT=ON \ - -DSUITESPARSE_USE_CUDA=ON \ - -DCUDAToolkit_INCLUDE_DIRS="/usr/include" \ - .. - echo "::endgroup::" - echo "::group::Build $lib" - cmake --build . --config Release - echo "::endgroup::" - done - - - name: perform CodeQL analysis - uses: github/codeql-action/analyze@v3 - with: - category: ${{ matrix.group }}-64 - - - mingw32: - runs-on: windows-latest - - defaults: - run: - # Use MSYS2 as default shell - shell: msys2 {0} - - strategy: - # Allow other runners in the matrix to continue if some fail - fail-fast: false - - matrix: - # Override automatic language detection by changing the below list - # Supported options are ['c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'] - language: ['c-cpp'] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection - group: [other] -# group: [other, graph] - include: - - group: other - build-libs: SuiteSparse_config:AMD:COLAMD:SPEX -# - group: graph -# build-libs: GraphBLAS:LAGraph - - env: - CHERE_INVOKING: 1 - - name: CodeQL (mingw32, ${{ matrix.group }}) - - steps: - - name: get CPU name - shell: pwsh - run : | - Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - - - name: install MSYS2 build environment - uses: msys2/setup-msys2@v2 - with: - update: true - - # Use pre-installed version to save disc space on partition with source. - release: false - - install: >- - base-devel - mingw-w64-i686-autotools - mingw-w64-i686-cmake - mingw-w64-i686-cc - mingw-w64-i686-fc - mingw-w64-i686-openblas - mingw-w64-i686-omp - mingw-w64-i686-gmp - mingw-w64-i686-mpfr - - msystem: MINGW32 - - - name: checkout repository - uses: actions/checkout@v4 - - - name: initialize CodeQL - # Initialize the CodeQL tools for scanning. - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - - name: build - # The analysis with factory kernels of the GraphBLAS library is too - # extensive for the free GitHub-hosted runners. Disable them to work - # around that. That means they aren't scanned. - run: | - BUILD_LIBS="${{ matrix.build-libs }}" - IFS=':' read -r -a libs <<< "${BUILD_LIBS}" - for lib in "${libs[@]}"; do - printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" - echo "::group::Configure $lib" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ - -DBLA_VENDOR="OpenBLAS" \ - -DNSTATIC=ON \ - -DCOMPACT=ON \ - .. - echo "::endgroup::" - echo "::group::Build $lib" - cmake --build . --config Release - echo "::endgroup::" - done - - - name: perform CodeQL analysis - uses: github/codeql-action/analyze@v3 - with: - category: ${{ matrix.group }}-32 diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml deleted file mode 100644 index 31ff9cff..00000000 --- a/.github/workflows/macos.yaml +++ /dev/null @@ -1,159 +0,0 @@ -name: macos -on: - workflow_dispatch: -# push: -# branches-ignore: -# - '**/dev2' -# - '**/*dev2' -# pull_request: - -# This workflow hangs intermittently at random places, after building a demo -# program and just before running it. Something is broken but it's not -# SuiteSparse; it's github. Tests on an M1 Mac and Intel Mac have never shown -# this behavior outside of github. As a result, this workflow has been -# relegated to a "workflow_dispatch" only. It is not run on push or pull -# requests. The hang has nothing to do with parallelism; it can hang in -# check_AMD, which does not use OpenMP. - -concurrency: ci-macos-${{ github.ref }} - -env: - # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" - -jobs: - - macos: - # For available GitHub-hosted runners, see: - # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners - runs-on: macos-latest - - steps: - - name: get runner hardware information - run: | - sysctl hw - sysctl machdep - - - name: checkout repository - uses: actions/checkout@v4 - - - name: install dependencies - # Homebrew's Python conflicts with the Python that comes pre-installed - # on the GitHub runners. Some of SuiteSparse's dependencies depend on - # different versions of Homebrew's Python. Enforce using the ones from - # Homebrew to avoid errors on updates. - # See: https://github.com/orgs/Homebrew/discussions/3928 - - # It looks like "gfortran" isn't working correctly unless "gcc" is - # re-installed. - run: | - brew update - brew install --overwrite python@3.10 python@3.11 python@3.12 - brew reinstall gcc - brew install autoconf automake ccache cmake gmp lapack libomp mpfr openblas - - - name: prepare ccache - # create key with human readable timestamp - # used in action/cache/restore and action/cache/save steps - id: ccache-prepare - run: | - echo "key=ccache:macos-latest:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - - - name: restore ccache - # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 - with: - path: /Users/runner/Library/Caches/ccache - key: ${{ steps.ccache-prepare.outputs.key }} - # Prefer caches from the same branch. Fall back to caches from the dev branch. - restore-keys: | - ccache:macos-latest:${{ github.ref }} - ccache:macos-latest - - - name: configure ccache - # Limit the maximum size to avoid exceeding the total cache limits. - run: | - test -d /Users/runner/Library/Preferences/ccache || mkdir /Users/runner/Library/Preferences/ccache - echo "max_size = 300M" >> /Users/runner/Library/Preferences/ccache/ccache.conf - ccache -s - - - name: build - run: | - IFS=':' read -r -a libs <<< "${BUILD_LIBS}" - for lib in "${libs[@]}"; do - printf " \033[0;32m==>\033[0m Building library \033[0;32m${lib}\033[0m\n" - echo "::group::Configure $lib" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_INSTALL_PREFIX="${GITHUB_WORKSPACE}" \ - -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ - -DBLA_VENDOR="OpenBLAS" \ - -DCMAKE_PREFIX_PATH="/usr/local/opt/lapack;/usr/local/opt/openblas;/usr/local/opt/libomp" \ - .. - echo "::endgroup::" - echo "::group::Build $lib" - cmake --build . --config Release - echo "::endgroup::" - done - - - name: check_AMD - run: | - cd ${GITHUB_WORKSPACE}/AMD - make demos - - - name: check_COLAMD - run: | - cd ${GITHUB_WORKSPACE}/COLAMD - make demos - - - name: check_SPEX - run: | - cd ${GITHUB_WORKSPACE}/SPEX - make demos - - - name: ccache status - continue-on-error: true - run: ccache -s - - - name: save ccache - # Save the cache after we are done (successfully) building - # This helps to retain the ccache even if the subsequent steps are failing. - uses: actions/cache/save@v4 - with: - path: /Users/runner/Library/Caches/ccache - key: ${{ steps.ccache-prepare.outputs.key }} - - - name: install - run: | - IFS=':' read -r -a libs <<< "${BUILD_LIBS}" - for lib in "${libs[@]}"; do - printf "::group::\033[0;32m==>\033[0m Installing library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/${lib}/build - cmake --install . - echo "::endgroup::" - done - - - name: build example - run: | - cd ${GITHUB_WORKSPACE}/Example/build - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;/usr/local/opt/lapack;/usr/local/opt/openblas;/usr/local/opt/libomp" \ - .. - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - cmake --build . - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - printf "\033[1;35m C binary with shared libraries\033[0m\n" - ./my_demo - printf "\033[1;35m C++ binary with shared libraries\033[0m\n" - ./my_cxx_demo - printf "\033[1;35m C binary with statically linked libraries\033[0m\n" - ./my_demo_static - printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" - ./my_cxx_demo_static - echo "::endgroup::" - diff --git a/.github/workflows/root-cmakelists.yaml b/.github/workflows/root-cmakelists.yaml deleted file mode 100644 index c9658ae1..00000000 --- a/.github/workflows/root-cmakelists.yaml +++ /dev/null @@ -1,570 +0,0 @@ -# Build SuiteSparse using the root CMakeLists.txt - -name: root-cmakelists - -on: - workflow_dispatch: - push: - branches-ignore: - - '**/dev2' - - '**/*dev2' - pull_request: - -concurrency: ci-root-cmakelists-${{ github.ref }} - -env: - # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" - -jobs: - - ubuntu: - # For available GitHub-hosted runners, see: - # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners - runs-on: ubuntu-latest - - name: ubuntu (${{ matrix.compiler }} ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) - - strategy: - # Allow other runners in the matrix to continue if some fail - fail-fast: false - - matrix: - compiler: [gcc, clang] - cuda: [with, without] - link: [both] - include: - - compiler: gcc - compiler-pkgs: "g++ gcc" - cc: "gcc" - cxx: "g++" - - compiler: clang - compiler-pkgs: "clang libomp-dev" - cc: "clang" - cxx: "clang++" - # Clang seems to generally require less cache size (smaller object files?). - - compiler: gcc - ccache-max: 600M - - compiler: clang - ccache-max: 500M - - cuda: with - cuda-pkgs: "nvidia-cuda-dev nvidia-cuda-toolkit" - cuda-cmake-flags: - -DSUITESPARSE_USE_CUDA=ON - -DSUITESPARSE_USE_STRICT=ON - -DCUDAToolkit_INCLUDE_DIRS="/usr/include" - -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" - - compiler: gcc - compiler-pkgs: "g++ gcc" - cc: "gcc" - cxx: "g++" - ccache-max: 600M - cuda: with - cuda-pkgs: "nvidia-cuda-dev nvidia-cuda-toolkit" - cuda-cmake-flags: - -DSUITESPARSE_USE_CUDA=ON - -DSUITESPARSE_USE_STRICT=ON - -DCUDAToolkit_INCLUDE_DIRS="/usr/include" - -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" - link: static - link-cmake-flags: - -DBUILD_SHARED_LIBS=OFF - -DBUILD_STATIC_LIBS=ON - - env: - CC: ${{ matrix.cc }} - CXX: ${{ matrix.cxx }} - - steps: - - name: get CPU information - run: lscpu - - - name: checkout repository - uses: actions/checkout@v4 - - - name: install dependencies - env: - COMPILER_PKGS: ${{ matrix.compiler-pkgs }} - CUDA_PKGS: ${{ matrix.cuda-pkgs }} - run: | - sudo apt -qq update - sudo apt install -y ${COMPILER_PKGS} autoconf automake ccache cmake \ - dvipng gfortran libgmp-dev liblapack-dev libmpfr-dev \ - libopenblas-dev ${CUDA_PKGS} - - - name: prepare ccache - # create key with human readable timestamp - # used in action/cache/restore and action/cache/save steps - id: ccache-prepare - run: | - echo "key=ccache:ubuntu:root:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - - - name: restore ccache - # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 - with: - path: ~/.ccache - key: ${{ steps.ccache-prepare.outputs.key }} - # Prefer caches from the same branch. Fall back to caches from the dev branch. - restore-keys: | - ccache:ubuntu:root:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} - ccache:ubuntu:root:${{ matrix.compiler }}:${{ matrix.cuda }}:${{ matrix.link }} - - - name: create empty libraries - # This is to work around a bug in nvlink. - # See: https://forums.developer.nvidia.com/t/nvlink-fatal-could-not-open-input-file-when-linking-with-empty-static-library/208517 - if: matrix.cuda == 'with' - run: | - touch empty.c - gcc -fPIC -c empty.c -oempty.o - ar rcsv libdl.a empty.o - ar rcsv librt.a empty.o - ar rcsv libpthread.a empty.o - # overwrite system libraries with "valid" empty libraries - sudo mv ./libdl.a /usr/lib/x86_64-linux-gnu/libdl.a - sudo mv ./librt.a /usr/lib/x86_64-linux-gnu/librt.a - sudo mv ./libpthread.a /usr/lib/x86_64-linux-gnu/libpthread.a - - - name: configure ccache - env: - CCACHE_MAX: ${{ matrix.ccache-max }} - run: | - test -d ~/.ccache || mkdir ~/.ccache - echo "max_size = $CCACHE_MAX" >> ~/.ccache/ccache.conf - echo "compression = true" >> ~/.ccache/ccache.conf - ccache -s - echo "/usr/lib/ccache" >> $GITHUB_PATH - - - name: check auto-dependency resolution - # no need to check this with all runners. One is enough. - if: ${{ matrix.cc == 'gcc' && matrix.cuda == 'without' }} - run: | - mkdir -p ${GITHUB_WORKSPACE}/build-dep && cd ${GITHUB_WORKSPACE}/build-dep - IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Configuring to build only \033[0;32m${lib}\033[0m\n" - cmake --fresh \ - -DCMAKE_BUILD_TYPE="Release" \ - -DBLA_VENDOR="OpenBLAS" \ - -DSUITESPARSE_ENABLE_PROJECTS="${lib,,}" \ - .. - echo "::endgroup::" - done - - - name: configure - run: | - mkdir -p ${GITHUB_WORKSPACE}/build && cd ${GITHUB_WORKSPACE}/build - cmake -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_INSTALL_PREFIX=".." \ - -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ - -DBLA_VENDOR="OpenBLAS" \ - -DSUITESPARSE_DEMOS=OFF \ - -DBUILD_TESTING=OFF \ - ${{ matrix.cuda-cmake-flags }} \ - ${{ matrix.link-cmake-flags }} \ - .. - - - name: build libraries - run: | - cd ${GITHUB_WORKSPACE}/build - cmake --build . - - - name: build demos - run: | - printf "::group:: \033[0;32m==>\033[0m Configuring for demos\n" - cd ${GITHUB_WORKSPACE}/build - cmake -DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON .. - echo "::endgroup::" - printf "::group:: \033[0;32m==>\033[0m Building demos\n" - cd ${GITHUB_WORKSPACE}/build - cmake --build . - echo "::endgroup::" - # FIXME: How to run the demos without Makefile? - - - name: ccache status - continue-on-error: true - run: ccache -s - - - name: save ccache - # Save the cache after we are done (successfully) building. - # This helps to retain the ccache even if the subsequent steps are failing. - uses: actions/cache/save@v4 - with: - path: ~/.ccache - key: ${{ steps.ccache-prepare.outputs.key }} - - - name: check - run: | - cd ${GITHUB_WORKSPACE}/build - ctest . || ctest . --rerun-failed --output-on-failure - - - name: install - run: | - printf "\033[0;32m==>\033[0m Installing libraries\n" - cd ${GITHUB_WORKSPACE}/build - cmake --install . - - - name: build example using CMake - run: | - cd ${GITHUB_WORKSPACE}/Example/build - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ - -DBLA_VENDOR="OpenBLAS" \ - ${{ matrix.cuda-cmake-flags }} \ - ${{ matrix.link-cmake-flags }} \ - .. - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - cmake --build . - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - if [ -f ./my_demo -a -f ./my_cxx_demo ]; then - printf "\033[1;35m C binary with shared libraries\033[0m\n" - LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_demo - printf "\033[1;35m C++ binary with shared libraries\033[0m\n" - LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_cxx_demo - fi - printf "\033[1;35m C binary with statically linked libraries\033[0m\n" - ./my_demo_static - printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" - ./my_cxx_demo_static - echo "::endgroup::" - - - name: test Config - run: | - IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Building Config.cmake with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - cd build - cmake \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake" \ - .. - cmake --build . --config Release - echo "::endgroup::" - done - - - name: build example using autotools - run: | - cd ${GITHUB_WORKSPACE}/Example - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - autoreconf -fi - mkdir build-autotools - cd build-autotools - if [ "${{ matrix.link }}" = static ]; then - _extra_config_flags="--enable-static --disable-shared" - else - _extra_config_flags="--enable-shared --disable-static" - fi - PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ - ../configure ${_extra_config_flags} - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - make all - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - printf "\033[1;35m C binary\033[0m\n" - LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_demo - printf "\033[1;35m C++ binary\033[0m\n" - LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/lib ./my_cxx_demo - echo "::endgroup::" - IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Building test with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - autoreconf -fi - mkdir build-autotools && cd build-autotools - PKG_CONFIG_PATH=${GITHUB_WORKSPACE}/lib/pkgconfig/ \ - ../configure ${_extra_config_flags} - make all - echo "::endgroup::" - done - - - msvc: - # For available GitHub-hosted runners, see: - # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners - runs-on: windows-latest - - name: msvc (${{ matrix.cc }} ${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) - - defaults: - run: - # Use bash as default shell - shell: bash -el {0} - - strategy: - # Allow other runners in the matrix to continue if some fail - fail-fast: false - - matrix: - openmp: [with, without] - cuda: [without] - link: [both] - cc: [cl] - include: - - openmp: without - openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" - - openmp: with - cuda: with - cuda-cmake-flags: - -DSUITESPARSE_USE_CUDA=ON - -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" - link: both - cc: cl - - openmp: with - cuda: with - cuda-cmake-flags: - -DSUITESPARSE_USE_CUDA=ON - -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" - link: static - link-cmake-flags: - -DBUILD_SHARED_LIBS=OFF - -DBUILD_STATIC_LIBS=ON - cc: cl - - openmp: with - cuda: without - link: both - cc: clang-cl - - env: - CHERE_INVOKING: 1 - - steps: - - name: get CPU name - shell: pwsh - run : | - Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - - - name: checkout repository - uses: actions/checkout@v4 - - - uses: conda-incubator/setup-miniconda@v3 - with: - auto-update-conda: true - - - name: cache conda packages - id: conda-cache - uses: actions/cache/restore@v4 - with: - path: C:/Miniconda/envs/test - key: conda:msvc - - - name: install packages with conda - if: ${{ steps.conda-cache.outputs.cache-hit != 'true' }} - run: | - echo ${{ steps.conda-cache.outputs.cache-hit }} - conda info - conda list - conda install -y -c intel mkl-devel - conda install -y -c conda-forge --override-channels ccache - - - name: save conda cache - if: ${{ steps.conda-cache.outputs.cache-hit != 'true' }} - uses: actions/cache/save@v4 - with: - path: C:/Miniconda/envs/test - key: ${{ steps.conda-cache.outputs.cache-primary-key }} - - - name: install libraries from MSYS2 - uses: msys2/setup-msys2@v2 - with: - update: true - - # Use pre-installed version to save disc space on partition with source. - release: false - - install: >- - mingw-w64-ucrt-x86_64-gmp - mingw-w64-ucrt-x86_64-mpfr - mingw-w64-ucrt-x86_64-python - - msystem: UCRT64 - - - uses: Jimver/cuda-toolkit@v0.2.14 - name: install CUDA toolkit - if: matrix.cuda == 'with' - id: cuda-toolkit - with: - cuda: '12.2.0' - #See https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#install-the-cuda-software - method: 'local' - # Do not cache the installer (~3 GiB). It doesn't speed up the - # installation significantly. And we need the space for ccache. - use-github-cache: 'false' - - - name: setup build environment - # get packages from MSYS2 - # Copy only relevant parts to avoid picking up headers and libraries - # that are thought for MinGW only. - run: | - mkdir -p ./dependencies/{bin,lib,include} - # GMP - cp C:/msys64/ucrt64/bin/libgmp*.dll ./dependencies/bin/ - cp C:/msys64/ucrt64/include/gmp.h ./dependencies/include/ - cp C:/msys64/ucrt64/lib/libgmp.dll.a ./dependencies/lib/gmp.lib - # MPFR - cp C:/msys64/ucrt64/bin/libmpfr*.dll ./dependencies/bin/ - cp C:/msys64/ucrt64/include/mpf2mpfr.h ./dependencies/include/ - cp C:/msys64/ucrt64/include/mpfr.h ./dependencies/include/ - cp C:/msys64/ucrt64/lib/libmpfr.dll.a ./dependencies/lib/mpfr.lib - # run-time dependencies - cp C:/msys64/ucrt64/bin/libgcc_s_seh*.dll ./dependencies/bin/ - cp C:/msys64/ucrt64/bin/libwinpthread*.dll ./dependencies/bin/ - # create environment variable for easier access - echo "CCACHE=C:/Miniconda/envs/test/Library/bin/ccache.exe" >> ${GITHUB_ENV} - - - name: prepare ccache - # create key with human readable timestamp - # used in action/cache/restore and action/cache/save steps - id: ccache-prepare - shell: msys2 {0} - run: | - echo "ccachedir=$(cygpath -m $(${CCACHE} -k cache_dir))" >> $GITHUB_OUTPUT - echo "key=ccache:msvc:root:${{ matrix.cc }}:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $GITHUB_OUTPUT - - - name: restore ccache - # Setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 - with: - path: ${{ steps.ccache-prepare.outputs.ccachedir }} - key: ${{ steps.ccache-prepare.outputs.key }} - # Prefer caches from the same branch. Fall back to caches from the dev branch. - restore-keys: | - ccache:msvc:root:${{ matrix.cc }}:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} - ccache:msvc:root:${{ matrix.cc }}:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}: - - - name: configure ccache - # Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota. - run: | - test -d ${{ steps.ccache-prepare.outputs.ccachedir }} || mkdir -p ${{ steps.ccache-prepare.outputs.ccachedir }} - echo "max_size = 250M" > ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf - echo "compression = true" >> ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf - ${CCACHE} -p - ${CCACHE} -s - - - name: setup MSVC toolchain - uses: ilammy/msvc-dev-cmd@v1 - - - name: configure - run: | - declare -a _extra_config - if [ ${{ matrix.cuda }} = 'with' ]; then - _extra_config+=(-DCUDAToolkit_ROOT="$(cygpath -m "${{ steps.cuda-toolkit.outputs.CUDA_PATH }}")") - _extra_config+=(-DCMAKE_CUDA_COMPILER="$(cygpath -m "${{ steps.cuda-toolkit.outputs.CUDA_PATH }}")/bin/nvcc.exe") - fi - mkdir -p ${GITHUB_WORKSPACE}/build && cd ${GITHUB_WORKSPACE}/build - cmake -G"Ninja Multi-Config" \ - -DCMAKE_C_COMPILER=${{ matrix.cc }} \ - -DCMAKE_CXX_COMPILER=${{ matrix.cc }} \ - -DCMAKE_BUILD_TYPE="Release" \ - -DCMAKE_INSTALL_PREFIX=".." \ - -DCMAKE_PREFIX_PATH="C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ - -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ - -DCMAKE_Fortran_COMPILER_LAUNCHER="ccache" \ - -DSUITESPARSE_USE_FORTRAN=OFF \ - -DBLA_VENDOR="All" \ - -DPython_EXECUTABLE="C:/msys64/ucrt64/bin/python.exe" \ - -DSUITESPARSE_DEMOS=OFF \ - -DBUILD_TESTING=OFF \ - ${{ matrix.openmp-cmake-flags }} \ - ${{ matrix.cuda-cmake-flags }} \ - ${{ matrix.link-cmake-flags }} \ - "${_extra_config[@]}" \ - .. - - - name: build libraries - run: | - cd ${GITHUB_WORKSPACE}/build - cmake --build . --config Release - - - name: build demos - run: | - printf "::group:: \033[0;32m==>\033[0m Configuring for demos\n" - cd ${GITHUB_WORKSPACE}/build - cmake -DSUITESPARSE_DEMOS=ON -DBUILD_TESTING=ON .. - echo "::endgroup::" - printf "::group:: \033[0;32m==>\033[0m Building demos\n" - cd ${GITHUB_WORKSPACE}/build - cmake --build . --config Release - echo "::endgroup::" - # FIXME: How to run the demos without Makefile? - - - name: ccache status - continue-on-error: true - run: ${CCACHE} -s - - - name: save ccache - # Save the cache after we are done (successfully) building - # This helps to retain the ccache even if the subsequent steps are failing. - uses: actions/cache/save@v4 - with: - path: ${{ steps.ccache-prepare.outputs.ccachedir }} - key: ${{ steps.ccache-prepare.outputs.key }} - - - name: check - run: | - cd ${GITHUB_WORKSPACE}/build - PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;C:/msys64/ucrt64/bin;${PATH}" \ - ctest -C Release . || ctest -C Release . --rerun-failed --output-on-failure - - - name: install - run: | - printf "\033[0;32m==>\033[0m Installing libraries\n" - cd ${GITHUB_WORKSPACE}/build - cmake --install . - - - name: build example - run: | - cd ${GITHUB_WORKSPACE}/Example/build - printf "::group::\033[0;32m==>\033[0m Configuring example\n" - cmake -G"Ninja Multi-Config" \ - -DCMAKE_C_COMPILER=${{ matrix.cc }} \ - -DCMAKE_CXX_COMPILER=${{ matrix.cc }} \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ - -DBLA_VENDOR="All" \ - ${{ matrix.openmp-cmake-flags }} \ - .. - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Building example\n" - cmake --build . --config Release - echo "::endgroup::" - printf "::group::\033[0;32m==>\033[0m Executing example\n" - if [ -f ./my_demo -a -f ./my_cxx_demo ]; then - printf "\033[1;35m C binary with shared libraries\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;${PATH}" \ - ./Release/my_demo - printf "\033[1;35m C++ binary with shared libraries\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;${PATH}" \ - ./Release/my_cxx_demo - fi - # We don't build a static version of GraphBLAS in CI. - # So we need to prepare the environment also for the following tests. - # Additionally, gmp, mpfr and BLAS are always shared libraries. - printf "\033[1;35m C binary with statically linked libraries\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;${PATH}" \ - ./Release/my_demo_static - printf "\033[1;35m C++ binary with statically linked libraries\033[0m\n" - PATH="${GITHUB_WORKSPACE}/bin;${GITHUB_WORKSPACE}/dependencies/bin;${PATH}" \ - ./Release/my_cxx_demo_static - echo "::endgroup::" - - - name: test Config - run: | - IFS=':' read -r -a libs <<< "${INSTALLED_LIBS}" - for lib in "${libs[@]}"; do - printf "::group:: \033[0;32m==>\033[0m Building with Config.cmake with library \033[0;32m${lib}\033[0m\n" - cd ${GITHUB_WORKSPACE}/TestConfig/${lib} - cd build - cmake -G"Ninja Multi-Config" \ - -DCMAKE_C_COMPILER=${{ matrix.cc }} \ - -DCMAKE_CXX_COMPILER=${{ matrix.cc }} \ - -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ - .. - cmake --build . --config Release - echo "::endgroup::" - done diff --git a/.gitignore b/.gitignore index 82b356ef..d0d4223f 100644 --- a/.gitignore +++ b/.gitignore @@ -127,7 +127,6 @@ CSparse/Tcov/cov.sort CSparse/Tcov/cover.out CSparse/Tcov/covs.out CSparse/Tcov/cs_*.c -CSparse/Tcov/csparse_version.c CSparse/Tcov/cstcov_test CSparse/Tcov/*.out CSparse/Tcov/cs_demo1 @@ -139,7 +138,6 @@ CXSparse/Tcov/cov.sort CXSparse/Tcov/cover.out CXSparse/Tcov/covs.out CXSparse/Tcov/cs_*.c -CXSparse/Tcov/cxsparse_version.c CXSparse/Tcov/*.out CXSparse/Tcov/cs_demo1_ci CXSparse/Tcov/cs_demo1_cl @@ -170,9 +168,7 @@ SPQR/Tcov/gpu_results.txt SPQR/Tcov/gpuqrengine_demo SPQR/Tcov/qrdemo_gpu SPQR/Tcov/qrtest -SPQR/Tcov/qrtest32 SPQR/Tcov/qrtest_out.txt -SPQR/Tcov/qrtest_out32.txt SPQR/Tcov/troll.m SPQR/Tcov/cov.out diff --git a/AMD/CMakeLists.txt b/AMD/CMakeLists.txt index 372e60e6..4fdf6149 100644 --- a/AMD/CMakeLists.txt +++ b/AMD/CMakeLists.txt @@ -2,7 +2,7 @@ # SuiteSparse/AMD/CMakeLists.txt: cmake for AMD #------------------------------------------------------------------------------- -# Copyright (c) 1996-2023, Timothy A. Davis, Patrick Amestoy, Iain Duff. +# Copyright (c) 1996-2022, Timothy A. Davis, Patrick Amestoy, Iain Duff. # All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause @@ -10,51 +10,54 @@ # get the version #------------------------------------------------------------------------------- -cmake_minimum_required ( VERSION 3.22 ) +cmake_minimum_required ( VERSION 3.19 ) -set ( AMD_DATE "Mar 22, 2024" ) -set ( AMD_VERSION_MAJOR 3 CACHE STRING "" FORCE ) -set ( AMD_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( AMD_VERSION_SUB 2 CACHE STRING "" FORCE ) +set ( AMD_DATE "Jan 17, 2023" ) +set ( AMD_VERSION_MAJOR 3 ) +set ( AMD_VERSION_MINOR 0 ) +set ( AMD_VERSION_SUB 3 ) message ( STATUS "Building AMD version: v" ${AMD_VERSION_MAJOR}. ${AMD_VERSION_MINOR}. ${AMD_VERSION_SUB} " (" ${AMD_DATE} ")" ) -#------------------------------------------------------------------------------- -# define the project -#------------------------------------------------------------------------------- - -project ( AMD - VERSION "${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB}" - LANGUAGES C ) - #------------------------------------------------------------------------------- # SuiteSparse policies #------------------------------------------------------------------------------- set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${PROJECT_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) + ${CMAKE_SOURCE_DIR}/cmake_modules + ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) include ( SuiteSparsePolicy ) -if ( SUITESPARSE_HAS_FORTRAN ) +#------------------------------------------------------------------------------- +# define the project +#------------------------------------------------------------------------------- + +if ( WIN32 ) + # disable Fortran in AMD when compiling on Windows + set ( NFORTRAN true ) +endif ( ) + +if ( NOT NFORTRAN ) # Fortan is available and enabled - enable_language ( Fortran ) + project ( amd + VERSION "${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB}" + LANGUAGES C Fortran ) +else ( ) + # no Fortran compiler available; do not compile Source/*.f or Demo/*.f + project ( amd + VERSION "${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB}" + LANGUAGES C ) endif ( ) #------------------------------------------------------------------------------- # find library dependencies #------------------------------------------------------------------------------- -if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.7.0 - PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - find_package ( SuiteSparse_config 7.7.0 REQUIRED ) - endif ( ) -endif ( ) +find_package ( SuiteSparse_config 7.0.0 REQUIRED ) #------------------------------------------------------------------------------- # configure files @@ -69,91 +72,59 @@ configure_file ( "Config/amd_version.tex.in" "${PROJECT_SOURCE_DIR}/Doc/amd_vers # include directories #------------------------------------------------------------------------------- -include_directories ( Source Include ) +include_directories ( Source Include ${SUITESPARSE_CONFIG_INCLUDE_DIR} ) #------------------------------------------------------------------------------- # dynamic amd library properties #------------------------------------------------------------------------------- -if ( SUITESPARSE_HAS_FORTRAN ) +if ( NOT NFORTRAN ) file ( GLOB AMD_SOURCES "Source/*.c" "Source/*.f" ) else ( ) file ( GLOB AMD_SOURCES "Source/*.c" ) endif ( ) -if ( BUILD_SHARED_LIBS ) - add_library ( AMD SHARED ${AMD_SOURCES} ) - set_target_properties ( AMD PROPERTIES - VERSION ${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB} - C_STANDARD 11 - C_STANDARD_REQUIRED ON - OUTPUT_NAME amd - SOVERSION ${AMD_VERSION_MAJOR} - PUBLIC_HEADER "Include/amd.h" - WINDOWS_EXPORT_ALL_SYMBOLS ON ) - - if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) - set_target_properties ( AMD PROPERTIES EXPORT_NO_SYSTEM ON ) - endif ( ) - - target_include_directories ( AMD - INTERFACE $ - $ ) -endif ( ) +add_library ( amd SHARED ${AMD_SOURCES} ) +set_target_properties ( amd PROPERTIES + VERSION ${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB} + C_STANDARD_REQUIRED 11 + SOVERSION ${AMD_VERSION_MAJOR} + PUBLIC_HEADER "Include/amd.h" + WINDOWS_EXPORT_ALL_SYMBOLS ON ) #------------------------------------------------------------------------------- # static amd library properties #------------------------------------------------------------------------------- -if ( BUILD_STATIC_LIBS ) - add_library ( AMD_static STATIC ${AMD_SOURCES} ) - set_target_properties ( AMD_static PROPERTIES - C_STANDARD 11 - C_STANDARD_REQUIRED ON +if ( NOT NSTATIC ) + add_library ( amd_static STATIC ${AMD_SOURCES} ) + set_target_properties ( amd_static PROPERTIES + VERSION ${AMD_VERSION_MAJOR}.${AMD_VERSION_MINOR}.${AMD_VERSION_SUB} + C_STANDARD_REQUIRED 11 OUTPUT_NAME amd - PUBLIC_HEADER "Include/amd.h" ) + SOVERSION ${AMD_VERSION_MAJOR} ) - if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) - set_target_properties ( AMD_static PROPERTIES + if ( MSVC ) + set_target_properties ( amd_static PROPERTIES OUTPUT_NAME amd_static ) endif ( ) - - if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) - set_target_properties ( AMD_static PROPERTIES EXPORT_NO_SYSTEM ON ) - endif ( ) - - target_include_directories ( AMD_static - INTERFACE $ - $ ) - endif ( ) #------------------------------------------------------------------------------- # add the library dependencies #------------------------------------------------------------------------------- -# SuiteSparseConfig: -if ( BUILD_SHARED_LIBS ) - target_link_libraries ( AMD PRIVATE SuiteSparse::SuiteSparseConfig ) - target_include_directories ( AMD PUBLIC - "$" ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - if ( TARGET SuiteSparse::SuiteSparseConfig_static ) - target_link_libraries ( AMD_static PUBLIC SuiteSparse::SuiteSparseConfig_static ) - else ( ) - target_link_libraries ( AMD_static PUBLIC SuiteSparse::SuiteSparseConfig ) - endif ( ) +# suitesparseconfig: +target_link_libraries ( amd PUBLIC ${SUITESPARSE_CONFIG_LIBRARIES} ) +if ( NOT NSTATIC ) + target_link_libraries ( amd_static PUBLIC ${SUITESPARSE_CONFIG_STATIC} ) endif ( ) # libm: if ( NOT WIN32 ) - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( AMD PRIVATE m ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - set ( AMD_STATIC_LIBS "${AMD_STATIC_LIBS} -lm" ) - target_link_libraries ( AMD_static PUBLIC m ) + target_link_libraries ( amd PUBLIC m ) + if ( NOT NSTATIC ) + target_link_libraries ( amd_static PUBLIC m ) endif ( ) endif ( ) @@ -161,99 +132,25 @@ endif ( ) # AMD installation location #------------------------------------------------------------------------------- -include ( CMakePackageConfigHelpers ) - -if ( BUILD_SHARED_LIBS ) - install ( TARGETS AMD - EXPORT AMDTargets - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - install ( TARGETS AMD_static - EXPORT AMDTargets - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) - -# create (temporary) export target file during build -export ( EXPORT AMDTargets - NAMESPACE SuiteSparse:: - FILE ${CMAKE_CURRENT_BINARY_DIR}/AMDTargets.cmake ) - -# install export target, config and version files for find_package -install ( EXPORT AMDTargets - NAMESPACE SuiteSparse:: - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/AMD ) - -# generate config file to be used in common build tree -set ( SUITESPARSE_IN_BUILD_TREE ON ) -configure_package_config_file ( - Config/AMDConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/AMDConfig.cmake - INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/AMDConfig.cmake ) - -# generate config file to be installed -set ( SUITESPARSE_IN_BUILD_TREE OFF ) -configure_package_config_file ( - Config/AMDConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/target/AMDConfig.cmake - INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/AMD ) - -write_basic_package_version_file ( - ${CMAKE_CURRENT_BINARY_DIR}/AMDConfigVersion.cmake - COMPATIBILITY SameMajorVersion ) - -install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/target/AMDConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/AMDConfigVersion.cmake - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/AMD ) - -#------------------------------------------------------------------------------- -# create pkg-config file -#------------------------------------------------------------------------------- - -if ( NOT MSVC ) - set ( prefix "${CMAKE_INSTALL_PREFIX}" ) - set ( exec_prefix "\${prefix}" ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) - if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) - set ( libdir "${SUITESPARSE_LIBDIR}") - else ( ) - set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") - endif ( ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) - if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) - set ( includedir "${SUITESPARSE_INCLUDEDIR}") - else ( ) - set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") - endif ( ) - if ( BUILD_SHARED_LIBS ) - set ( SUITESPARSE_LIB_BASE_NAME $ ) - else ( ) - set ( SUITESPARSE_LIB_BASE_NAME $ ) - endif ( ) - configure_file ( - Config/AMD.pc.in - AMD.pc.out - @ONLY - NEWLINE_STYLE LF ) - file ( GENERATE - OUTPUT AMD.pc - INPUT ${CMAKE_CURRENT_BINARY_DIR}/AMD.pc.out - NEWLINE_STYLE LF ) - install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/AMD.pc - DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) +install ( TARGETS amd + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +install ( FILES ${CMAKE_SOURCE_DIR}/cmake_modules/FindAMD.cmake + DESTINATION ${SUITESPARSE_LIBDIR}/cmake/SuiteSparse + COMPONENT Development ) +if ( NOT NSTATIC ) + install ( TARGETS amd_static + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} ) endif ( ) #------------------------------------------------------------------------------- # Demo library and programs #------------------------------------------------------------------------------- -if ( SUITESPARSE_DEMOS ) +option ( DEMO "ON: Build the demo programs. OFF (default): do not build the demo programs." off ) +if ( DEMO ) #--------------------------------------------------------------------------- # demo library @@ -269,30 +166,19 @@ if ( SUITESPARSE_DEMOS ) add_executable ( amd_l_demo "Demo/amd_l_demo.c" ) add_executable ( amd_demo2 "Demo/amd_demo2.c" ) add_executable ( amd_simple "Demo/amd_simple.c" ) - if ( SUITESPARSE_HAS_FORTRAN ) + if ( NOT NFORTRAN ) add_executable ( amd_f77demo "Demo/amd_f77demo.f" ) add_executable ( amd_f77simple "Demo/amd_f77simple.f" ) endif ( ) # Libraries required for Demo programs - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( amd_demo PUBLIC AMD ) - target_link_libraries ( amd_l_demo PUBLIC AMD ) - target_link_libraries ( amd_demo2 PUBLIC AMD ) - target_link_libraries ( amd_simple PUBLIC AMD ) - if ( SUITESPARSE_HAS_FORTRAN ) - target_link_libraries ( amd_f77demo PUBLIC AMD ) - target_link_libraries ( amd_f77simple PUBLIC AMD ) - endif ( ) - else ( ) - target_link_libraries ( amd_demo PUBLIC AMD_static ) - target_link_libraries ( amd_l_demo PUBLIC AMD_static ) - target_link_libraries ( amd_demo2 PUBLIC AMD_static ) - target_link_libraries ( amd_simple PUBLIC AMD_static ) - if ( SUITESPARSE_HAS_FORTRAN ) - target_link_libraries ( amd_f77demo PUBLIC AMD_static ) - target_link_libraries ( amd_f77simple PUBLIC AMD_static ) - endif ( ) + target_link_libraries ( amd_demo PUBLIC amd ) + target_link_libraries ( amd_l_demo PUBLIC amd ) + target_link_libraries ( amd_demo2 PUBLIC amd ) + target_link_libraries ( amd_simple PUBLIC amd ) + if ( NOT NFORTRAN ) + target_link_libraries ( amd_f77demo PUBLIC amd ) + target_link_libraries ( amd_f77simple PUBLIC amd ) endif ( ) else ( ) @@ -306,3 +192,4 @@ endif ( ) #------------------------------------------------------------------------------- include ( SuiteSparseReport ) + diff --git a/AMD/Config/AMD.pc.in b/AMD/Config/AMD.pc.in deleted file mode 100644 index e5b50986..00000000 --- a/AMD/Config/AMD.pc.in +++ /dev/null @@ -1,17 +0,0 @@ -# AMD, Copyright (c) 1996-2023, Timothy A. Davis. -# All Rights Reserved. -# SPDX-License-Identifier: BSD-3-Clause - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: AMD -URL: https://github.com/DrTimothyAldenDavis/SuiteSparse -Description: Routines for permuting sparse matrices prior to factorization in SuiteSparse -Version: @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@.@AMD_VERSION_SUB@ -Requires.private: SuiteSparse_config -Libs: -L${libdir} -l@SUITESPARSE_LIB_BASE_NAME@ -Libs.private: @AMD_STATIC_LIBS@ -Cflags: -I${includedir} diff --git a/AMD/Config/AMDConfig.cmake.in b/AMD/Config/AMDConfig.cmake.in deleted file mode 100644 index d21e0501..00000000 --- a/AMD/Config/AMDConfig.cmake.in +++ /dev/null @@ -1,152 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/AMD/cmake_modules/AMDConfig.cmake -#------------------------------------------------------------------------------- - -# The following copyright and license applies to just this file only, not to -# the library itself: -# AMDConfig.cmake, Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# Finds the AMD include file and compiled library. -# The following targets are defined: -# SuiteSparse::AMD - for the shared library (if available) -# SuiteSparse::AMD_static - for the static library (if available) - -# For backward compatibility the following variables are set: - -# AMD_INCLUDE_DIR - where to find amd.h -# AMD_LIBRARY - dynamic AMD library -# AMD_STATIC - static AMD library -# AMD_LIBRARIES - libraries when using AMD -# AMD_FOUND - true if AMD found - -# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is -# installed. - -#------------------------------------------------------------------------------- - -@PACKAGE_INIT@ - -set ( AMD_DATE "@AMD_DATE@" ) -set ( AMD_VERSION_MAJOR @AMD_VERSION_MAJOR@ ) -set ( AMD_VERSION_MINOR @AMD_VERSION_MINOR@ ) -set ( AMD_VERSION_PATCH @AMD_VERSION_SUB@ ) -set ( AMD_VERSION "@AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@.@AMD_VERSION_SUB@" ) - -# Check for dependent targets -include ( CMakeFindDependencyMacro ) - -# Look for SuiteSparse_config target -if ( @SUITESPARSE_IN_BUILD_TREE@ ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - # First check in a common build tree - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ - PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) - # Then, check in the currently active CMAKE_MODULE_PATH - if ( NOT SuiteSparse_config_FOUND ) - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) - endif ( ) - endif ( ) -else ( ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) - endif ( ) -endif ( ) -if ( NOT SuiteSparse_config_FOUND ) - set ( AMD_FOUND OFF ) - return ( ) -endif ( ) - - -# Import target -include ( ${CMAKE_CURRENT_LIST_DIR}/AMDTargets.cmake ) - -# The following is only for backward compatibility with FindAMD. - -set ( _target_shared SuiteSparse::AMD ) -set ( _target_static SuiteSparse::AMD_static ) -set ( _var_prefix "AMD" ) - -if ( NOT @BUILD_SHARED_LIBS@ AND NOT TARGET ${_target_shared} ) - # make sure there is always an import target without suffix ) - add_library ( ${_target_shared} ALIAS ${_target_static} ) -endif ( ) - -get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) -if ( ${_var_prefix}_INCLUDE_DIR ) - # First item in SuiteSparse targets contains the "main" header directory. - list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) -endif ( ) -get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) -if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) -endif ( ) -if ( TARGET ${_target_static} ) - get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) -endif ( ) - -# Check for most common build types -set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) - -get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) -if ( _isMultiConfig ) - # For multi-configuration generators (e.g., Visual Studio), prefer those - # configurations. - list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) -else ( ) - # For single-configuration generators, prefer the current configuration. - list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) -endif ( ) - -list ( REMOVE_DUPLICATES _config_types ) - -foreach ( _config ${_config_types} ) - string ( TOUPPER ${_config} _uc_config ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_IMPLIB_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) - get_target_property ( _library_chk ${_target_static} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_STATIC ${_library_chk} ) - endif ( ) - endif ( ) -endforeach ( ) - -set ( AMD_LIBRARIES ${AMD_LIBRARY} ) - -macro ( suitesparse_check_exist _var _files ) - # ignore generator expressions - string ( GENEX_STRIP "${_files}" _files2 ) - - foreach ( _file ${_files2} ) - if ( NOT EXISTS "${_file}" ) - message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) - endif ( ) - endforeach () -endmacro ( ) - -suitesparse_check_exist ( AMD_INCLUDE_DIR ${AMD_INCLUDE_DIR} ) -suitesparse_check_exist ( AMD_LIBRARY ${AMD_LIBRARY} ) - -message ( STATUS "AMD version: ${AMD_VERSION}" ) -message ( STATUS "AMD include: ${AMD_INCLUDE_DIR}") -message ( STATUS "AMD library: ${AMD_LIBRARY}") -message ( STATUS "AMD static: ${AMD_STATIC}") diff --git a/AMD/Config/amd.h.in b/AMD/Config/amd.h.in index 956af010..f2a69166 100644 --- a/AMD/Config/amd.h.in +++ b/AMD/Config/amd.h.in @@ -2,7 +2,7 @@ // AMD/Include/amd.h: approximate minimum degree ordering //------------------------------------------------------------------------------ -// AMD, Copyright (c) 1996-2024, Timothy A. Davis, Patrick R. Amestoy, and +// AMD, Copyright (c) 1996-2022, Timothy A. Davis, Patrick R. Amestoy, and // Iain S. Duff. All Rights Reserved. // SPDX-License-Identifier: BSD-3-clause @@ -35,13 +35,13 @@ #ifndef AMD_H #define AMD_H -#include "SuiteSparse_config.h" - /* make it easy for C++ programs to include AMD */ #ifdef __cplusplus extern "C" { #endif +#include "SuiteSparse_config.h" + int amd_order /* returns AMD_OK, AMD_OK_BUT_JUMBLED, * AMD_INVALID, or AMD_OUT_OF_MEMORY */ ( @@ -313,14 +313,6 @@ void amd_l_control (double Control [ ]) ; void amd_info (double Info [ ]) ; void amd_l_info (double Info [ ]) ; -// amd_version: return AMD version. The version array is returned with -// version [0..2] = {AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION} -void amd_version (int version [3]) ; - -#ifdef __cplusplus -} -#endif - #define AMD_CONTROL 5 /* size of Control array */ #define AMD_INFO 20 /* size of Info array */ @@ -387,13 +379,11 @@ void amd_version (int version [3]) ; #define AMD_SUB_VERSION @AMD_VERSION_MINOR@ #define AMD_SUBSUB_VERSION @AMD_VERSION_SUB@ -#define AMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) -#define AMD_VERSION AMD_VERSION_CODE(@AMD_VERSION_MAJOR@,@AMD_VERSION_MINOR@) +#define AMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) +#define AMD_VERSION AMD_VERSION_CODE(AMD_MAIN_VERSION,AMD_SUB_VERSION) -#define AMD__VERSION SUITESPARSE__VERCODE(@AMD_VERSION_MAJOR@,@AMD_VERSION_MINOR@,@AMD_VERSION_SUB@) -#if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) -#error "AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@.@AMD_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" +#ifdef __cplusplus +} #endif #endif diff --git a/AMD/Demo/amd_demo.c b/AMD/Demo/amd_demo.c index b599d06d..507ab7cc 100644 --- a/AMD/Demo/amd_demo.c +++ b/AMD/Demo/amd_demo.c @@ -52,17 +52,14 @@ int main (void) double Control [AMD_CONTROL], Info [AMD_INFO] ; char A [24][24] ; + /* here is an example of how to use AMD_VERSION. This code will work in + * any version of AMD. */ +#if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE(1,2)) printf ("AMD version %d.%d.%d, date: %s\n", AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE) ; - int version [3] ; - amd_version (version) ; - if ((version [0] != AMD_MAIN_VERSION) || - (version [1] != AMD_SUB_VERSION) || - (version [2] != AMD_SUBSUB_VERSION)) - { - fprintf (stderr, "version in header does not match library\n") ; - abort ( ) ; - } +#else + printf ("AMD version: 1.1 or earlier\n") ; +#endif printf ("AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24:\n") ; diff --git a/AMD/Demo/amd_demo.out b/AMD/Demo/amd_demo.out index 0422dc5b..8180f3a8 100644 --- a/AMD/Demo/amd_demo.out +++ b/AMD/Demo/amd_demo.out @@ -1,7 +1,7 @@ -AMD version 3.3.2, date: Mar 22, 2024 +AMD version 3.0.3, date: Jan 17, 2023 AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24: -AMD version 3.3.2, Mar 22, 2024: approximate minimum degree ordering +AMD version 3.0.3, Jan 17, 2023: approximate minimum degree ordering dense row parameter: 10 (rows with more than max (10 * sqrt (n), 16) entries are considered "dense", and placed last in output permutation) @@ -115,7 +115,7 @@ Plot of input matrix pattern: 23: . . . . . . X . . . . X X . . . . . . . . . . X return value from amd_order: 0 (should be 0) -AMD version 3.3.2, Mar 22, 2024, results: +AMD version 3.0.3, Jan 17, 2023, results: status: OK n, dimension of A: 24 nz, number of nonzeros in A: 160 diff --git a/AMD/Demo/amd_demo2.out b/AMD/Demo/amd_demo2.out index f384d828..aebf70ab 100644 --- a/AMD/Demo/amd_demo2.out +++ b/AMD/Demo/amd_demo2.out @@ -1,7 +1,7 @@ AMD demo, with a jumbled version of the 24-by-24 Harwell/Boeing matrix, can_24: -AMD version 3.3.2, Mar 22, 2024: approximate minimum degree ordering +AMD version 3.0.3, Jan 17, 2023: approximate minimum degree ordering dense row parameter: 10 (rows with more than max (10 * sqrt (n), 16) entries are considered "dense", and placed last in output permutation) @@ -144,7 +144,7 @@ Plot of symmetric matrix to be ordered by amd_order: 23: . . . . . . X . . . . X X . . . . . . . . . . X return value from amd_order: 1 (should be 1) -AMD version 3.3.2, Mar 22, 2024, results: +AMD version 3.0.3, Jan 17, 2023, results: status: OK, but jumbled n, dimension of A: 24 nz, number of nonzeros in A: 102 diff --git a/AMD/Demo/amd_l_demo.c b/AMD/Demo/amd_l_demo.c index ff5816ae..7def82c7 100644 --- a/AMD/Demo/amd_l_demo.c +++ b/AMD/Demo/amd_l_demo.c @@ -53,17 +53,14 @@ int main (void) double Control [AMD_CONTROL], Info [AMD_INFO] ; char A [24][24] ; + /* here is an example of how to use AMD_VERSION. This code will work in + * any version of AMD. */ +#if defined(AMD_VERSION) && (AMD_VERSION >= AMD_VERSION_CODE(1,2)) printf ("AMD version %d.%d.%d, date: %s\n", AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE) ; - int version [3] ; - amd_version (version) ; - if ((version [0] != AMD_MAIN_VERSION) || - (version [1] != AMD_SUB_VERSION) || - (version [2] != AMD_SUBSUB_VERSION)) - { - fprintf (stderr, "version in header does not match library\n") ; - abort ( ) ; - } +#else + printf ("AMD version: 1.1 or earlier\n") ; +#endif printf ("AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24:\n") ; diff --git a/AMD/Demo/amd_l_demo.out b/AMD/Demo/amd_l_demo.out index 019ce0ce..5265f5a0 100644 --- a/AMD/Demo/amd_l_demo.out +++ b/AMD/Demo/amd_l_demo.out @@ -1,7 +1,7 @@ -AMD version 3.3.2, date: Mar 22, 2024 +AMD version 3.0.3, date: Jan 17, 2023 AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24: -AMD version 3.3.2, Mar 22, 2024: approximate minimum degree ordering +AMD version 3.0.3, Jan 17, 2023: approximate minimum degree ordering dense row parameter: 10 (rows with more than max (10 * sqrt (n), 16) entries are considered "dense", and placed last in output permutation) @@ -115,7 +115,7 @@ Plot of input matrix pattern: 23: . . . . . . X . . . . X X . . . . . . . . . . X return value from amd_l_order: 0 (should be 0) -AMD version 3.3.2, Mar 22, 2024, results: +AMD version 3.0.3, Jan 17, 2023, results: status: OK n, dimension of A: 24 nz, number of nonzeros in A: 160 diff --git a/AMD/Doc/AMD_UserGuide.pdf b/AMD/Doc/AMD_UserGuide.pdf index 7b3fd6bf6a243c92793e131a0e79a6f749b92942..4cdcddc59eb4fa4bc59d7e5c683c465d11a8bbf9 100644 GIT binary patch delta 58081 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 SU@1_zxdc#XX{A+VQ2qnq(F1(| delta 58612 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

Er!tNJD0> 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 F{{Wa@RqX%( literal 0 HcmV?d00001 diff --git a/SPEX/Doc/SPEX_UserGuide.tex b/SPEX/Doc/SPEX-3.0_UserGuide.tex similarity index 97% rename from SPEX/Doc/SPEX_UserGuide.tex rename to SPEX/Doc/SPEX-3.0_UserGuide.tex index e0d56eee..10a27e8f 100644 --- a/SPEX/Doc/SPEX_UserGuide.tex +++ b/SPEX/Doc/SPEX-3.0_UserGuide.tex @@ -62,7 +62,7 @@ \textbf{User Guide for the SPEX Software Package} \\ \vspace{5mm} - Version 3.1, March, 2024 % VERSION + Version 3.0, July 2023 % VERSION \vspace{20mm} Jinhao Chen, Timothy A. Davis, Christopher Lourenco, Lorena Mejia-Domenzain, Erick Moreno-Centeno \\ @@ -1515,18 +1515,9 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \verb|mpfr_free_str(buff)| & \verb|SPEX_mpfr_free_str(buff)| & Free string allocated by MPFR \\ \hline -\verb|mpfr_init2(x, s)| - & \verb|SPEX_mpfr_init2(x, s)| - & Initialize x with \verb's' bits \\ \hline -\verb|mpfr_set_prec(x, s)| - & \verb|SPEX_mpfr_set_prec(x, s)| - & Set x to contain \verb's' bits \\ \hline -\verb|mpfr_clear(x)| - & \verb|SPEX_mpfr_clear(x)| - & Safely free \verb|mpfr_t| value \\ \hline -\verb|mpfr_set_null(x)| - & \verb|SPEX_mpfr_set_null(x)| - & Initialize the (pointer) contents of a \verb|mpfr_t| value \\ \hline +\verb|mpfr_init2(x, size)| + & \verb|SPEX_mpfr_init2(x, size)| + & Initialize x with size bits \\ \hline \verb|mpfr_set(x, y, rnd)| & \verb|SPEX_mpfr_set(x, y, rnd)| & $x = y$ \\ \hline @@ -1588,15 +1579,9 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \verb|mpz_init2(x, size)| & \verb|SPEX_mpz_init2(x, size)| & Initialize x to size bits \\ \hline -\verb|mpz_clear(x)| - & \verb|SPEX_mpz_clear(x)| - & Safely free \verb|mpz_t| value \\ \hline \verb|mpz_set(x, y)| & \verb|SPEX_mpz_set(x, y)| & $x = y$ (\verb|mpz_t|) \\ \hline -\verb|mpz_set_null(x)| - & \verb|SPEX_mpz_set_null(x)| - & Initialize the (pointer) contents of a \verb|mpz_t| value \\ \hline \verb|mpz_set_ui(x, y)| & \verb|SPEX_mpz_set_ui(x, y)| & $x = y$ (\verb|uint64_t|) \\ \hline @@ -1681,12 +1666,6 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \verb|mpq_init(x)| & \verb|SPEX_mpq_init(x)| & Initialize x \\ \hline -\verb|mpq_set_null(x)| - & \verb|SPEX_mpq_set_null(x)| - & Initialize the (pointer) contents of a \verb|mpq_t| value \\ \hline -\verb|mpq_clear(x)| - & \verb|SPEX_mpq_clear(x)| - & Safely free \verb|mpq_t| value \\ \hline \verb|mpq_set(x, y)| & \verb|SPEX_mpq_set(x, y)| & $x = y$ \\ \hline @@ -1828,67 +1807,6 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \end{verbatim} } \end{mdframed} -\section{SPEX Helper Macros} \label{ss:SPEX_helper_macros} - -In addition to the functionality described in this section; SPEX offers several helper macros to increase ease for the end user application. The first two macros are a simple try/catch mechanism which can be used to wrap functions for error handling. The next two give an easy interface to access entries $(i,j)$ in a matrix. - -\subsection{\texttt{SPEX\_TRY} and -\texttt{SPEX\_CATCH}} - -In a robust application, the return values from SPEX should be checked and properly handled in the case an error occurs. SPEX is written in C and thus it cannot rely on the try/catch mechanism of C++. Thus, \verb|SPEX_TRY| and \verb|SPEX_CHECK| aim to achieve this goal. We provide \verb|SPEX_TRY| and leave \verb|SPEX_CATCH| to the user to define. - -\begin{mdframed}[userdefinedwidth=\textwidth] -{\footnotesize -\begin{verbatim} - #define SPEX_TRY(method) \ - { \ - SPEX_info info = (method) ; \ - if (info != SPEX_OK) \ - { \ - SPEX_CATCH (info) ; \ - } \ - } -\end{verbatim} -} \end{mdframed} - -An example definition of a \verb|SPEX_CATCH| is below. This example assumes that the user needs to free a matrix and return an error code. -\begin{mdframed}[userdefinedwidth=\textwidth] -{\footnotesize -\begin{verbatim} - #define SPEX_CATCH(info) \ - { \ - SPEX_matrix_free (&A, NULL) ; \ - fprintf (stderr, "SPEX failed: info %d, \ - line %d, file %s\n", \ - info, __LINE__, __FILE__) ; \ - return (info) ; \ - } -\end{verbatim} -} \end{mdframed} - -With this mechanism, the user can safely wrap any SPEX function which returns \verb|SPEX_info| with \verb|SPEX_TRY|. For example, one can wrap. - -\subsection{\texttt{SPEX\_1D}: Access matrix entries with 1D linear indexing.} - -\begin{mdframed}[userdefinedwidth=\textwidth] -{\footnotesize -\begin{verbatim} - #define SPEX_1D(A,k,type) ((A)->x.type [k]) -\end{verbatim} -} \end{mdframed} - -This allows the $k$th entry of a matrix stored in any kind (CSC, triplet, dense) of any type (mpq, mpz, int64, double, int) to be returned. For example, to return the $n$th entry of a CSC matrix with \verb|mpz_t| data types, one would use \verb|SPEX_1D(A, n, mpz)|. - -\subsection{\texttt{SPEX\_2D}: Access dense matrix with 2D indexing.} - -\begin{mdframed}[userdefinedwidth=\textwidth] -{\footnotesize -\begin{verbatim} - #define SPEX_2D(A,i,j,type) SPEX_1D (A, (i)+(j)*((A)->m), type) -\end{verbatim} -} \end{mdframed} - -This allows the $(i,j)$ entry of a dense matrix of any type (mpq, mpz, int64, double, int). For example to return the $(m,n)$ entry of a dense matrix with \verb|mpq_t| data types, one would use \verb|SPEX_2D(A, m, n, mpq)|. %------------------------------------------------------------------------------- \chapter{SPEX LU}\vspace{-0.75in} \label{ch:LeftLU} @@ -1918,7 +1836,7 @@ \section{Overview} \label{s:LeftLU:intro} %------------------------------------------------------------------------------- \section{Licensing} \label{s:LeftLU:licensing} %------------------------------------------------------------------------------- -\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ +\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ \noindent \textbf{Contact Info:} Contact Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, @@ -2373,7 +2291,7 @@ \section{Overview} \label{s:Chol:intro} %------------------------------------------------------------------------------- \section{Licensing} \label{s:Chol:licensing} %------------------------------------------------------------------------------- -\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ +\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ \noindent \textbf{Contact Info:} Contact Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, @@ -2535,7 +2453,7 @@ \section{Overview} \label{s:Backslash:intro} %------------------------------------------------------------------------------- \section{Licensing} \label{s:Backslash:licensing} %------------------------------------------------------------------------------- -\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ +\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis.\\ \noindent \textbf{Contact Info:} Contact Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, diff --git a/SPEX/Doc/SPEX-3.0_User_Guide.pdf b/SPEX/Doc/SPEX-3.0_User_Guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..80eaa5c79d0ebea83dd64c6bb39fa915e4a5c1a2 GIT binary patch literal 424711 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
y9f3I^6nH=5^p0F6??N!tI;%FWu~!-dL4icjAN zhtU#UL1a39H5o=l<0f}$UE+i)hW<&X?O>)R&^LgpeHt#~@A!nlbsC(Prn`ym7~`~x z5QDXg8{wMTS5sPBO0+cSqDb&RdNHxv4{NDG{F|gx2Omg!LOtY}mTa835+YyV->+qn z;b=7y<|35$_%TlUS=~sN$L)+F=awbpPJoS3aY!i=4^HM_UlOuUT z>~JUM6XL733z#lt47m(3Xd5k{p91OPkgG*^zZ+jt`jTeI;qFigVH*%jlX+k{BGLz% zgni=aB-xr3rDKgGd|N6{m-6GlflUq@}Tb;dcVT_Qb)(K>U$b}Oi?8SPH=1i)t^=Aefp9V z#-E+yR!uDAKXIQR=}^iu9R_<1IQdSGsZi%5G>SLt-jGPNlveVo_hLs?w?EGwIyErk&!O z@W`=b*_t%lXJouU2wPBP3B|n*RZoDZs0eQ2!84yJk&b|w=q88yf>tCwB|ig<(o)P6 zrT(x)J^4!^egvI(#xa{M`6vjMy}#b3&gXYF7b}f307?-s$$*hK{o&x-&OOP~wcXC`I@o6t5sCu~Lc@%e>N5_h0ZWs65W(;6An{ zx8GsU=$=hR+Ww^~%#LVQmPj=Z{9t4XR%6GDLeDCMxEhY#r%smIfAS&{X?B}^)eXs{P3{V*gBw=Z(5$zj`CDHU^aDh;^iiFK zD~~A7RK%8mdB(EaKA5OFFQ-@mWtDIYni~2Tqo_ll2%>XpeNtfrYkAQOoh;vpIA^Ed zNB3^t8sV5=vZp>g?Ww%CoNi-+PX91v!AznqI4;}Y`9x7rEa7rIf)`$DmE;2YF+PQ6mzK%cWK|*Y)K4J-8pa~BD|#S7d%+~wz@m%tM1jf6%8%xyt%88 z7*|oikpDTS9f|jFujx1jyn$%YDq_aOgnZoLc0vZoL?t!Q_DwOOBSX$_b-F3RKR7Tc zk4m3RpPJSRj|joEJC4Q<_QLx?5+lsyzf;M2V%uk5X7O1hzmG8#4GECrad^%5D3Ha# zl6^2tVS!MTZq(6PRAOZg1C<{h9Z20{22LgoSITz~_z1_UaPIV;L7FyYIzhwUnR^$pAk~2Slt9)wTm^h@V60zFZDZq@2NT)Qku14MA*zZRP z82|Sdq0IRr;U`*mwoGo#K?GljOu~r1=ts{3{~O+`YreeSi-mG>OC!q4AbEXQ z^-uMznIIg1$KQtEuOq0IDR1@>wc7CqDW?Y2&&6y96)^KoVs-T{9gGf4Q{8`_^C!{$ zX9LTI#FR&Zl9EUqX>LSixDJ!I5S7I4HG`F@yxcOg2%PAq ziJbQF%!BlP6@{s|eNM!(?RFJar!KYC4G#j`lyC)$@0En0H2r_2qBpuWvOuKUhhsgM zAiq7HoMnWpsCqybiWNMFB*}?9M%Kc?zbd!KdPoxnw~%7z2IEK)l2gBaqetaI3wQX! zIvq}z5<52VO4lAxHWrX$E)q4y*Z9nT#f98a_y3ZEK~hzB1IauSgng91Q6$9xh_7ty zQwG+Uwk%F5AEKpdt5zG*57_?xm;E>{-Fj>8~ql> z*NEFtk1)3@sB37f^oJ8B!g~b0D(%2PHi|J-wlCq)Ql<6I+(xcLD#n*IaL6?^1)W@J z^V>8|0mwg&&y0sSf^59kmD(N-J6P^*l2;_qQ7OjsF=#2FAyZgyD>6QJb3n0VV7S;6 zJ-l)93W8^*B$tWsWZfvo7(I;gBfjFgp3^s}$HFI~D51V%euI7<#fi!N-frnJZhPAq z)&J{p!GA@y#UxYWPq$cE;gmpn{Upg}n3W&`b~_k;&uzOqeaq)*CgsK5Q@!8LU5y^v z(IE0=Q&(AaSPByQYm)thu|o&ZJ0htBGhy& zAZe`BKzOeu>+3l!ADf7ZQhQ4D$N4#>(u6Cx|JUilt<}a@2@_W_n`(-l)(daCG&-Lo z9HtYv8zU3OhP~*Z##LW>uUbfUai5p00~H_3Kn^N8zzlaAU_fpO4M;^bD1J zA5V{03`KcTRX1^|H5{RCr(;sKLH3Ue>N9i>lQ53FNmd#@M)CX7e)%ew%JEH35&v34 z2~|mhiiuFW65`Nm45)y4n?bKFWny;K6xZ$CxsqIaMPM5yhLcCq5O!&nL98tveNPSn zDUCT&_9yohWTQ0`YESEY9jg~;1RAm&r73;U$v`)}Xg>Ye`$pJZQQpx8aXYKO0LwiA zN&i8$#ZVOqRjGM6rN$~aRsrXn_%W7`#3!$cg{inFu|)pLgK#MquLFwm{keG z4$+DXA}RdoVUuKVBwHUg^@);`5zQ$)YH|4W2*g{uEu61&x0QOB+Xef;nkCh1(@rk2 zkElid?dk=6!(s$D+M)$_KeE%MtIi(HZBf92PH~d03;uSj_2T*R#K0@*yxs81 z7A3vsF8mc&?k7)zDv3H(;9+Pm!_eMP{VZ!~IQB5W0I^;!IU_iKx~CLB-0aiBDNBno z^XeYX#YDl1B!I`tTqFPklNW0bV;xumPXMr~-%%kpwYZ1w9@CvCAP5X|!6nz}j_7Z+ zTM?%-p;leF=?(|gdd1)!DAn{m6cS?8J;!c*R=mFx9o(oVXU=L~Kf zF2K0y7EXu}FWnQF$J$fp!63(w_5dA=Mj&z0ot2-EWMk6Ay>s7)W(S1M>g;_?`AY)v zEw76={>ytG^3WFg*O#@(neEsN(HUECl{3_PCn#TV()|>OgBPgNsh_vY6(=&j1iNEf zNG6n>N4lkuPC78IaRz zxjkT89nk7>KdEPabGi+s%7W~g4|B?WDu!Mvx_kW^1G%k}k?KoRRPK7T5Q>|U$$X-n z?ZKWpwQ58+Od@O<8KF@~Z5UHcE;s}_EQ%D3zbK@uy(b5<{()FsWsX1MUGF1#WMs`#^RY9Shx2lcfEh)2N zv+CxRbOk7gu#XDqRKqpzY5Ez?rd+=w+BwnelncdbWNq}!D`f`ok2{$9Pm2mk7hnfWuS6l!zhelzAn zp=n#F2K)b}4xZ7f{Eg#n@*Vw0JWht2(r1z`8q)#a-NB~#30GVy3g;X`^7UUsYESD1 zoM{Yjt$^l=IT)-L847xR(@6VQT-Z_KC1h=R$Im^ogf%DS zg?jHlxHf-z!Aocfg97g0B3`l9Tu4evb)U3lfnB3bx3B30pb%BRfh?bQSYpb-qf$yRaASoQk+1vZ;|W)G9TT)V}5 zv=1~=vF?;=j5`kfvhtT+SA_SGd@wXE_hweyaiW{xg%BlGnh5?y^NXDJFDmMg=MQlY zs_9pVfl~@KNOzm}m6>w!<+U)0gPD{k`>(#E{pmlnq&htVr=HQP5nApB*^` z;RX90PK9wspg-YXs@%h_@e?DHgunIV-Kz(hf|qkd1LGi}Y8(RZw%}M47Kt(=$(i+8 z8IrZCb>bkR2vuS|>$b+`K*<{-?NuW2_=ybSPl@8|*=VFJV*=6Ng2d=9Ll9EfMh#l= zdwl}MkO?n%c~L`+taxnVa3uz7%A+se`~c;F!Hj(qIo)b?*OA8!a5I7d%IawEq0s|k zOP0`7)aR&l%@Y4raf6>PJ;AyS8_8%IYgn`yIDDoKjo|oRmuGWipTDG4amUI3>>CPG5H)tB`8DKNzV|szv|FU--t`OiiCjRw z57I%vjItd<7#^>qolc7na0NdsGm)!iUo_F2i4VI>GPN}s2;=? z*%Tf^CF?}}JQ7FPQ?<`P)S0rsD|IwCZ_dLj_thCop_jz^V{7nVVbdh5OHzl63J>z~ z6W&Y0mJ+;~@OtOzDMAU=n1ywU%XZiKN!@ue^|vbMVj-HRSf33JC9N zOIi@Jl(D%V(K69Dk$qe zeu_@U%|Fp2s7GEPVM|_{!~zxLKb!N9>(6uUT9rxpk?N|xqi{y6cQLpo(om;pYW-4l zqyz`MA2bWUJ8?65Qd7{gN8@=bVNwdY>gC7ip`xR6RtUmY3tZ*HaY{WOtTW>O$+Xkq|!w4GYKa&h7=Q6CaUpvq&5! zX6r4|mwCxg@55~JKsIQeD;?h0UaizNQ2Y2%Q*jXym^}j!-I8(^-_JHe z9j}p#Dho7v6(BC{v)b=C3|ta7izPI9A?3bO5jQPx#*!Acy>NdWa`mn0A0A=_W=G`Q z-}QOXt9S7+J)&=8KR(Cj29&N`ce(Tde-6j$dOFG>Qo9tG5m`X&RkzI!0rf5; z%{^Y)Cop(XmCZ;0n9hf^2_IcOdFjzYeU|bc@-&okn zNx_=f@0qgs1&a!>n0GP7TPvNKdD*0^S=AD@n;yIdb6h3CZ%~n6e!mp0)!b0HpY0%$idG3H+9VCt@;&al$Ne2 zUxE(ue?;?OkH*pc$o1NNwcbZUG!K5cZ$hle0Tx_y!aPF@PjV$uU5Ijec`AKMm2yz6 zR_s;}Dy5FZW~TaxyOTg(rBb7Ajsm*q*woKbdsafvtM4A)lsnq!^Fm**dwoi85G}C| znHmoycPpy&!dq<}_kWxP3PoL!w&8twd2MDK9Y^_jI4ap6FBHZuN$-A-K)Q$=%7h$$6@(IV<&4U#c=P#`o(m z6m0GGP+KGRK9h~jVfhmO1a9}ya(2AApj*=wuy?m<#pG7q%w{4_mod5JJ~Bu3wNLcx z2iW(REjf|E?3|Gl%s~?Zy;Z+m%=v4($tiuRHD5w!XEmxC4ZcVRu|+9I+|JYRm@X@k1nqHnthe4K5F>%Ag!2?@1tUSO6JxPEfAHR@t&m0EZ%KQ5_NK#9ZV0TQX9u{YuA&o&Dje@xnnt9VK60U6K{hnH> zRK$3DH6lZrloXQM2ewm_Q<3*JUn_5VltO$E-pk&qH)c!ah7#U?Me6L^dfWCz{sEST zQ+p}fx!yH>4S(6Rvj=tdCvJ4&${xRu|K04-ZF7$r^{xK|x=H!`^cIKY>2JRXn=A*% z(aZL7j}jL=B+VH!|_-|31aGE-+ma%wY7b}N&NE^-)GE*t%mDBIGb z3$~1_Y6M&f6x0U1JsAA5grdOVESYPlw`pDI7fM5xI0M6 z4MumPQ1U($b)Z{f9H=dr4B>Jdz-;10So56Fs#1YZy}N-_SreZkf!TP&+c?nJ_>sGG z&P{rmT%;n0uzT$H=R8>(EX?`fV3vcvYV1I|$%uVYEpUWG@3u7l))`HUO?y%XZJ?^6 zh7TDsOYjZ)Oz_y1ZZ-SvW1jw)JZh{eRkhwYiS+58pdc&Rv{x3Kxd5+l!t@>Ge zS0x52v028MgxU#j_ZW|)B_|3p;6i_-Ek?B?g|lwx6^ zk+5(zK`$Vhr?4}WwhXGh=2gWTo0ukF{Qz4B_@3+fgxaT1-;PKYs~v?9N|PIHN;-P) zV{bxNWjjGmj6mfqm(XBi_ZBa^kUH%}@;#&Q$NtF~j&Mgp{zf8w)t#?XUVID(G#OK? zxzI9oiSR~;3CoNbPYq74U-Yk|2YcB3^w`tI-2I$lKRhF`{#FS)!ehxUzx|)W6&YRP z2A#F`F)9sLhzz(wfb|edti}|)JsRvI{i1b7r3 zb07qFMS8J~hA~Q9wntMN)db5} z2d0s4_>W@}!ow0&&q%OL;!x6`Dk1QDuNTW|g5p-xJjNTM9?VEQmZ2p$kV(D*%T;lA zLXQPek~MOf2vUm2{1l5{pjR`c^QJc2-A!$3_Pfx$nx;hzIuNQ55|w6BokO9DOi&sY zu6L`2oNN?!BQ3=#eaxXlZaQjJiOYk1x97@d=%3p6TnMMdqG}Q9%Wea^33Yw$YxFg< zBQ0-taJ}J@FmCa?UWlSXg2$&`ywfN6d4oGK;!_XQ%BW7!fbYrq(O;zD5K+4DQdJ~z z>a?Xk1^wkSgP<>o_fm^9coVCTzoeUt@!x5En-bL*z={VSbque@t|rO{aDg{&tk{AG zlaukb?YjgZWuEk$ZSwDI_1IlTChO)6=q(KiHAJde2tlOq?AewH!ngFVTDGOrUg80yL+jNxz1&N)M!R7D~SjOej6u30=;xK2sDl8iaey!wWz4>S-oQn ze-vOb{OJklAsqjR>Wx232>lX`iNMGs8Y6b=&LmE+fuW?0^KeVMbdU-c;pwJ+7kO>7 z5JguSB&j$C@e_brxrGgW(J)^l2kPL@6>yPP+~0rvM0CV7X(9Kk34KzPf=M!F)W?XBH7r$jrPPVbGQpACPwzV~01GYyQ&N9YInLo#r%0&&5aqr4F) z?UVlbzy~%gKacq#YoG|GLELuvwG)6#Z@;sRuH}RTR0Z0DSI^My7Oj%6N zpn7h}g1zke&CpejEP<&(6#bKwDx>()c1`E^^PLYuAtzL07F4pTykZjaaNW7J-PNuET+BR5b}(>)s4d^?{yLz)mCxF!dSTET~m~ z{$><3v$K3I2~>`kv1YyzmT9$SdFP~lJ)sGiu)N<)mv_AGG|KkN76PA~`zK<#_0>ss zuHMa8Inrf%S2|Uvp+WRd(_0&dc@Wp0LvR?@=Cq^lc-M3AqYP@ZB2Mj!gV^RSJ)81Rnr}c#lqqKuVrk#Po3xJo9i(YoDo}qnsfLo~GlExM!~sH03pT-GW`*yf zt&?fmS{RBGQZi8|i8GJ|YiPKtX%YNoWAi_pquAPchQjx$u?J>Kj{xZTRU23Z;%u*Q z8CK&d;xSgZl&qnm+iSkzP#~WTwV~y<9J17WzB~1Dw)$;7?80c|nr>AcjmPbY?h~$o zE0=ZrA7vc^_xB!gIzRzB&nv=QcrsB16yu1B6=56JrA)QF!tW&*C?NiSn% zaw)d?^TAmOf?2xi%DHUT95 z3+OR#H)kK64ba8BM*P*Q<1b@kLr?OOyQogjMpLEc?UG%9bH0-24rk?Il-$`<*UQ~Rhy$vWpc}2zRe5c`rKLOlyK)X@hV@pvZ z(*z%(G1lM@!%18W-@+FR(qe-8=0gkS;PzOH{|YlSNt6RO%bm^5NC*z7V}{ZI&ZDL7 zU1HnV#-&pnf94LjOhX`y9YL&SW=Llq%$AnHI#usfGK$F}H~tqlzfONtVVi4O z&0^NY27T~m^`c0gkw^9fviwKa0+5cyhxYtPCUB;2F)n@JT%Ny%xOR;2&Xlp6OHs0h zCe&`oBUrei`{N6RO!mj3{AMuN9c-v|VT4h(fmm{u#o__Za^oNx0k!B0Xzj2D&a&2Z ziL@w)K_$A&%C07ci9KdZYH6ran^=%?wWbu8ru3`18k3FE!&SAZg6z&*2e##2u(&2bd=$Zfn z=CH_;>QYSeb$fF6iq>s;QG9Jl3FXR!Cq~T3t-;Lwy~A{OX#CsuVGduM4W5`a5dJ4(J5Eu{$7g{l|D6^(jkATvPms@}mm5&T074H1ZI% zaSZt)FSgLl0C*NEcL~CByX($?F3DRot9r@ug^_-@$3~i2$8;L(?{2{?jwHGdPA)7_SS+Zf3vWeS$Z|ov?^93mQ1nsA0TbrOOgI+BKt$Y(3{He@L4dEf z&N#Nbd1-Ajxd;~jhX7leD6i-k?XF&P5|R3+RJEoj4ItZovy++1D3)R|jsf#mtS1B) z*`zSUz?}ye5()=G;GZo)#GD)d7D7c&%&h4kbOYv7S?w_rr3MK~^LH~};pW$v4Z8cp zq=Ix#fn4dG1%~CBA`W#G-ArJmTKD_M#?D&nTt{pNZkOEp@usV4F-asr&&;j+x~+oq zP1i+?7+@a01!vk7*?~O-6ItcguQ;M5hVS@n7g8eDXwhlnIy#LWNzKVC?fhB4mwY0c z{(@0}zT-Iftg=#)bUFt{k=g@@*-!xCNZkhbJ4q(0#`C7x0CRUEhX*U_3^>U zX1_pW1u|GAtxJhDzF&4lf1pg!?HfcO0oOsYSLu)(Gw;9Ut05jvk#YRN1ANfRwqait(G&8d1(DG5y zDJ*aWmltPlZ{IesoE?edvWE$9Fx21}gkm{EQVj8mX3Bg};3b(#cf4+1w~5&QT`C`u zm;1ZEUOB^tV_L^vMBOc;Un#}aSB60?6tTx{boN6aA&N;z*L;ndT=GvM zYh8L4G~k!C+!}Pl4xc=zPc~gi(3JvXg0W zg4uNG{1DUzFyn2--;fRjLEub2UTp2-I%SnT)2CF@8~S8iZ)wKI@F#7As|KqQ_r&ip zSIfcu0il?FFY^I5p3c^GQNa4Rx5h`H>vACBK`*7lhm)+j5ON=Dg++KhnIto-HI#26 zhQr5c4R~Ab6((oyk7%FOQLk`~2_{Yiuge+eH{ugHaj{NgBBmNs9u!*wpd4I7+2=Dy zk>tr9em^W(V9*2ep@Wv2Xj2;>nag_DTohe7_2LRir<*1Qur}ie&I5Fr-#J6q`1iulC2*^3=4hV?2->3ODF(C>v?@-%dUF6!}+r?YiV;e zw(eGL-b^7TvF@-W3bU)XIEv%50*u(tG`9KhrHOTE-tL8;C}xjjtMgfdIP`J;M4P`V zlomqk(R)o2Y>1XHKh;6U_&;RN0sd}kd- z($7V0%k(i-hu!$gjc2C2BmJPm)_n;?g^RHUh^|UF=VU#qII@%o`{uf{<{yFx%3P=l zO@Fjy$2;3Yb&Ya~*3%8m*6HZ!DV$?+3Wfj4GE2EViCUBOH*sSmvNZPCEh2M1+$o*0 z^*?onQ7ITtuZ1F{ai(XeC27dwtY4eQiLxV>O%)3ytw0Ve02&8kmaO2Y&R3q_N_T9i z_{IfP;Z%A4)-KxRSNnEXK=0qvndb%5*?8+Rhq^5I(k@qWvzmKhF!mdwo8tifO#*g? z)xrNcUK^2-(l(g7{#sMysdHP^Wafa1-!?8LfY)_=hW$Z-rPOl#B#o@sa?N|+a;*?( z;|OuojuX8Db8{ZiRDFp6{Y?vSOZ{`@QSGiHLokhe8aThoxbI|2DLc&uunkz*b^k2v z&owf*ir17hUAtfPP{2_zvE6#+lRay}n^VQNwpzebCZYhn@WHRp40-|KSBo5YNB!g} z4s*2zZWft?6O$=)l$+WIYd}21kJ$|p74WfBG{F$r zHBz^JCA_zjdedVYXzNaJd#R`*r&8-#@O{40lgXgS8IP)`-0qwm<(dcxr4O%rcO$na zZTa9rfd?p;yemR_>sB%NmwJEPKZ{yHT>zy|<=I4o<5^!mI|a%8*6a&~-d&6*k-Icvr%eDr$ORjaOOp&onOh*8JmJY7EFQC_{)5d?Y?wWvgV69>YhZnr`@B@@SRm z&}`!L?)qJmvl;5}rcpROnb|IIp#{3se?snCxxME0S!?L_7N@$F82D1*-9FWm1xT#%_W!8+0& zvfp1XKydvc(;+vQjf>C79C#zs^usM1Q#Gd<-K0Xku`Cj=B~8M>qFizZ4Y zLVWUsl-VFo#hgESOsPzd1#hG&v!g}pnAplnvVdJ)pdo*f1;}jrlI3zQdk-px&^E7n zk1Ju8Ab|b$N)-U9BWDk-cJkVqI-_Hq-_jq(YBOqJVMkTTM1iS|xAd&hsiYcs$nE5@ z3&O(czvQ%ZW_1HsHQ20d6!wY)*C$e;xKYejuGa>WKD5kNA7B^SuT@-RhuB{dG37(T z$Ui-hJB^vbw=JbhM%m^W^Zwnb=wmz1GHX|JZXV#{K0;|X7vx?$p zl<#pI)}-tq+D(w=QV`o!>gsU`poX>635=hyYC*a{|%GtD?GWGh~70UA}n4Z#xs$ZrUx+smsL{r|{6mRiC?XKt{I=zl% zbBVze>a^H=toiN#io43`lgEf3ft!xY3829emB()dqA=N5u5Dg95N<=d!DNf%~xbrrCDEM~>;`8~1dHbc8E51ncypEAP3_54k$ox2MUC#aT zoD~K;|7d<3e{(&?OK9t+dP$Yoozmu5K2(QXn_eiFTVaZ~6fX8sR59j|WX67IR?~4* zyDyPTB{cAlk)eWR)?b^j*d1Js@k0uR!o8X%T0GjKnsDOlG?D#o>{yUC_c-T7hc3QL z@+s#?`Z^WH)Cweq7vHU;83sQkFIU;RN2PGLY*D!={;CGEbj;*}V!C)b@- z+Lax&W|&V|Mew#^v4xIt3`4Hc)GX>$6uBzl+MxpqMVmREjt{FS&Y8>HQ*s)-M_6qm zK+3LS01R?Dg5`T!1#TSc{EZd@MA0r65VqUDJ8q-wY@`H~f50i|cVssD;jgWr%g3Rn zp~ANWjfX;%2@AK>X^N;4!*xJfGHbo2Q0Mb^bdGh3GouC*KG}DfwU^LK4WQu)m{br)EHg-5#NsOPmxG z5MFPa7!8)W>08f^zQ3Dx$FxkDon+P0GyS0FtKIfFy4rpKUE$XC!Tq1VgY)tXW7)}s0;yVI)Hl{arq10^XZ;8we zq&jsV1-bZ4EnX%z(oT-s0n>7exU?7>Dobg4>OAWHjn)MClD&8UNlD`cl2ec`QSqn^ z3?#@e7PM8W6>DP3(WCPVZ=UQiZ8XSRE0muq_2g&bhs{N+C1je8Rh+xFCD#%Ze8L%2 zwuTsb$kXoT^ASw4n$30@&^W=8%Zxms_BJY;IaPIH(7vB;wp@O3Ar6Zzk33+t*GQNj z)dnDE>v??c=z+ikWqIfuBc}?BM3jGbN8RM;&p7R4d$-^SEpOL&#_n)i zYMS+>lI}I3h;%R3Ua&p!b{Jy6P3LRhd8-lC3AUueYyz|7`8T@j{bKH*w z;N`Y|a>2|)3fDgPgQy~d&~PrqxzGSJnY>Kp-JAodf0jakg|F*1m@0apk!EbH!1~Q$g5Oj3zxW7$wX7; zpw!xemCBs=~ zo1{oX)a|qyO4;MPS)U&J#2S=msk=OP3qf~oh~8qUVrM1E<#sIC6ABj$ru!Qqp4Qg+ zvgoXpPd*gpdx@Joc?_2@B(ek%5H80Y2RM`xSRH0V@-p{4P738!gpB_i;Hbe-7TXP! z$zcw67S_CN3trxQVLJijP{)XGQ4Bv%gk2^f!5(G1S;X1tre72=f=rB9XZSUkBQtjG z)jH&uwJ3Q7B!gdcJBF=8obr9C1}-jkq!DYfG>)38e6GAY`5B?tBwkBoYw=e!cK0_< z~#%%K^jsKo}e}WfPCFmOHESCEo6T!9iCtU61slFFWqVD{fCUZJ^4Q%j8f3|=Mu0@YA;5; z{~_e&lDR0abh0EBvZUCR)3lU7u9#32h>dke5hJmo zEVFxVFQGxU(FVP+^$7T6g|e62#E{00A%SY6ds$& zd*ZpOj1oj7r)ur~QbB&Qr@@Zgx1XRu)50MD%bD&KtIzQv<`-2&hJ3MElo}QVfCs6V z_rlF?EJ&yAPNVYgjvj!`!3GsX!!d(F~ieFu?Z#cj zN^%6s1O`g(YKgbo5hC}CSUYF$E~Nv2ofV>o2c_`T+OzLkSphfE;_$2m`md}fB2inN z*&C``-Yr#a%@VqNieTpfaN+oI)4J6-tb#RTqLvJrB}X5!hmy(F$~lvg`t-F=;nTbM z;u#?#gX@<$a4Udezx_vT(JoQK_NQrgecCodDaVANA@4$&V1&C7AEB5{%_ zmCXPnP2Q29a8&sC=|?XzYzM|780Dm`&vI<6L@GPqKcJm!yt{LiNdOq|XWzqwYY?HfwIqqadVEUCcJ?>>c`m)=uhw-D@4$14G`1Lpd|J*604*gWo^6#kHY#;FLNo zoZhizNoQk@U*J;Kh<m2-lf>65(b3^e?>Bk zzRlZ9RT3Z1ZtSNw#7Mo7O)(sCK0-k?s-)~7jL|Cjol84(*>$CtSu(n~FVS@AllScC zG&(dc%ta<3^<$CM3+IGMxgkJh13`e%RKYo-ddjIqWe1=dpZ~F7LGg|Cnzb_@F6HTV zG;&kHNylax4aGNHS27nYuTJ72U%*0QWaMhnx-Scdlg8Nf&nx>f$WR&PSC2N~Vj*f8ErkVYuN zxQIpahOOWJta5219$!+z;U_%1wKF)WM>?#9shZ~>HaWP>^^?9!PuHDd;TaO?BS-~> zWTorZx9oBR@%mNW*WwjUWnR{P)aOWSZn^-1K#B;%;mw9YL$JN;{teN@c1DhFTpY() z+>r>)qBh*qlL4){vEfu_1oEL@SV(NC(2*S7`M~H6J$}K_>m}JV{7rCdpzVZk1?^+F{ZN{?YrKeI(GLSOW{{0PDz7fx}VR$%Tl<^eeA zXa~Q??sSHT%IbAt7M>k#i_gZkn9wVW6Vo?NA#4)|6aAQ8DRc7NYvUP`9otPI>mXf} zDl1RuqEnd6M;_nwuG=6JiIT52%3e*+c~;!#mY4r!bZ5tJ(%HW_fAv zI=Ba$0~;K1I;AD`UOPABG-d-6BtvUjX=n%+S~+0#xopDnO%iJlk^f*peV7Hn z5MfflZy3@xJDMh*{DEw4GcMNg*Nwvws{v4+au%G%vEkM&kBz9!zuUS%_kyDyyT(5^ zm^C(Y6A!{sY$TY@qFLOInqt$!Ecp7&W(}nQ{~>5%0);O)epI@Jf6Ly~R}4l|5;_cQ zP(v&=5QAw$ObLRZkI=vR4OK*Ipke{yC=#xT<9roi?e+u9KaBi@@Zf-0hTA^_x6UIC zJ|30EYc0u8d`&yWa2Ro2yjAL(xsKnBkN!3y{4WA(EL4=U?6A@dKHLZ$*{nPJ46B-Q zPY?*pEJc65-_+^1a1>d4F4ppv=(Av!@*(4aOH4h0yTggLF4#K^)D77tFGb?w5{hPa zmgp=oM_0(d_kD9S+eE3H$98u^%+~;I@Jvy2fk@rIw&^=rHjUG5eAe7VJYe(hZN z^t{L>|Bj5bhFk_Wvq8NXmWj3D9=PlQD4v=3*)hwY%$f?N-XoaKrbPyhB$1HZjAp-6S4WXcY&q-{(v{RA zg3>|yz~1W+!`?czgt@$a*P1xIRdER6J|H(YSMkcYckA#qb#acS8MCV+QrPXC>*+bX znJ+b?jizILW7-*O^1o4YisBFIKfwwv#aBp`>yhc?EZwhfbMvFd%DtWW-Qk(0S{z$E5mJUmcveLq>}>%r>iymKZq)0ZV=cP7iompsp4?Xn4lDM#6mMwF@DN7Y z{RL$IfCFFfBls?huUQKBR{wwXklh7|uw6Trla zMS+04IXmYyLNvgZSkYHqpapD~ENu8ZzVBXKDLD4r(d7k_9Cj3IrVIKRacG;yAteb+ z675SSmf>+0B{b2C^JW?_p<3SpSqt7D%C4PsK}=|(O}$DkRMS}}_Qk@1sce1Mn#h5s zdS^xixqm;RTEvOhi4RRsG*15ov2ND?52Pgi!R1<+5!9|(HC?9R@wGVAQ!5ZWFCjf1 z)@BXheKSnqlbnxDt%@{opFTcW%2chgXBwOcRMAeTPlam%rB+VFRt1Vh839!-d`$15wtVFxw$E zxvg1+TVRIrNPsX~&>ua}qM@mON*}i5+8~YJAh^=gvC=q+F`Dn0H*kH3LbzmEW26^M znPAIX9v5CrDvm3??dlZll5sPM>lhqT>NKfs(Iblgve_4o!?qn} z%7tVFfHp3`fxV%msIQJ{pMwqL9xHYNQ^I$o`f_!&pc~TS?Sl~ZcL04HcN>$f_Z;F6 z^c8&33^aAvfq(%ec>Gu2i!}2RjGWU%voD~i>@Rj z2IpzrfkFe9*uNFfy@+avA_BnM}0gpLY*6R;? z#Pf^A)G2cxi7m!n14t0Jl&A)t@sqx7V-8REN4Sv|C8X`LuL z(dWtqcGzQo*__s14E>#Z?bm3Z$g%GV-xb0Da@`)NEv){ZoUn}lJ0~nY8#Cj7nO<#F z`fU&Bk-JW*y22!{0}Q!{10V_3A>!GswNRQisEA9jAP|uQo4!Av-$>f5y#S(fM`xK{ z^lyB-YQ!q6T}_dB9bZgmri*E&$iLfpK-}Ckl(b_?ZgQe2WH_dBa@VXjk*yZ%Kb@1S zFDkt1j#PB8X^Sz`cN3dDYAxmZd9Qqpd}AXIZ))QTw~INQRd^2Y?J92cC3a_+w2WIt zPEfxYuiGsz$VhQHPFw1#CYv}0MmW%471!M1TWc>GuAl30mOum>8Ynw_k9z(V^1xB+ z`ekuBX)k}0rp>OuP0QwVz6@G;gOAYJSZq}In!UCzTrGV#a^gT6)8kU3Rxx{R&VTsr z;KE?}UEWWuduKr>+ER4_FLDC-3)+Ese7zfsPy_!swfR z*2g{c;Z&?rRBGK zf@kHu;3XztvLdF1IizQVzI5TCh`xxFBQ(r{Ebn}?sR%e22~n3jqyw|F#5h^E)W}5H ztWrc?Hp!2zvbj@H8E;$VBd0>cT&(1`E%IZhLUJldPvzU~d!}5nXAV4czX{Oa$=OUY znw}Gh$y$$v{Mp2uH}3PXQ;AVtInH~J1*Kdvo=1;`iBk!yT(ayB?(?Zr2|Aw~=bOhQ z$J|ooH}2wvQ;KZu+o|t|Z8{t~B;AF}Mm6n?m7egMb{9CDoVE(qRkZh|thx!GEhXMB zH~pssuzvuawiSl|6E95vYhM1_jQs!Q<*J2p*|Ih+&6ZfafEfGZ_41zRzj?7HtFV4C zMf~N(^5bL+#Wdk(tGRz$X9f8*u{=y~B&h`3?33(efn|6F`ighkII{y2m)b)KZPdv^ zbmf)UW~XvPsSd8wkI9d8xE#r`flqBTzk&>VtJRWSbH;6PYGq9(x}Bs~W>rn*duWL0 zbPILGC7qSb{VeEQ1S~UV0#-%G6^+3f&LSYLsw#4y(Q$Wp92XSzSB})5#rm8Nks`(F z)13G{=ffTX*ZF>dyi6KjzVo>ULU2fhq?(w zDkKxqP7~ZdjDSK7n^IrLu27@zP$x~FUSvK5;z|A_|M!wsb+rsXJvK73xAUeTI}D2Y z(43kiHh^R~-#;vv4M$rKwSS}|0Oxl7VD$9$ZEJD5p%JMy={?ALy!e8SFZfYL(*)O%cj>)L8G!1ERfWn&{zI02#j@qNQLY4#VkmfKwOgo%;!u@ z_Wz9JV<#g1QOJ=nnUmF53{ruXLS?Y*>oc`)Ou6e1#HmhmK5GP>#2uX1=Ku&44LaWI zhjlM!d^2q_lgyjt1PDcs8BbF@Yecx~ALIdO{_RT#^p?3#422t(1BD-@h%%WdoCT!@ za~^ar0iidP*4G^18!?r>gbvl}XO=bZD{BE11jTO}rJ(-G%CAIyr?hPe=iP}4M`rVS z0-ztVpza8m_Y4NXfP@w07zaS0 zc*YP1rSa;|a&{MCEVak2OOzyYw1!G2i^dNk;S85EuI zgvJpQ7z*R#k27fSv_EUmEC6R*-WaeX)&VH9e9>O%Sk>Srb_FsEGQWo);Tm8OSsXc( zB@#b*FsLKa0+1c+pXYIX1gyARMATXfWM+O7rlc0pKE^bm{5W}yJBl~IuQ#GYu5j3+ zeUd}7_f?Ph*x}Z{{mgi?7=miPxhHyinUuXcFsFssp&194a(va+>lHM4CEFHDv=JgQxmmlAJmn{ zxTcGXDe?L|o}EP$wF1(Js9g2^EYb<9W*XA>Wb#VL}=7)s60Q}8L@ zFR;eO~|)e0{ghy;~ZNVyOxVG`#H zm_&T$#K>C21&0>vou8da{(RlI}_QR zNGrj5T|+d?rg42iWFwp-@xch3k5d9k25GP;3OxaR|LmC z=k(KfnGZ$~e54wD%sLF#6X8VV`U}e7Dss>vGsRzRH}lH(v>-dhn5E=%?AU<5ZuFCI zWc1;?Sy|fHINx=vo83s0k`1rSX#+1vJ^eJF?^nK@-sy5Bb^j`w43A~zWbS?r4!<^~ zV3qoN=`SoDd2n~+a2-ohVGdO8y*Li9?+kvJ{}?r_7j9m{^TLc`t*H03j5hNkrS7P;6o3p-+!xT*P@zIdC**r zXiAsd9_s8UTFzPHY+CB+zU+MLWJ3PDM=c)dMQl^y+Bk~8p=5E$#j#S^8XDO)FCw}* z(ABbysflrw^Ac$v7w>Bz*z`HU{8Sx%NI_*J3pxS2RmAK$+b zN;23c9L{jvAn9ceyPbZ&uGX6sBC5c=l_G4)3Y5j5#OJJ(-jC2YY?ThnC~oBsttk8H zB|0}cc{#eP75!!$_AFZsfd+DUBHDEV#e92gMGe{LZ}ksXr+xP@Zg=*ybDyCBC;C_0 z?Xg|c1G|#wkc_ziZ#5|D=44&p=AfBmuoqpxu2=0Ox-sQ(uE5l0;&5`YZ*y!>SQhLm zBU<6et!zt<(fVty)Gr=p?wo57C`eh!3n4tzT9ZhNMZeHYuD#D#zg>C#Klr`6X-`V>=oSkEICegO8V|F^}*k;GJZQHidv2CMc+qP{d z9a|mSH@!Ri+;h&}7vuc-)~Ncbp2Cm0-u2G8YVDEYaB+1j^Cah5d!Rl`cl1U*y1k`v zUtf0WB(`B*OKoQLPH%q0B*R)+OLq@Q+3?9&7d62aDDbdddN6-{-m;0`iMwtx^d>j< zJ7`vO(rR(m2>pexA$9d7ci~H(% z`1;x#_R$*dj5Kqc#^^2Kz1eV84~@A__qNFp{YTBLc?br^d}D-Lt4$vrIwU6#dIYU0 zO`SnQ-}VMaBDp7ys@o>3*KV$F&BkN=qhRX{*+Zz=B54AIng;Va(*bc6!?AS^&{y!gSKZzP6ANLw1Ea7#k&VB>ZSC{EZp03 z?6vfTVNEhnwDil-%BVb7pv42GZ2HA8%K`NZXsNz#`-8$S&*8$}Vg3-eH_(BE!^y`N z)1L?KZ-XGo4?XXs%bQ;Nv%^mDhZZS{4;iWv@ab}V%>9aDHHu;ZjU)z*S-ajiS6EQNB@{g+Xu{TNS*Hmrnk? zi@lkJI*Px7WiXjVuKV7Pty35Y;Jr$f&`wn~LZJ`&N)Epk7;f)q&m+kGeb}(9XGHlxY zf$pin5Eju}Mg4}S!Ffg`8BmQvVs?V3TIyg0XCJ5>po%_Cl5=c?4;*$FSP%!=-w zBVrHD?%%~(H@p32`o$X`p4b!kEuk~ob}pRKy$UhK&~EfENhAazUQ2i#~4`Z@?feNec8=ci9XVk zTfre3+>eN{m`?68<0rtg6jh4I;jmr9NBm8*P6olN!^1mDnD~o0{|;H`+Q~YMiCjFg zmwd8oyB6|e$v}onijAf{`D%DQgsAOO;l16omaRF?GUE_w*6>Q4ChHm?AT3V!U}Nr4 z`6umG5^8OMoB8Yek>~LKuIqkx5R5Rr-`d^umEHetT*UbQ8W+(rGtmEkjf+_RtIg1_ zHg31W^rhom{$feX=@Hh>h@^1h2Jjck(7;4pQo*d%MkfwwY>vSUGFBlcOO7Da%LO1V zE{hfzUOhQg1!Y`MM5XLTCP{PTJ za&VL8M5H`z3;1e1^T8s~m6Uh1$iP89gHpes^DoEEd%7-v;l|@-gz~9o-2#-P`8xwA zPv}$wN)7Tvd<&IzhEVLYqbVOU|ANaZ)&V>`eU%PSj#?3dO5;f$uz=lVql^(kRyK>= z*bWMs=soBQ9NT5V3v{`&0F8z36lBI`=E>nb-et~H3S_=6`sKm4(0^KIg*^f=Zs!Zw zSY)kE+^yYL;Pp8lZOJ%A(330<)&>8iNU&0sB3W!XUAiaQc4Zf;2?lN>=vT5yrnkG*JQ<>gT z)9^`MrUwHC-+aRswg?-d0^hiV6BFfSv53B4!6}D8XLBKi`*IQh?rX?|uN#dF{>?c% zN*2Ud89o{2i{BsCE%#BGe4<+tU>ds(l?#|aI;*1O~4-d}H4zZ&zTykPMz8YkVQMQ?F@is)FY*G4e zQqpeSuB0rSI!V&-HUmM4lEDYNbnCuF7%v{4k8jT_IGMKqtscXA*Gd!_60M5D3OMBv zCp(bkJqJWy3c20nm91G_Hvu!Dr8cS{+9m1DjpKo4nn@;e(3TzU)O2e=X^X^UX7#Y9|IKC}GZlIIyf8Xe>(75q(-? z6zx=Sq2C!<9$ZK6N7&Y?I^EvzjU<&g)e{XVkAGyXkR1jz0~OPivgfSX?mP{=S`uV1 zdYtt;c~Oi8q`H9|DmqT-GX+RetN{R#TwgC<{%K*F{EkpgOP(VMt%tT z`q%4qIWN7fNIr00)42huM(=vXS{XgT*r0R{A<4dsLtHYui#~N_h88Q0)v?;0<^J7P z$NcSs?JenhQR-l;CZi<^eO?;AhrHU{^=4ZJbjU)QUj?{jW(mvA$bE+HIi$~8Es7O= zglS)|fHTLC)O~_Vd#vcX7stBptZp*Spw{ucelx4j5142Pr`L7qS0{xE9Jg|n{x4#; za?{B4acvX|R>?XDU}!?ck#TAAZcn!wi(fayDi)F{-AZ(CRIQ|6{7zc)oz!dUbS0u@ zo+E!f1!9|)tJCp}E2&w9EkQ~}o-~y$>bAY#D#MNqev?L6o??E|yoT21dwQ>X7ck7M zRva^9?cw4e#vbU#JzsNN|;aaHVikuZY%)*n`Nn0o% zEp=utZ{ob^crPBFhJVtMpXp5?okFy5~g z-t1mRtWLQu`EC>I6GchdXl>{hpO>xCzMWQ4r-DJJ@&KDgw7slx00a60Or4dR2e5T+ zNBn~^*&M-xA9L}VQYWjn;RI_3(gzi1afN;QRh^xj3iKwnk4rk#%ZDpOcdzs)ui>Ux zsX0YQ(AH2XZNi+Alj&o3Gn-`gTwWUbVGTCuTdc#nZZ)^lt|jMgkR;9KXpz5JY{#@~ zcUVtuSC?p%HE;XPmHit$$Se2mI80BMZ5k{!t;mZ8pYES0$BsAlR>wL6>WlTc7wb=P ziEdsh-d^N9f$Pr?@?-5@m}7+N@3A#mA3_|iA+XLkGptYBZR38_Rg=>WdRe!$t~>(H z1HYoA-}^lN7H}%B9Qxt3T-x)xaWQjZRo!uP?LnMIIkvYjlm4pexQ7jtU(&fZ#RTb6T4ueo)v^E>f@OOE*NWG-+;JeH~sS5v2`X! z?qX=353`9clPFFVWWD|cr&+vKbcB>i^&8bf5von~cX}!*)zGHc8rrSn1b&2-tTYmh zT>L~=rFF5!yqq6RMo6sWPD1&=Z39^OxWV0s^-;n77IZ-l5*+tpytC5~@u46GrY*u0 zlVl)f;$=m;fb*C(BX#EjAx1$)X~hvJM!h7u%r-F)y3k?SFZyJQbrHoR<)~PShe?BX z)=38eo!SI>2Yk7yT*5(vG{sOyd+h?vzaUV7Kb+{Y8XryQ$i7^O#`w7iN!#^k(u9(3 zrs&9uID>JLp*q0&16|Oi5r5yKJ2nEo6%7Lg=|@K)>>rGlxZL%% z*A8%?YE0BjhZTmBV-PICxpp7{Shr;^y6(r+8PS z5U{xod_!n_T$B^+Jtnb?G#XPx*CI+PYy-~}7PB#1C1e}Pcy-9-la-0Jl!p2cqe>g( zGE13gsUwrP=;ABS0@7x9_w6pr2cu^g>_#7qdzEQ_ z@m+rW?EV`A_lYOtfZpWUbvwIu=2bfTRTb8A1?JkVZ91%D1~T`@=S*lUokM3mxE^-4 z5185pq#4gdBmBOXNk0-!W*my=2431QmUWktC>8;RB0TyK_vGEN;*aNa9yyxs%@lZgS;1#(XZm#&fx7Q%HqXJ|*$to)X0t zYIb4S+viI8MIbj5H9PSo)xv0Fy)54>kU2)5jmWQ2$%nY7cx9__C*?Ym^;0?y4Y+PP=6ybPQIs_ao~o**w5J(PjklI(|H@1BN|?6Y-#nJ zltvQ!#hyNx)NFA9nk#I!g{{ijgJjB#)Kdg%w8oW#30rXZ%E3zq=}svQlBjvg)pUKy zA7|?FVh>Abg(+$-Q^iDP24rOx94*5Y-3$sU}$StV9q1@Kl z=bt1?JsMhHF^!IYW7N8h+*CI*H5}9%lCPv%b&^}FpxtUkQ0t7^$@h$dkgIbC*L!XYPk}E@mNz z?Uhg;Gp;|k_Nz=5+`n$AVK_E~!msP>UDJVPQE$qR^yX-eTNmtj?fls;+BEv@$GChqRaJ1YnprVa8~Y* z0~8vDXXX7%)xj_Cdy5;0qr?8Qc3RaSo?Rv_%+D5(4;CvN>1MzUP6=*~ZJO`|=|FD5z_XOq2l9xYS(nD=g5oHk zg*7;RMpB>4l9T3GC!=PwXTkbw)^5m|A`h@fNR$pj*}4w%9Ns7svk43OD87p^x@ucK zFps@-Zz&mm?8%vdkQ*S+TXDcx1RyrGOHSgaMCH5@v>YlxY$F>g>rCV?-TDF^wg7#_ z5GSrZ9Pr_4Cfz1b1*GHRaVS^={Q7A|zb@nr&tC}CPaq?Pp?IiHRd8YlUMBjCa@Nlr=g_&dp+ z3s#QLpEU*%G}{3rm!^vkUFrENvfgSvHTb~9Y9@PWtuMi~g;OT@2}B>Yu31m$`d&2iUFq=v&E z6Gp{1k_Cf`;o;zkrKYgL4N8vf`(`@EI*I}cWk!{eLP!{Tz!uWH8ImA~hSwF}2dn2D zT*7~qUm_LzLdZHmp&h!}4eu?2i4QIUg zvltb!AjEnIyEGY75ekQ~ea5_;lzpn6jX|%g}yhJ`_Uu>1`K#0R; zfza`jWMYx&Yu$@WH28-V9YzqvQabx&N*rL#ABpi2!{~5!v^^j2+#kpcObf_f=-nR% zFIQa7svZ|BgOYY;Ri#$Wy*4s&BCl#ExV>I%>ye%IuRAl=1zz1CaNeBWuUs?S9Jn6# zXx>XaqUVReA8+>_f)0%kt2}<7P5AnAGV`P%$J z`r+(gcJ2P14M%H&d8@UxGU(v?a*t`vKMH>L!ujTV01DK);!Z@zlq%Zl&@-|MS_y?J zT1Xk?E*C>X#cLC2tC=CFn-|ym_rB{R>11Ly4tLh})yz&VY;11Tmvp4qUNx(m)3Fg1 zgUt)&gn8l<{6V$rt;ff`o71;T8?I2~uXPO%MYpe{qKq#N4?A!3$!qD@Mx%Q#TQ|gc z8|gZsw-2W_Kb*+UpK*P^?zU!Nc5-qZ+5V2?&Ro~hj^-;lX=2CO<+c1?k+81^M3c(#LZ;}#<<7b;gc+|} zBz;O&yu3E%W$NH7>RKzQ9w(5HrIi3BZYTnm_J8-039xG%xYhK98 zxpQJYsn`e=i%K;hOx3Vy-a3&;0u7p|f+#FbAJj@OZ(NpGI8yQM@f_Z||aB!P{c#4yWzLh_RqpJwnd&$Oe7$b3WkQ#b?qUTIw0 zVIR^;k(H}hvvE+Kn1Kqhg6JffX@VGRVx3q%4$3!x-}WVnZk+4s=hD)RS?QfVBWHPH-7ey&Xc5fe|k}GG+PBJ?h&KIy(gm*43$gFTW z6NH6v#`epc$5q4;P{tOZo@WF*%x@Xd+2LJ8v*I`u>wO1yKkYg&Psp5~YUG<~$tK|} zM#vi$cZ_m5yZYUI9fJa^41S%nsGL#hGbwHYUTb0!icwsFoZP0c7-k$|44Xlu#qly3 zQa;+(@w(tx);SYSmCdhsAd>OOrmu-po$hsded{xbWm-GCB!u-J0< z7RphW4b0XepAt(rzuPc39CHHqTLl*h>Rz28-8pfy1u&{@O&Q3?&u>sv+t@^jkqZ;8 z=-e3!a?r{R)^@u~(SrPA^w5(3D#-}eG`XOg*ROnF9@wusiF^gCF zN>9WuW7jZXDvQKL6_4R?_?I3`OMy>bdf2b;J4~Wp#uie;++1(3Z*e7d`pFpSt4zhkA>zhkA>zhkA>zhkCy%~hnD^?hnD^?hnC?lhnC?lhxVhQ_Yaqr;qUb|ajE&O ztsD%kKA!gPKh%9~?e_9TX|AU5;FtjpuFu|o|q5rS?ZC-8IZbb;L z{e;{G1Qt_zl8cr2W2xYNB|X|=1y-&uLelIpN?bzqx2GGO?5db(5D^2ZC9pL=mr6HR zz}pIr<962E$IA`+E`r;x*)e%OI3s^%%?ytxiFUMguLD`V@~e*g+{6r-P??fT_bttg zS6NqWyEraco#5#ONKu^4lU4m#m63LqoBf2OG`a7=n{8}bGCcv7Xp^&pXIP`l*&%l0 z!E*NquP%0X$BZc0COte*)^zv&RRWN;soe(q9#>w?4>YXrG|iYE8EvD)yZy?|cTv`9 zUoHSh$cXIe1~g6-hER(Lh4$ri7#b8FlR7isIeYMCI-9U;FM1!CpgQ+*=mFZK^^JH* zwa=!52WjO&2n}*nsn{f9O&k+MJC_Xx6|^;5WW%4#-tVWb?l-SQOfSuCMEyq?;a@Pb z5MMTOOq+hO)jNKy{%OFF7~gToyOdkRX;V}VjXLaPuC1bl(KCN*^yu2DX&I+e4H0Y7 zUh?5xnr*!4p>i6=U<9huaMn{MmUB#6oJcl7?dZtX6yN+_#D%INs0qmm*qe2R>QNK@F z{ppq|8Xr(HSauAI2blpmGWGgP;zauZhk8THeW*bB6}}r%u`PLBx=BFdaoF)ts;*OW zGVUAwTjMt^5L?e52oh`Kl>}rjo8QOQn;rRkoLBU~1~QWCPpHgs)Wu125&v4_G?2V_LDHdB>Q~lYyon+|lLl*- zRU(?+wPV_fIfL&Q*P;u@wgh|q)`<-olRF+b%Ui}AAR`BenIMB7+guLw+zdRwE?kjp ze9q%ULrAY92lUR!k9pmsL!LS+Vpj_dEs7G8TE|&Y0G?eWW=F80^)Ea(EFD}Rz!v~? znZG!aiBDLbY;h!%=IGN1dI?P+Zo`*v+{mB&`jJYcE0Vy;f{*eQw!L_}U)OU}Il|e5 z7@VNyQ#lTsDX|EL>~kD4>?@cf8CDihVT}t7Xj?76p)%JXjZ6Ikzqv+kSW$0^PAO*F zY+>Ha3YLk89ghPLmX+A!-LO1t>*tk6il?b6v@D^x&srk`AWkpH08HjM$|4jyyhz$!c@OJ-@iG%dl zR0IzHdv91!(9ar*J)wxA?;s{ zWPJL8$k;{m3}Z&qV9cJiWG$0eV-z)5lxsvo(LxP3=~Q$I!!U)0xweBt=duiFTx)KD z%XlodqB8e>_dp+lEIR{#N;gV)n=MVQ^80O|X=o*<{5^hXr}9BmAilinN5c;jkMS^W zy7gT7){$q8R;|0QPnr$(7|jmG?P~kO(z8@!mq{lfOta0-F0VBmzOVd5n}(IEOouLNlZ%uZZor;cx3Uh{*`#U}JEA zA;utr^TJOgxU9-ZBt^Hr%7$;q-M(pGq+d4bZ`%J3$SDyH)TAIOf2#Rp^ZFICSD_}2 z;;RdhId=ISdP&vU#soUVHOrT7Ht(4HbFYVa^q0#&!t z{)4zCQ;av^wDvFI14Xpdnna7XsAIo=O`-Mf#GvMWh?en_%lOG<`s6Zwa+yB4ABmZN+!xa)m+6zs z^jB)oGJSGCyq>?uee#$;dCZ?Y=1(5;Cy)7)$Nb4-{^WhwN&nz5fAW|=c^{P(f8Wn1 zkL8oc^3V77m-nA#)89S+Guia1CjY%``UC#|kxg_=|1GU`sxEH7A_U)YqP!`B#gcJP z@Ud*2lj3(NO!eYl-$}refr#QCrhKE@t|~XM$Gm&=NqPE2t`?r~W8tP?Ztf+eJH6w= zKuFG|-fW$&j?1GV@rEFH<7y3aOmdQW*;v`7xhA#V-&U4WHzv5!-#qR{OB=s1PwvLz z_aH%(NEzOxA^axNe-MxDd8^Xq>R=b$Pa`EHlHL!;CGu|#CkXXNfDJ<5PT|u?R(mRh zwSH41bGCQ7I!D;@ZSu zYw9RXN5bg5_O_u3n58JKU7Gnwupy`{H}>aw*YO0Ztl=G{xUs=hnF2n)%VbHggd_82 zUv&5P(AMf2#G#Tos+oDSRtQR0ut`1>`)PXGTI0+KABeEJx>2l-z0|fk@sCfeADk`y zx-1+;^1zf3?s3EPuL3~bR&j&t=L~kB3kD*f62*k$MNXJ2)|3XjG>TInOiLorQP_OR z#9|4>fz;5ytsd_3L8GTW!@Xg$py&ucq zG(^40@WG6x*0x}Hx2=c0(RRKJ{=M+z0;H*6WGE0FqQ7sH)EXBJJJx>ps6x=$;lOAc zm7a{G7zOa#xYVjHnY&#Udxj7_(3y~5BqiTSa3B-((n%-WVx@A&SHF71$z@t5EpYGjjLYwBA=mZd@Uku&g(oR8Y}SB^>KAum(I& z*@lmFtHVhSaI2f&o{el9$*v=+2F;Y~7=vu#CGqi&p`^y>Vswl#LbmB;T~n-oz^b_)|zB&4mIrGRKzB-YytemT)pf!=`-0 zEZ*JLrKbbvizbcg#qCP;$7I+6HrV}%%|AdAP7_4_91lzgC?q{`3%VncDiRN-Iujfd zADPv(?;wA!=jOp2IlI~=sig|5u6UI~K15HRZP$9X=%o5iuVbno4e#K66UzUcG?#-$ z9*QjIt127fDyr(n`eIv~1?Qn-LWH%r`pE*lI<)#)GZ#n#uD0WYQ^tD$6_62nQSYd0B37w#wXAP^@uofCZJXcx)HNJ zAk#6SiUEkwlli5&)@66-ZwP73D0HUQG$<(~(dOlV+TU~5$|%`8>w2!tWP4IFLIpEU zSAE=f_=|M<3|gW1iy@4oVStKgDSGhWWF@ftw>ODF0}Y+{Nc$?_BL3|FpBv5=>#RTH}m2oj9#Ua@4FQA22HR*8UkV7&JQ zPXgD_bzMrTQe$ZglWd1!xQv2o4=#YzZx$^q=cn&Vbd{P~Nh;!T(E>bV{&o>lL(+=N zF}VCRr#*XdQ3<{(F3r*yn>-4k!oc;{CGIHp;_se!EjPY6IoC01xrkSEGvtva!(3tJ z0>gby8TYEI4TWucvx3c(SJtMdfGuz)fpzFk*zHe;)wOieXL6CZL?DScM-i<>5FH?T zQu)MAw`STvHU8V+Ri{jvWh&@`+zBP<)n+GN5x9c|!mdCJ$RcpgK@ZK{|0qIF6?Gt3sA_keBK{A8D`(He66u z1qn;;{yM{b&wL_=JE~-|d(C`bnf{!lyrn-z9OKZ5{e$8V3P0k_`Dcb!jS=p0Uy4~x zPW&YoqlRjkdkpc5p&Qd1|w*+X8AE)gnw}p$IBBxL4(BT#HwhonE6ee&e zC7#+F5-^%6{tTYSC%{w=^*Ji1f>aBOxuaqCF@4JFo}!hSkF7WZEt%@tX71o5o$nXN zuR)DCZUj;iT!py_z!yG9BC}BTz#HAIW2ZyG7wqvY=@@OWrML!9x09X=)B$PLt~Rt; z1(p^80*$CvB)}TDH?12BR@cAHxo=&EX%5&!EBI_`ySrsq>sfD^-WjzGFrL*!H#R5b z%UqtkuOJr|o&CaoZQec;z|GF8lFyqhc+LNwb#gRMMeQ)Tv~`p3aazM6ow)=L%^*uQ z_M_L&*3s&7R`&l6I&6^U+%-}X1gXTFjb9;<9LvIHd7V6!I8mbGxS3xk^G1_%mVaC> zp{9I(*Px}C)m(fzIDU#f7|069HFcJ1g+E|U(on=}kfsNfa6$G6!Ph6FhLBTSH*jnt z^NTXKZM~w>`gnNWgPbwkgM9L(Ia7(t>dU*zcbW))S$6Np7H#-eGFc?m?p*t`L# zV&>l&63%o`AZKvrK9=57kHoMvz0v{2kXD;hyw*%9Z>_SuZf|4n4HSNb&>eDUUB(|6 zrH{82P)tLQNeDo~>Q4VaoG~PLilQjDDz>y@o(i#nhz-sNUmu_yv4+yLBZinPDb-8I zybx2glFgiqo_=4^1l77w7#maJw6~SWA@m{?iwe>3%YvO~+pHM>*osqH-hp`|kVUs{ zlgS~}ClnLtl7cT*voieFkQrz8Fu2*r_htUJk5Bworf1Hh^u!i&cKs4IPg3$@URH2~ z2{C^Uk1fFd@M9E~%QW$X`MpwN*~t!pPGpuVtiAlL4e}i2cu;Lt5P;<_Urih|W-gD-_ztu;u;H-+;{%MwqT`etSc|5YQKEJ`B-x|}Vbi82&; zp&_kck7jncxUrF$Trzmx%MASc(4gz23Sbs4uaIxxn4Z1fA7Uv9Slqm-HNi<1$ew)i5+kv zgvJ*nwl%wlAHFJDaXG(DB~h=cl&DJb^V`}Sj;a3Qol6@FGnpJWMz)&)BfTto^KzQH zwUxSM`{MF&JRAehtZYWkY9bsEn$M<950_n&)!9XLjq*7BoHQrWJ-!k*{~7{x7EV^$ z#KNnayYnLmXGee)0V{l<+V@bM3Cr*x0r@v!jFw+WJj^17ni3Z+i`ADJ5QfEHfq|IY zApYKmr}ru?r0p+UqFxq^bokr0dVO9;S>GC|7Hj|w_rTt@Wu*tv_vv)rT-=>$orDX+b?EbmN=cMDZ@@9F3+#n0Oe>BY|(xw|9&iM3*EIPBMB1=xt`Ep zhq2wvBs38kveh(n2y4h}wtn$S6?FP(ihUAk4FS&8CdE;4dyOI98`SEGLrpp6cR4<_ z2w)Wkk}Rb#Ub_i9mv*$ed+WLtB@(5w8A*A5&FYM^qS}w?SOvH8eByQ!+g7b9drJ(B zLRxdjnXvl!xZhSceDx-AXR=7fstFs*?z&9L1z z3v&ukzrfOe3CfdwxhH%Oo1JxNXcCnC3EsgYp|^%B7ikX!%bQ}Hu#loM=^ zN9S@gMzSO;_R8MF0FR^_j_Wu>bAETm<0zz6I++=ne;_rr=aE-DdH$09`-ySr4}EsP zEO0Eq757Gw)y|L(KHI27(-YRIfi>$1aNq+D94dAOC@l_HUG=`$)e0-Tv!8(9!;N8|Y~N`WbYze`6RO z?cZ=jNBcKQ($W2s_u0~Ya_K&~be~+hPcGdjm+q5G_pj0NFZqAubI{TK-=gIo@IT+k z|1Db5(fzmdP`j$SeX0nu=Y8eoH$_3qCn5fZJ3JI=C!-(q>ZHEFKg0>CjMZ>eLtO>7Zx#x8uu?u)myFX}asLtQIo9X_4X+ zBXN|s!M>$>wW+OYv}Jm((IwINBo?Sj%Ex!yY+EyM{`0o)_4-!6B$8JnP04wwqd~kMq(HoCcjs_Sy;X8+y#z^+^TNu=nfn-zfOraQ zF7CCYgba0NLhg_#3dKDW_8+vSD0$kQ_?tGbDZ8YfTOBn|y!8pHCLl^p5lS*qFJ2qP zjmMSX9o_myR;Qyz)Pj^?I0z*}ioH^FG0`y`H?k+He&LRcd9W- zwYV*k3}XsA{bWPIyEb;k5slfb?#pAr9ts0MCKPn4_k z_3;%V#fFKJGf4z@&sxztZv|o8@SOQ_=)&`jbQc^7<#}&yC6i#d#Ni;Qx*xEmWujL= z3~Yjj&A}-Uj4x0Hy*3gjquNqetO{_^k_UI~(8e)$wUdYw_e8`Q(F&&!Smx<#kXF0{NE!g){cri#4Ag@t>H7!?he^%q-S!r~RN&C+vjt1nd+ub-)D7740tmrf%53QBdX9 zIc#aR3U?ziJSB|_@jDe>>udIt&y4gP?WXQeV0Mi(hev2K{b^vjL8R1tv8PucCsb{2 zBVm@|uWgVf7pEXDwPays9d0b?cZb2>Bn2qce{S0N5|b9BLHPB0>NU8vd!Wk=2jYBd z4F{hUC>)xE@G{!v7YqK@*APSrP{7w09Q^#%h%xUzF`~&VAX1^V&2|z87)yhCy$80? zgHrrxs8Hp5RUYH9x+*$N|IRE0lEgCGb(kufvJB+9gVGU1NRoM1TVmXUx6L3?m#DJX z5Kk?@6dlb)a%E57E(QYoPH)zvvOCumQf73e-yT7S92w{pmo_8_MrnSw++xRYIwSrO zNGq0MYfGTn$dSixx6w!88QH!tXkV%@M zF6W`rG{Av64uE}1qqgCmq`&hSTEQr4Y#ISshg>ZuL>Rgij!vj1fdpW%(c@M&)sf?ESUZqLY8s zA%|r9p-_m=Fq96ur5ExFSY{kGy5Mp)xS+3aluE4Xxs-gvFecy8vE1^c(@jBu9L23M zW@7%qdIE7)NV|42NhOPQR=7}PX^c_@A;yFZl#z_Mo_;TKGg)ivQK@ef8L(bpdUrc| zeXVZus5^{{m{uqVng4W#`Ah9<`)|{QJ}9UHs;QR5ZE{9nsMIR*j5ojaNSiMXkBgvxQJTruPzDYr05hh$W6gC&_wt-o~)W=19#B;G{GcH#In1SPNfZ? z8|h}ZBvC=?lZj8}1Oz>h13x`5&$AO(3uLva79pK%)(UkxS}xuBbOCsrGoF zn?|U#mKM8ET8y$v zUHd44tsY|&=1(6@-vM9vDLWAoyc6|!?504_>enjC7wbeoQ-K-lHfqhbhk27awcxt4 zYlXFRIHB-LD5>yd`2-m!HVCRlqeZEL9-pc8UdI*f7Vi?%GJOwOgq|}mfHd@bLN4?{ zvM8xz4YwlAVuk}=e?r7AE?OU{PR!!7-f(@{w1_EOu9%>h0)8(M*Qcp>xT}VJtUwWY z(tgmX(BLy#QngxI)bn||`xu3@2fQP4S-DSJ!wv9{I`4 zwkN>lv>k>Jk}}wl?7(&d948eODOD&vglj7ml{UL_-UjN_v9M)T52H|J!5D0VD-v4s zTHp>FlIWkTxTNrfeY=3XPjl-Pf?4+2aOuX@@ARqBJ5X3g8=L!#D=8#XNPq$rR$U;u zlHh(a2^ldIypV_XE!hbQ(K$X1D4^#Gz*0JsNL^;r6&$MHHXuPoW+|6VW-|^N@P;P^ z3=CLc35^frD<%FD&D3CtUktNbFpY%e{|YEMbQ72h4i1Yjs8=%eWuOmKGSA&pJ}uIoR0cbkpDBC z_L+YB_oLc>kpFp)|2LubF_!A z!aBp(Qp`qXE8&wmh247z@j?bw`awj-Zszi@fzlyS@U?t*Zhg277N%ef%V7|~?{1Qa z4q^u|LxYHBm*X|}9f$lz`t2lnSR#FUG~Q5@$&Y%CcINQ+`{*zrXdf!5BXa!lk}utk z1T>fEX4&?I%wXP57Gx1jQ1Td>Z2j|2qt18^cZ<_rWRzFf3{o~?F$M%W49(_s^pEe>Rsrb6 zxaz6gfLJlzoHjP}CVXi%nkDEN%%9R-NB5m6hG;DKZt8fxH2u`yP_Mc1yRm@iCe_G9 zQj-CtNwR0LVSRr**!&n8kwe8rR#}5KA0Gap0I&yBMi74eXQxF+i9sxoWri$41u>xnsv!1_}?y{ne@ zkpN~u<*_9F3E((dRO~eH1QSp9EJ3M`CodvhdXIF@mT>4M{{_g+HNJBv{C6m5L>$&v zMHk{p9H-`TmFeFcjn&xhl*$$SgXY8h2FwnQ6B4XxHo%YFKS_CJW54Q*<>w0Sm@=$0 zo7P?p;AK8{ot;)-YF=_wipihz6t!(|O-~G8OAhdRY1a$m*@V21OnME3<}nXI9KJ@} z6K(OPaBXbaIqNM^gJ2|p(qm}Rszi?R`|3N8rC^d+iG_qsd7Q-&MfSdQ1J2qIk_ENp zC<>w^I&jSq1qzC{dY-tnyI)UGOIWJmOZK*Ib<}ukPA!Bcl>7gUhHtXP{*^|5l;=4KUdTH_3ss;B|bUF;tCKR4kBXLHE^5&FrikV7~NNQvINv zND<<2*@=tkK4DmN3GtYHzna{qf)8&@{bTa@YlCUj=&EcGdVuP1xS?Dmme|AB+mf@V zwi2G$f{fX{GST#`N`+Wf@}0$c5tXAVMlaX~Myzhx5wvSN$`l#bI@#(`?&RiY!yW_p zC=-5b@|EWW|5Z!LAL}Z{XmYPgdL0wAZ=_1}d%Qo2* zSurFB)e^{3xilN+D@Gf?+U^00NZr(%i~98!!{j1;ieY^q0Z{ycVV_u~bFJ~diUe^I zFR);y{Sr2jNt32uIT$0LLmu{X!L4o=i93`5Xs5`x++vfzk$e`3j%p|o@kmR|V>4gS z673pyaCUKX)Z#u?!UqfG+fzQ!}^&skB8H~=9RTGjih2^#7RzVfs z_r*7&&75L_nR`Lz_{p=!FEYcbb=~8vWsMx zTWktbsu8Xx0*d1U5y1}70Ci*0mjE6{oa;2AkO%Zzg@TNdLWL$Rv*hD89{!bCk$nNX z5Eo(;GArSJ^b*`iu0TXzm~aSvpuF%w<8llF9dEIK38@^orHd)O`*mehzG`&fWehVZ z({HpDeWJLPdf2&r;+Rb(W)omEhvs-uVx%mXEqGuy=2zpS2qcy~(cKAR@k3-d;$iI*|w|8wryLd z_sqM`>>cyXoG;G5d?F(wrp6OJ!f^sHD#=Z<1K8w4E!r z!&}EN&>5W2Y_GSMh0U#shHe|7*Il|d=#eSYE=iC(Dxal@3G-d5QAWEZ1Nq&TTU)60 zlWwnhJ6K5pQT)=`)CYuXZ|i=YL|Vl=Jwtt#JmG%gZrR=S8)B*PW)&tO`Vj67zwX6w zU~!l_`l#EXNg_0 z*G|Ve73Ls-o)hwT-vK5aiSvpUWQpqveew|WL=)Pc+-pdDk=5CIu0ei@w}{2x7NZG9&VS3wtE1Q4AG~i9a0w-imfnFiQUl+F`J)eLtrZaBY$H_*5!f~D zNa(-?e}mt9Uq`Guq5Qg7*PkJsJNP5=X!}ns{)V-GN)Eb2>f4B~(`Z@9eBe*OvKfS}Kq%@ca~V6;E;$9|^7+s=P+k=T z%m0oc|08$$&v*R)YX<+5Lj4;|@t*+kztrHrcFO;Vu>KEB@gF(VfBxV9jVb=-{9OO7 z+f}8hqq0AY?02kDMvahIu{X9+oOpLsYcgQghr3=p^_x@-S_guxS=1#k!N9-$mqb6a zHe<&-Al}PvlW*I_pKqh%w)OcdqT`zYLt^_I6;lC|Tr9t9XpLnK#&j?xtmfx)mjB27 z0l<+N=dp6s?KVZnw1S6*LA$7fI`)gG+!PjmBFL9rO;{ZL)z0%6?&w_ck=shKS68rd#adt^)` zQDBw2t9XsDAtPQ!{Z+eclp%&QtX?Q89=Vhg2jK-k^*{?MTf=|?hGB*pP{nIn7Ol`)S6_pf9nLx>ej zFl1Lu$ht+NN-mVO1o-H6)FYVPn&`<=%&}4b(K{Su+hkKM)$N)jZXzMIw8?tAKaKtN zR}>{#oznit!pEmk{0$pKBrBT+VMr|GRt13&4eLZ=LOqI^Zn{YwYMXW&_T@RTW!4P^ zVfVza+8nP=F%{lBx#^bp9>xV3OGI=!=3@FxEnO>oH1I6FDsx2Xkrc+c5SEi6P;RzZ zf?kALlqtWA`$QWN2*KU+K@nBl>hL}uT2O!kRK;si2^o+Z&ub_eUQZu5 zfpq~OJs69K#z z5cRW~6}@>S=Z!Aq0bN7M>Y(06P>gScgW`qj(3hJo>g|*2mN_Ok!nzn%>)-q~sJ%j< z{Qz>07i60hbXlo73=gkNXk2307Z7@b3;1JLh9?Ufkb%$W(oURMp}sTX?07#*ZuP!lUe7}%I1ije?nq6IYA{r6FTv z=1aj}ODutxlWVt@M`8Fj>wWZK$-o^TMSF9K5gp)96wXQuCF8qQ(9S?L=mm7( zhsX6xjT?N?G1X2C^~Gp{j6BM?F{2e5CZ?Nl&h0v*p6Rl!+v!AkZvA9{wqzTE8cmqs z_NK@lMC}cEg;g{tY}TfkEl7=@2VX@Wc#;EBAW#pOhb`>E#YssFI&gAafGkLN49T3& zj0LDo%Lsc-X%B1|el6Dlo|d)?*bq@lrJtbPhFM&>7X5s=Hb>SZ37q`5R2p1s1Ygg! zg(qeD>>dnVI1z6TK@eE>FxUR8}>Ia5;5&y zTub4vhd%A;2A%KBiis;)c^K6wX_qgQ3tZ_TN@ys6FV=`2SBbXWl-#)o?j9&p$f~H_JCOc~M^8A6Z10!Fz ziTtA+8h1^Q;d@GHDNmX*^pmE?r`F%vq*$ zAHq^=4-ANoZYSFit5<=P;pSI-Lw6V5gvZRc|QH4pxFp`2ZuOpR=Rcw{$e z>)5YzBl}I)+!VnrP}j8M8WQ--W!s=z&T-S%uH+Uf+72O6%VR z4{hkhIRD=Mjvor}@^W&l*Ud(`JsTM7xuwbM&WiMCPapDW&m02jhJCbZ5`Fu%zxeBL z3~d%2=Td48++Ekc4cYYS*Ezno$VI8Xa`58LIW~nvuiHf zCS?)V#I+?oD?)mb{QZ61q9gi=C{JqRM$C_-K$Dzo1!JfFfPwHsD9MUNxvhkL>xJji zKg({fSyAY=9pmL>UWp|*9ZON|$_)!V*-p$D(6p3^$y^$N%0zNcd<+~WG7auG)?pX! zS~)fIL6V*s)ywbPdfP;dTZnaIGDR~$BI2g`HqVwh*ep$2W)zIlz|(m#6;2T1g=X5y z?oaORcBc*1Plu%-{9My#?d6ePdgd8g&^YwF*u!eBUo5uwKTI9vtao==OU$%>IxD(& zFwA9AcA#E-b1;35v970yEwL`7wTRX{mz1c!yHUEQU6#MWLpW`~;>*>an! zZslp|&91C}Fl=ZsE{$S)p+J^qNdzuM9@g2_F$0-RB!kJpziao}nbmF&;|mhm1~jnw znWRS=q6Zk`j|N>5NsF|b@B}juVrKQHAEg?$Ow9%jm(RS%A}&ecIRgDo4!Ea>$nPfM zCj@KNxkz7Hj4Q2>KCe;FaIy(&liedkwrc$iHD0qw*I$U0#grsOTYT&$ZPhUj)Z)zp zn%BzW*uny}xpr5I{|M|Oc8wISplE_jAp|x{av;^)nqKKHk=Ii@ z2Jr?&08DFnH{ftZE*&MfTMKY}p<+E*eGy?fI1v5vnJm&mVdfF%|9~Pn=YG{`>(1^-Q{GmAt zY|K1E?Z`>@)G^0-S?0(FrZ@RmfvGXFQD#Se#K3yh(J*v+IJEbX7DH2XQwx_x)Ay?d zG4)Nc1S}N!;`RcD&e-6D?EMFC_q?sz-f8f`R(G8!L#!qzUkAB7Pe@-v8_%JkGYWGO zT(*4r!5>H%b~&4Ur#F{_?45JpnXG zA>rJ6x>igpf^tHjV|--^ncCF0G(I~8Y8-B|>Vjb}li69KC-GLcD&jn;f@qLL`KOH2 z;g4jq=OM0eDA6nOv<4QXi-)h)A#V7TpPkPLA{~lvxz8|SQ(=5v1%H37oCy`#>sq4z zxK@1l(RhPh9FjT;a?2hNCr=0mf-r54$ufb2#4L+YH$uu@m$zd0ORhp!H~-=X4`X=0 z5vq5<4xWUd+j2CIRc0IQvm~PfWhRZ}GK0}|CzXHx+01Z6v2K83e-?s{pQs9YhcvI( zhhu;fGTxahVFGJYGOJrhXi%edE3vtrZt~m}Hc3^U^eG5lI(>)yb0}Q!b0M)*K?uHP zRX3R%5ZE_Be`q9cn(AAubv~v`~vP3VP%9X@R{Pz=BqHl z!WF2Lg(pp!klb;iRS8s=!g0@y%+_N)lfm;21fZm%P`C+X2O9@DCACZ$tgv%PeRE+u zH5U#nTZRYiCna1v2c4j9d|`ueNTYWq4H#g>9V;z3_^_#x)+|EkF6bl+Mqt)Su-^MJ z`@X7JyiBTsov9W+&WQ<)HD zYe{)sVWhGz<;?~v@D{hr^``=DT@mCFvQZdNc*tuMuTw#6%Utb&*Vecou&Zj&O}q2T zatH&R0mzEstUs!NdN2Uyt_B&wAW)NfV^?jj8F?4=bb1sl>xd6k`lY*N9~xs zziZP{AD)^=S-h!!|JjS{md%Nc_G1k!_Y@KP{X}jX?zEv6eiRt`pkjL}ImSI@1U_}; zsUc@P_Fyd7V@~#ozbzSP z!|f&_!&A8)gaoq!hg49dFRq?xZesPCMI=0eHhZ@m_hAGS0L5{zDvda((@HNZnhti$ zvPFlv_x*ck5(|NK6cA`QjRx~V=whJj*QMLdqm`?d9T#Q~kysA%gmEN~TNpm|?kgNM zc3&3`|AIZ9=+n;9Moa!#mkZDjr%f3i2oIgn3^8@=^%lc0&IFd&$iWPtPPDLAub7U| z^&v&tH2QS>=nS$p&{%pKNk^4G#2a^FCl?DwtZDrw4CCH6UP)F6n@Phl5E30Mdpl_I zv-mJZ>CSEGfUcDu%B?Vhx%omLpL((Fg2Rz|Zg;ZZPJtKwZfCYq+=A}fZo`04A=TJcgMI@ zv@8XT&y%>*UFS9PEA-4D9^<5YP#;~1%jbO42{jd?nE06^;*#SmBKQGECQ$hfL38LqJCgRLoU@t?E_t_=MAf#@ptxy)k|lE zok5E$8c(>@boqlBuv9T$Go@yr-1W(iX##Mbf7NI4Ksp-7IO59?U+bLgjm zC`W5OA~tXuc*=uZr}(%qAai zj>#&8GIIWPEG``R;-zj&GrxRYDQE`*e2vfe94kxBuQsdgP9NLoHY)0_oaAu#{iqyW zm4}g8D+y-UCQ>gv(xSAiRL~Zxm0-~O?&ecDohO*pCN?Jo@7zV#C7=m)!~y`QOpOGZ zEe;LN5ncA)_CiyTwXHSY92gMqGo0^nPe@Z3w2W&h$PY_@JnLY^(i-yzJiZ+WiKGnm z98dO~*utQGf1F5EFfotILldv?ASd`KOzs~&mr7>g5HBuvPmWKVCA+~et~ybE*bc%! zBMRR#23;g0*hA~7+v=BGUsyAfja}s-T=g7A*Yf;i60o-olFtY?r7XAY_G2CUBFK}f z68{&R{Vz>k=6||%%>Q)e{u^iilkxq3tF-@$v;VIF;eUMjpUnS%4G7u(b`}3CXLo6x z+plvXf9Lk}6I_Z+-VjNvB5?MmwQp|9tlR7XMQ@@9TFpn&*B>qx33+{gOgT`lIvtR1 zLOhcZkN8a7bFjb?=pwxAY|i$WON`jNav}x|X^;2Wa77#tDl@SJuL5pHZVrBpt=f3; zW7A;4qv6CBDZ+2d3CK=U{1WZt%=!u|vUo8gopfMk25{nFL6b;yrRR`*-kG?0@^=xg z9Sq>CefTj4osMyReR?px@xC9vRPA+KfEAb!M+E4MD8yLDwVL~X^W@-tdXgGKNx*_( z$U@u_A``-41izl0#83Ow1`zmTIg|oeTAgJyf&)fmoj20q=;QpznnLo?rvUgc2O>8S zQdoVK+0aNx96_9MK~sMszzcUVnw(v|JYBhcd5VTMjg1rJLnqHvIx2^?__2fg@77&> z;k1>lJiMf~O_^)%h(A+RExX;KPB7A~%^JOk0tYxvh+`s!UU>r*{N6m?jEVC$4q8sw zn>!_hZ**4&Fm=Pv(~>qNU!?a`eZw!(%oSw(+D_AW8V)Z%-LZIMh$ArWH-%{eKV%9( z30{m4>l8We>Jvg{yxg@A1HRAo61_3!lR|~t?qmE|A6Qkc8u6OjpP}LUrRERmw)4fM z5is$Xga?9ZhobAL&pg#Inh|t{Yr)fJgX>^3STma^>@L)=E&;zaaYOM`+}loY;n1Oj z=}`=okp?&!Y^3&eLioHDl0Cb%$AVY?L+e3>%1qXl&wHgaR4rQ6dU2L?&RMQFi=06abwgN>K@!NhFvn~k?SVIbX3HdA?PCuKa84LhMI3BOVe&TyC-uOZSAmHJ?b22Nx?|=aC)?I z8O&k)J%>6*v&5%7F^S2Rz5^njcF8%5)gyO3ij~ICT6}WNYg8I_L3Jta@(|$S%h8{B z17rW|JF<=oI8LH{AYC{HM?(c@6!is4+4+s`c-GYpvB1%f?I`ow-K0CxcR(;)^m!|S z^KzTGjPZzvSLDpfS-a$KY?7kUq0f>m|N_f<;JakhPyxTeRXONwDCqrN60fq7j2@sC>(NNb?!gH8~a~pWm&0x2^*p5O4Wv^l!2G5N zhxyDdZ%%pLyEbQvjG<4(Gtt@Yyz$ViH*5iRE2OQyAS$FU@yu^xf~KGW`g*2M6_<~y zz;yuG#$bACH!*2~&X5>;5umtB9z;e-yTdIhQRPbw0!hcHKB4+Q)&~7;T&eh1IvQE+ zPCmCp&mRSfJl4yeuAuy{e>$Wh9!K@JkR!5~@xPXb3WClS(8csqYRYJnzRYP`@O+?M zmd?UbK`sI@85a~Q$h(IJSL;VL8bg#PQ%(M8HGZVLXVi`2tgF09=KhoZmfVz&3zn#*Q7)G@bF@Nki5_k$C<@j-h<)3qa(ln3FS$ ztl!)(kZg^zMMw^vLXnO@uIwn7;xE~Qu{2vj4HUdZJn>O1UlHOik>&99e|pOPq0{2% z7F>dX&!ey;YQ+LAkL*6qC+Fj`VqHeCnM+IcfeG_ftno;_Vf*Lit)k)nbZqfGPvF6A z%I`C{aY6mvr3uEQRegr_abo{f6dKdK9tj}Cy836g)U^8!VD`kFv5m5bMwl;P!=S*W2qMe2J0vY-*~pB}3@dVi?dfN0okpi&=(w*UI{U+$jUL5(3CADlE`s9~)f>fnqafG7jpR$t#Xbx5sF{{a*#WzlLq{DM%@kX02v0b2bO zyN-lW&NDdJt|64v#bHAPKNgh&8cnK|>^U6?d?v_EZ8MC~EecGO^KH)NUQU__JoiNJyNB1D-#mxpVl}ryRv?{ka;74Sm0|Rg4c#m0Iq=?9d_HL7} z-(08SE34Ydrv`>k>N*n-tB&T#Rd?IRwWCDh%vXlIL$1HaJdA`k3tHwTx44(ciyb+| z+!{z;i9#ACxZNaeQ^|Y07(bb+)_gT8>sh#f!Y`FI@GFkgY@BeecxYY-f@n}1X8`&r zLBh*(4;2%CY5}LzZb!3y^XTbv)rq`~?qM2W_rtrRnkp3Mw#Wz!=Ia`})rShshWXj% zjC9}(NE@8MCf?fA@kqb-Ph;Wm@|D{Uh8?`4>+{lYQ)2^;K&4na2Tj)ylC`L_u=e89 zxFF(iaY1iUAp$}+jR(b(1SW?+eR9RPxCKs7aD4t?lwYf#o>uqLFGfvr@a1&e7s_Kx zMV;y!SK~YiNSUAh924cNzJ7Udtyp1Aw+|BNM320sjN>7Z0c=F4b7mJ zaD9^W1icsj78%HIX{6rr-n3Q0{Fvb4@p`R?YI%&W<6Pm9M4B3ysaiVIlYy6hUmg#^ zw`ov0DGP#^r>cw6a`waX{r!#(p0FXH@#u47+!!GTrtD=gqvb`%`wc1Yj#$jAHQLm7 z@=bryl=WjxD`G*bG9tnHB=YK2LApe@AiPVP3h?Zo{A>AE_cXshor8xDZv;8VXqu|$ zXg|#`-XTR=Ho-*8lxa1k3J@y0fRgw6|YM(cmJis zeBAxm9D~*E?TyR!>)r);)BO15{RnXD_&Sn|k#wDmLN(b>3Svda7qnl9a&>b3o!2?z z8STA8BNAgaG@a(ia`e5 zxmL}~iSfdP8x8yS-r(xB@~La(&OMYZ#p6q}^A7RBC@K7>b$j;LAFEATUY?`$p|bKozy}Z# z&%It_gD$>=fKpXvQ(f(9UrH#lc}M0zV4=#}!f{4CxD)Ba~IY9+9Qo(3qf?{}PeE={<59Bd%?uR-%nVrih74zcb0I-r0Sc zG;Ig(ro@vu7%88Ewl;(!gJm-bqrK$^s1a*YJ|LiYL%B;-?$YjB#m|zqD1>A@dHY}( z+O;zC?Ry8FlM)A>gTaAE6h6>on-TjpCItI^f|VQ;mS@L^K=g9x0@1F+HEqz8HON@+ z@K)Ai^bRE#al5BF>&mrgo60$Zdl~QgSjfh&$R%nf0ryXk66N@8M|mA$_w~GX3{o5Y zmVeTG-}|_@KoZ{2P>i4HeQ|s>j{1E?b>x_b0tf-dN3ns9#y?7j%}5ofhTd^8u}W}V{OG2K#P$0u2!)s8+}?(oxO}s?>e><1)sRtwUKuPu zQgq@-xB1s`)`EVM18!jA_yXYQ9uB}-wM_2@BpH;^H9;2-cY}#68l~=2$6_SdpV`?W z0x%G;v058Zv`^(nOF{yx5;@p-PfqdxaQ5cWV-7*%fuJ>09tF9k>FHNeQ3vfdUWnkG zr1X{e$`F=ayHs4Z`0YfQUt}8f{-mT}#jLqMk0qm60m9U~1GgK-4eNr7Ky0Sukltk0gu+;X=s)Hy z2HVHZjC`(L`j{ zW(j|q9d_WMaZu6e%IBq=V;+Zw4$aw^VZnercv616G_k+n)Ps4mK%)u2#!^bQHoQUf5KgLJaCjR_+$eA`kbg) zuj8iA%_cITGPLMNB;60I3mpu*s%We#7iFP7(JbwxS=(p}+;t7lvyR40x??2)d$VsbmxojBY^S@G>P3nxR0Ue zsX_9ac-Ej9qy#xc-sHTXUl^p%yHqKm<`#Rt9)M-^z*zEzlL0c$sygjgKHVS5xPMD_ zhC)Fc+!ASvDUgOYP^olu+&Z23l2OoEt*(RQ@YgaMM#wKziv?6%luof!$zq_`zx9>& z_HR(f{D{uJv2xcpH<28qCzED@`Jm)SU2HGEj&02wq@ypC@VV7}{D3Ryw24VZ`r&WL zcbTw|vn7f6rc@ti)zfTkRbN%6kB^mHthPim{0@3z0 z$~NLojOW!@jb}%IVByU~d^72Izq8Ew>FO4GW)v?_iX$w~Pr72*V*QptAdEmaV4NK@ znJ}QYK7$ECDG`lwJZxy9ux&F(Mu_$&&Sx>eMKoQ>7ytW5E+doEpHc<~SLx!;k9)eu z_d7;b+Z8jNWvf$lYZ4c+(NGR(kzb#e6j6tt%)$SD9 z(k5`bIXmNSQJ%I5l;KNwjVuJ9P4=GuAU*(DNGeV}AX-*xp!XfCFRO-WeHN*UG!%dD9(<6 zF9H69>D(v(im}98*$fDDY~Vf5mV%&tK1fuAI;-muh0HRhvwf(kU9RY)BRVtuF|q~US~)C zx-uw;e^?NX~hOwHK$>5-}m5d6dkcKohAA`I9Ai6N85`5-u#o@KokfB z%wp23xUKl@NSdUemsY;a;Udvz7S)*&hX<@;gg=;g+lMl3_h zlbt0?Dv;C7&&Tui6McF+`wK&Y+|!ZL#>vORv!1gNMBMJt$1&{OUIE>HT7KH{^5qf6 z>vi##NLFF$=DFp5V0?%{pgZL>9j}Ci+zEVx+mCZZ4)XUgf!jS6hpa=D!!xf?@;O;DsFx4D)T zsJrd5P1__W$1{b9Y0^s}%;2d=NjX>RGVD<}2{g+q0# zTO2lGM&ZgC^4ib!VM3}0@hZFi(sGMkph7ZhO@#7MCvyx#bZ>T)2= zjA>52ZiSS~rTyk4Bh$+K9hjuzusKNS1f_=MR(*E4$ZZ8Sl7(q=lXCpRk~8vyjBu~l zQyTlevV#c0K?zhL3L8{u|3kuREM#ZP-$%NP5vsCaWvK7$zEm*H1^$P#13mV`E$F_2 znmY>Gx<%;$K0Qdr>{I4oE6YiXDNHEYzSdoH75lY2=KbT4qtnU821`STNtlpy!}+CI zliQiqF|XhIpa0a)01q7GMN!QcRx zW{5FbDKnJsBfBKiE5kBn?c@1*gGIVxA2QRqh4tz+Ln+6GyMg8)Sa=jM++8a~xDiS= ze(%Fw`AYuQ6I^7-LDo2YCkbd{mceD?D^5a~i83@AEN;bA;i|Us_EHP}>Gd-h%y40< zVAWCgjWL}{9|QLEI4Qj{acsHH5Tbo35#0|@*ZJ;(>US#C9k&r5lo&&DF7D+Cc*G-4 za(WC}7T*N)sutdy*&x?HlTLe_y&rNasf`5|nf-0xY6D1M!7&_Rgqk%@aF5cMf?~tg z7{rdpO*yC_Rs6L!{Fly#j&aEj5`kt`Oe?4W^2s*t0F?(^mQv+`Cx+G&!w!aF%(kjra_9M~vJz zoG>jduG)j6U)(lm;^s8G5U`GS z1lpeEbzfp*MJyk?7Lg^yl>jmpy7{fp&dA=8p#A)4)K-HaLchP{MKJYUj<9`wIIxy} z@c7hhgIhdlyM65034IAqcCx{Hg@cQIqbiT-G0Fwoz>C8JiA-St4$;{Woa~*QL-I9` zsBm7jy@$KqgF*)pkU#%HC6LhyodjdIR{_Kdwsyq|hGW$So$ko<5+~JF=-?Xhl3rL0 zE;B|!7y69V#chum!8!M^Vpq<6!yH-=<^6K8;@s{cnH;~>UsGhuV z(c#>n#Di~MYH#+6R&7~z6@VAg+vqA#{#ofI@2D#&_uU)1tw9VL?h^$Cao8>o3a)gA zRxQ^L9i1o#=XFs#Y{5ZJ3<(#sC8$<$P9->X3`AT0w&12u#TbSE)W&tktW#|^CVEW0 z#$*4xxQbVL(O%B7BEM?RUd|XhNV&J5Wp)Mylc6}qa#WPngcy4+nbD^VB&f&G8?qPg zPt_j@zByeWYzX5iHjObcuMp6jQ4;MLKfBN5`|uwiT{Gg{7Yc%h27^ zDv1bS^u|wv$bE#BmebB&&w#Wt&j75ZfkAo|Uc{YQD?EAz-O~GjH!{CA2Tu+bqD`YM zwxSP&?@E|T-m75>);uh*mmGx4Ld#PFNR0->J6D}Yj0G*gDMS0&7&4I1t{;V039wwK zC-$gL>anl-5CBW2T=8qMSeoarUnUzzKqTIhP!^t0F^fgSr^Cf|TDCkn++}y<1A>Al zkh#HSI+a`P2?GNZl>#be%X?UoU>@$bd_7CwP`r_*x?>LC%cQ|Sd=BuK!s_KZts znmDpT7mZ)E_X&T5Kwx7G8J*}xOlxss^wTp6oXtqchXkfz#$h?LBE~7<06Q-1jvScC zgy@xN{AI^vz|8@Vt91%AZy~=_$SFj7fZ2%Py%6Gy?5?J#3~t0RmXg}N(SfFKzkGRD z6cs4H{n`Hlbq-ag>R=^0DBil$xLC;lUOM{fTE}Qj?b>-ZRF895H{Q1 z-Y+ATxuI0)GdK;P!61X!9c?a965<3BDbU8yuvV}!jGWh_ytvRt1=YE}L4y7&rtuL8 zFw@$GH^?%aw2$$VABZ{Xp>3-e6-?H?<>5@=XKjO#eJ-%Xp5DjUa0g$$=q2byibn5@ z)Hy(IhXRKP=HGR!LG+k!y)R)K2lB7yoz!DIkQ4!0n;>G!RJ_UokHxkR0py1b|A2eq zIh(%BPCD2DcuCgR1aScgamt=tS32@5aZh*;_2zavjNUM%_~H=>p#eF>rff@L1a!>- z5x?ZNYi56b94*feZ7+-v_P}n_JgWj3(ilIwD+8JE=iVW8Z;Ajj$Q$J4eaYR5R9=uc zSmExx(}Nr*6g6QNEczaNZlCXK2;}*M6Jjz8zC<;|gX{pGKHv;)%TawpiX3V~|L;`( zKSqH54I*YDWMca}EX43X*UFd)*_r>&ME~>jA1d}g9|<{_S(yJDILEqxtDJjK|y(1Cxa5%N1i!g3Jy&o0UbaBg$@Sv13Ei_`1SQ?dmmkoeu(&2zm(a?@Q4&f8rf(Y{s5n=P;h1Z0# z?d-vVae><%7*T^B-ZY?=B-|v68!!>#!^0stM#p~Q#MS;Z+z0azOmqXni=YA9g|CD7 zpvB4ub_)8Sip7bC&Nqj2{e(N|w@tt&1Os!hb_fX~VqDh2;7Df!18(iY%de<}m~jc~ z^-Es#L*WGW&jbZ>0{w=69(gw>q`XLDfr1U=;R-g?S4^ktg*bx(wxBL^B;iZU211;8 zqd+=1`O)(T*%q81M_8fLU$YOa& z*?E7)&|-xx0~h z^HsMhoB$-Guf%UeLz7OjTv9gg0d>gtZXy;?w#92Bhm#DBKB@ACM0usF{wi z^L{O;O?Z+g`Zb`1Wd;fv@iq0_tmJ=q@g)IP>CYYlcXO?YeWPs$P1V*a{oLf9(z*QR7y1;_#lpbA_p=+ckos73GlxSC7Y2$8Op=Hd7p zWC!H#?hC`M!_Y8%9b@oOJ++5$^z!TDUD^{9)9%xG_5~~yh!70qAk>}bXg!&*7t*66 zaS3tSKp5i2VPI!e2cy^4vl|G96Xg0>7W@^6R~-s*1=#8R#~NW(g23)}L~l>RI-@^H z=eKae)HmUWKS>Yycit}8H{7Q=?@mvF0PwdO#R^!LdON4A>qt@V=Zv zZ{J?ulUiS_IojMaU+WSCfxnqHi>&GXU4}So+b7|mJb*^wZ$6bRN%7c>GFdg+fG;yS zqxWjFylfcm>rt@jaQkpK=A4t*1kw51DC(-)dIqAxiX8Hcq#r^#`jSh z(h5cSH&is*gV@=THO_5H>CD^{a6-I|IV~_M*4rka-fPg(4O8YWW+@(Khpj>2AO#4A zY+te4fX-`tt@Y=48I#2-wK{_QaONzm^H;|9G(^rv5bU}G@K6EDH@c%8XRy00H?)vW zSfr#5<1f6a@7UpEH$Z_PAL4~qq`D4MShW+HxPisUwq3*Xb zZo42P9PaTNIbgG)^9AP36DUe#Z)x5pxK1TubKrV1(Z-979jq06``TE!d!DjK5wL*Y zA7rW*Su3=AxMCN@^(E#V)_&{)s$fAaVx?2Q8z^WC@lMkp)7=Y9#jihohGbXnJP!5m zO3Z05GI2FKd^g*wVuFIMivb4?2+P1EsWv_hGKiA&X;>)Tf{V6m_E7F_x^;$|pXBoV zXGpCdqc_s?7I9E55&f?jw={x`OSGX9^3we;}g z+WqkyoRcD1X}-ZDzcALk)5ay4Cqv81RQJRp5PR{i=%?UOJ)&X+ovI`FRg4gnc_BA4 z`m=nv98P!v<)TXT2L$WquaATga%Srq&1v@had7ri-B{qJQtj5LR~y^uDSTtzzIXJ7 zgDRG}&Z#*Ga|Svgi_!o#$Ay{;-*VKu(*AQJ=_?U1a=*z>OS@cYg?C`2FIM7<{nakh zNJ9Ha?{hhKF$Fg9xy?4S?v7)+I=!>g!?C(~R?3Q3vo2>(#oH2#r9aNfdk-PQu`?}H z-7%gjHV*G~MX#KfQ{zajntFP2E9%`J(PhdfHoMi9*^Od%GmFqd9`TkxrZ?F_+uBZqH1%@c&3D)ZIpyG$bqW zW(~&1Pj>sJlAz4GZdG^p$HXGI&yu!YGr^#^IV9eXVlL2I?1+tH3q^^z1J`J^V}p=8 zV)bLhvw1xK^@|_eu-yTN;TaQnt3LY4*4cfMaV+?i5+$i1f*(%&u!|X8m1UMIek(c- zv5MK{xOKpK0wGmLZe|V-c1f+<4^Gxf)jlg|s%=2msfo5^NVKKQbr@8hOu~I74Uek#pq%6b0b?eERZNb*x_zYZh z?`y10+*k6$WDZMe%(`7Ajd&-8-u+vYUP71TdIaiQV*FR=(KUaYd8!+@_-yp6E1v3K^PKVEGqc4o4kI zfj#9WEFb6r!=|sJgnRKN{4fl?ekm}!d?i!d_`h=YQz+m^t3Q!OXP0|b{a!*8!wheN z8EMvYW}*=loYV@^BGc$E@zylni{tJADW-qrVmdvykX_6$qGzpDn>6s`}v>~ap*Y;O}pEtVDFeFl=HPXEOQ^tV1 za<==dTr8WPq2Yq_!>YoIsb&1%hSHLSPgu{H3SugP1>Giy12kD6nNxc1KI5&{(m+`b zaDgWDSbv1x(}XRn0G?cEQk}wpc%vJK2;5X~TA2wfb5`)eO%~~6N*wI1 za!NidILkN-JCue3T6SV}`>b`M31|~Css|CktEafT9d2MW=ax2gU|vmoGE=cLY|(tp zdi7x8JSVbJBny`f>=Ftigm{nBwoxyf&opbrS1Fzdw~z&~>cEJ=0m*zg={+WOTQs%I ztt<55N=gNr!kk(_)gJS(w=Z>oghS{{H;#PTR04p;EKt zacu*40IL2{O)IX;lJ|wQq*3eS3a57-Y-Y71A#juT4gKqak+2UujMgCj-B|(x=KO@H z?d@#VZdQi4ris#U5Ck9k3Tn9^8bkLy{K6D4oD-+^G?+@OC9dTcz<`*G~FK0#XF(8*9oT;<9PMhyJWe!ZQ&sm`cEZ!sE`tg(!kfPwmvZBtsl`FL zP+P?Tc8PVwz1sL1Ds=#oXSjor*W+5Q*>I;1lVCB4{^W^kXp57BNJTh(x1G>GYUl{JG5elZy5r{jNG7YSdKxB^uZ;V^(hFhP!?3tJ>-~fm2A_bi5g&_5?j)krm1Yu`n#g zB7WW^UWQ0nM(pJl1`|nlF|Xp{2vlVDtg_eWAI5&P9ETXdCY5+NKW}xc&dj8YYLj&e z6TkG1TDPC76;2O@%Q z-m&opw;Glo#;$Hx65I70n&vY3A?YdJ?PT+iSG<$>{4fcXk_Qh3eMM$MuW) z_?xoWTYXyHx!nAdU8I=xMv|H)oQ_-h;f2*!gh1k~@Ej${oSzI(1qFJDcq&=r2 zz3n@(g{2wgrzV^0`S|t>K`UcR7Gz~-j>7AEu`xx|YfG&q{1xy(Lmp0*E|YYDhYOhl z#XHI8;`jR@eAfp|=LPJmtq0~x)~rsmX@vEf^-IwJ&^!u@N_TAHZBBJf>&l<=W6eu) zyjU{(g|n#5p_{JG6gxI4s?Kr$0#*99-g&t*babr`(+Z!w2M-zNbAR9n7pK#9F)PK~ zH?=bGGmt0reQ^Hjzo#NaFO*>~(l@?U$C38?x}efaf2C@T?~Zr^^I#QkZ}CdLp1O>u zL;JO@UvIbS?%a7e=teL}b{mF~{NNQ`OJilgW<%lfErh5Y5 z;*IZZWpY`6_q|Og!us>|FkU~KY;$!Z-Xf{T!^(z6W*`@v%@1Os2Yd?Ke8LM(+!3>z zvsOT>Q5m_=;v2GUWH(mIxGt4dDt^DYrA#l8!M!b`I zr$wwlM#$!DFBCI#CT*BM!3ho`V6;8D}YLo~VO1K}j>NS+Iy&EFGGo*uj z#Z)AoiYjTGhQyoq`E+WD(9sGk`Dt@}SV(J5*^$c$MDgvEpN+)jDbcbrWuQ3SNvOdi z4lE;5`1(!t{xZbwFLTt2?vFnAW|uX=(QGh<#$VwYLgfyu2J{u&j90K#K35j;`J~+( z?7oesY7M?A=7h$6qH-TW~*pD}4xcZ0uuC1lCy{m;`L6Y@+hN)FL zI;DIuktaKM6O5}3k;O}C7_@kR3BHaVD|a@y2GW+DYAX47T7`=b!Q>Hf#+9%)r{M}W zOM8|=53B>xBA)Z>u!0lwezOZ0S_7mg`mfvK^$KI}TCWz3kP1KolYk-&gh2#8(ae7b z7W8+odtx2BUmCVI*RA9RgjdgK3fdRM)FpM^Y3S`G5;U3JU)O@pm-rWa zc+_!D8nwzk-D!PUXJj27{tSBwtQ0Te)`;?2cp_a@rprUqyYBXX@L_bjM~pM>nCWt& z5JoAeY%YXHcT24`fv?7i_ey$uoV;W8h|h>C7b1hmh^dPTAQ zy2<-iOiDFU^J1!Pw>kKgdvo^uc>H@|QP^wt89KtsoIq9N?-(x)#L?|im!5Hi5a?2O zN!dpVCe62^r$mjzjiaX2F#Mi`+`~oJMO-9o{jW-x63_fV7X9zWq8NHaL(N5zS*E`M zP7-lu-#WHz(1xZYC0M;)h|`|}SJ`<)wwA3T=@vInt1N?Wt^q*bO0TvDyJ9bi#PFl+ zB5YSkQ$%V?x6pG4SU6Hxc>4u)BFlYMe58{dupw} z0q(baiSG67Po$95dt0`d%c&=%&+6KreajT$CU%}OKqmls>E^12ROOZMcT$COoQ4iW zJFTksUt*Mo87ytMPIM;P1iupoSN&c>uh!mpyAO#Tbi7yDAr7cXkJ|E7cjPC+-PwB^ zOOULO41MUq5rBA}RvZ-mnQB6wGJ`gGSEV^KJ-!#Yu33}gB3Z`SQ+cb;FnKdtox=-G z3lpC$0#uEMu-m)mXm^nxg-3+9*1nGN`cR$4SfEN%cA(A+AjB=OX^@kfwovY=DNukq zWGBArB;v}MBrEZSk%9@s>bs!sW-Ac~Uk_9NV*oH`2tw~mKB$va03Kht7_8}&T6@St zVIw7kJ-m`i%?3=Zg?Zv?(t%E=Ip(SYnm#>)Fw3_st)WWZ3BSZ6tzo80C+@r`Ffic5nT1hp^2N= z3p^*^AJA8+WRdzZ(8>Q7bsB{1z!(o=O&T!0~)%F@bItO=%Xbeh5rbCd) zu??@t^PPKjGV3pieL146T(TM)9@cs33xltbyXOfP$x{;TF|c+;To$ zb6)k)r_%?tSg)dvkBu=PyS3O`Xs4|D1rE7c;0?p~i?It^w&48iR;sJAP`AoYnKQ7C zwQGt|nDHTpdh5{Nw zcJCebAY?OHo#bWP^wHsh5-L_V4=YkRW|<0>Lw3B87_vy7`I7!%@jdX`6TC$geweDr z$*3{P;Mttdy8;YAyY^QSE&k=W;t;9LLAtE(k?ITEFp&IB3TcddJ$$no%~@Esr)P|D zhbzlF9BY1J=%NvdO*!iM0KQLStj+>v;qL z*rsC>8C2C)?cTmGSbV2SNFS3{)z!=|!p}h9PB{I@DDBYsPZ;A!vo7DHxf&%M`;Kpe z1)633GFH#gJ})N)_wNJ3)m;RduyTuPqEDp7m7sCG=m(g zy7jtd`yGLHRGSi#yD3itFD6D+s}=x{&l|U<+JA>kH6y|2-Y#-$m@1#4}>Htl53HO}SI81U+Fwg|Qvvalpqs zmGJnq&-vq~QNML=JzUrPau9@eS{WsA7OA)})LcdAkE&ubB?lJMtE8?QTHRI&eQBr_44;4TNsGq_?-DVg5;FVs`fF3~gB1Sc50nSdP zL?O~rmRu7puBj-oeG6Cx6RA@f6us@eMB$VqG*+3?^1!Pe11oz1PR1N=v6^4jYzTJ! z-dLldXmpvBeR{2A#1JEXg!Ep*%sLYrbA)o7Z-5;jWZJ2Lqm7+3$rkTLuNN=EmSi#$jY-IfQ72PZGqRnUE9~brN zgzZg=${oFDD4!js#zrWDaB0*GgKF!&azOko1BS@0a8+Th$%g)q%b4or{CpHS%Mtn_ zddSRF+&=c7`Q^cMo{k=BrJglp37alL-60RgjM5^Vzr91N{^vNh0R4)_%A?F!NqfIY zy|qOQCHW;f7!l1CN}|`hhJWPkHgiS$DqPPEtmKV&4!NRfQV9QGPfCAF%xDT}ZNykV zEv7h9x5bTj^;PMv{H=3>&QCDl);Nc6*r_TY{Z{gMweN*(iTKJ94h88<2%y_{8Jzs9 zEzgGz`Zoj1|E?vH`EQHVzb5!>5@qZP=@CM1KA~<16+QFPV!c%$!iNMV3^psmRlCWa zNkpK)FymN%e0lK1msQ{dV$F6idw~3^_X+EHw zU!d~%qt~BdWSbKmbb zk~dB$c$2o5Bk+#XVH_z!<*Z3;9mo@_`dp?R+vZ>DEHydHwuiTeL~3YPKHY%KTLWme5`FHnhO!o-wO2oEmnk{^Z1>i`H2^a?RF&!$o&G3_H*|Ogo@D3`!%O4b!>GdIY@> zIN-QXU>DX!w2N~(!0?c{yxu?%8w*hXyWNg_7;r6^JHCg{GQQ^*&iy*tnb7|;a1Uiw zNFi*;vEqogPd(t!CCEqQj1}`GBJ6Pa%g``Ojb!LlW9n3UeO~ z-VVQ)%mYyS%vL>edb-@G>e>I?gy zGSmO8y7|9Mn*N_$1^;p9|HfRMfRXL5!2Ms}({9bbNz*pOze&^n*d>;MeOzJF4a{YS zns$k;tm-Le&-U>-&+v80qL_r4dOsgGKzS19B+}6wUj{$~ZR+Qz^<;~Cmi%!!Ge7*? zuUFNxAO^$agK_s9j2sLDiIk|)@!GRDK2iKpbhW_zJx)|(dghE$J{@gc?dYA4;fq-G zpMiLZT^RS27%)t!(ZHy|v1;AeTKliXx7Wqx;buK-ot`^ zJJ72J;$*Td$-R}kL3UftLVv%tX(Y1nxQ#13*3HlW#KNQ>@wg~^Ih+*E&0^Ak@{pEJ zNX1@^+%Mk|eN1+VG$2VL1{8Dgbm8nkvI!(qufz+?@ejhZe|W&68KfEixI6_<hXGiw(epiE~VJpW@O`I5l?2> z`Ez)>*+Y9oqe0JCQGCQSp$!drTGR3(9K^M7DYTNotHR3C^mjZg+zR9 zMQx#E?iteSpu;mQAeUmzO9=#x=}JBV1^iARe9fVJ*ONu(5$;rfY>Qh34!Hvw{aP?v zikk|G@T`sJ9nY977n^h~R4L?OpNJ(rM@vd6JjOP(bpY z`MVVMd!@`WOfy3;54E6B9cHRo4~BedZ;O&Tzj1)SM9I&~IIwsbNemRu;le1xEW$W1 z5`BSt*cf$ymrv!vu2xp9yN*b;yKcb?w}+$1?d*C3S@Q)Y*MA#NxoZIlHTHzxR}qz> z_mlJSrZSK2XQMcW2BOyrMmM$}hW~3|#B^_g#CQOi!+L>kHi`5JCXjU&2voVm%9IIS7Fapymk=W8PS|m1)v`7*E+I zzw)nht_wH4ujJMVxJRL^bZO8~&p+URGW9Z)rDB^a88I@&7PAeZs(3o!(S!U^`^98O zuB&FV=DTMPKKkb7vU$Y@d%s%EWGI8@4zwrO28caUwXLp`~8y$m*aW^YMkQKXKe8ve9lI^NxUv z@-)DiY+@`5D0Mxmks`2Gg*|$TBS|9WyBYZ7%tM(Vq@tLEuH`>_H7}HN#hQZ>*cYK% z1ghH4p$6(Xp8K1XT0TG{jBPoUvSGw}ij3k~`i2L<5j9>3h3^W9k@1xM83)xFnl}Q? zu7eVUkA&{1xGoI8i@3f#5$74z;sTyjJ;UDR`F-lJRRSB@XHJyKYb-WX(x_zfw`g1x z<;eQIlX$uz7LlOb0xcLbS@$~7tE(5Dn(T=uiVFhJs&|jN6WK%#k#b}}yceQ0&;+TwW>HMBu4o07|;;u7TdFAToL z&y~ck-5UVmTeJiHiV12UV7S%MSZ!_4PVv9(T6AXEtAM}DZ$iRb>_Q_64tfyuVdgJ` z;vh{VsZuGt3wg_=cMZW?p>Pf(MM49^FQWVIw{3#YQ1qPrD<@O5iHVfFqA6CT<53Wl zRg4U#NKu-BsU5cIok0x-bw&G&p9TW%TTcT%$YFw+O^Kxoe~r4kiX82HpgUYs z2knkoSXH%aODRJYZl)Dts}Xu{$s*|ZltflHA#K~AZtm^tyaKE}6Mb^qig(@jH$vsNoT&q{U3LnV6Jh!oHhzfX9I*ywMDTEd^H4w7 zkq;}3o4-m7P(-ODchVE6pd0GLZrb}Ec9fHm5Nh9|F#z5G8lAmZ-OAb6gfJB zuiDIka{inZ8;P&vxVE{>b~KzPD@`HZ`5aGLBHLaE2;rv!3`Cu&1#JPBrjw@8cjmmM zJ1$d+hB?x#H+b{^VCJvm{Y(Se@FK_AnaWJ#E~Ws8w{s`A7$a!7A-Tq*gn6k01$u%N z`<#vLb(t${-k$R>1Ya1rea<$2q=qD`EkkWTB8W)?S~lvaSYUm!2l4kYSn^?V*FSsz z3Jd34y=jB0#C432D1Ct#&&UbeykzT>;J5wCZU+-b^vK))$VwmwUZc&m ziK|SM#4}On6vWgFgLcX8G_AX-($|h zgcsS~SGU-oMfPu=JFu$L#PwAz_l!0G*-}dGDz7<;H6mW@7E_qzh0m{1~`}4mhf(uu+5zoO3O!Mm#CK&al5VelR> zHBuHH@g#0hM`txvE#EopRJ}B^$gFpt)gPzzr;%03isd#@!( z{udvD3od4w=t)3C+uG~Nd&>qbeZD|FOzM54jSEy_aci-K|Buw6BR+Md26 zK1CuKyD5p0*VxA|1+l=Bmbu%K3bayXgx;s0li42tdDCK~f5YJa>Js~34E~=O{r~R^ zWBX5U!oL&>u>Yrr;oqP3`tSO}m>B++QvNH0FKgL2EwLkg&(w~Ifrrg~Kzq5Vw8w4# zi8v}VF6*GlqeyfZqekZXo8a!N?X{I?F%g@Av3CL0Gt@AWqH%dy+>XWRc=3(B{&Ky! zY4nQqRq>2vI7mA1YJA`se2KCjx}HAvs*Nc0!|6%G&Ar5jsDT!EhL1WPwi}&|m4nL- zo>@d6{TWI5m2>H&g>$W?I`vEwnsURFovr^fS-3u#_-Ap>?e$Z_{q1GYr;UfRzxRi8 z+mGqvq)-o3W;k9F`IZ99zeB9>^Xh57RX3Ld)F9k7%Dg8T1#BweloMYkOYPM}!-XU^%!dtvCzdn+9#n4@}llEU2 zqyt+#z<-48S9lu$!rPfd!qIhbvhjjN8=<~3mk%s8Yy?kCAX{?>;A_hZII8LG0RUqV zM*Y6;*Bh${)d!ScmOQw&yEe>3x@!iqbK#$Hjt%$t5-JT{=YPOrT@RWr07&`WoNjBh z)gD6gU@0S9ke}l@B-xz?eWabMlyI%+M=9I33gB=R);rXbpFUo-=s|S43N&2IrBJR| zKT@|sFxMc`)$dH)#dn^u7kQsD6f-uJ!LP45-TVTz$dvDjwvq(K(qC$*)_y4|$2twD ziyGIah;+~2Umg3RY3nntXi#Dr3_>V^oX$el>8pnpJ!cXgUA-4*(`II7@rxo%4g+W^ zLl@nACS=~aX(YQ8TstC zXpk9l2$;QUFsncFt9J5Yl0pw2Altdbj}g%0$9m=nJ}n>Q(>IKM|duRQT*uXpY+*g$P&vZRoWJha#4rA<- zb~41&)|~@=o|_s?=_W1(&U9@c7*u{ zo8UlX1c-NrPEnhYzzX0{>2l;sKf#`6$fQfRxg`imVMIet=!_KIoG0>iz`p8TGgBW~ zU!DDn17fJf`Ky;x4hsQX0z+y^V(!?{a_W`r7d^Zhm?|621>etL{fwH%6OgaD(~16D z!dUFN12r3UU!x%{Wb2kDj8MBykuVe+!t*C3-?_Rv-+7lHd8m3%qV}<$c43GL>Bk?E&meBM%5YZ5RS>oG0=0GzA62#1#$z z!PNQ6|@&zNi+|Rqu z+m})?yZH36qiz(cN!fsD5e&ZcQn(ijW=H?N{tIPhLjY>YVvIPKsQq`IUH-_5OCUu? zCHzuv7(~tAs-g@-*oZ-MjM~S!7xzeks5_4)P=S5Hr;aTaU5mti7}ik@xLG+uT2MS| zN3p(jAM2O1{Q9gNY^;3y`}bfb5L#Hp&msYKGzD4ldqF7#%r%)%0~nfxfGA7~Arv?3 z2P`J{Fx;n13wd?93ls9H{1s60P<)Y=D!~Z&oP58HYU|HhIZGwgf2;ajj%OgY>F62c zPuQRS`h&mU^KipyHa*UshsxrVZJ z9(9{kC2J~nmvy0>m%*3*39MrVJ;``R_TG?U&f0_uS|Yz=x*}k_aLJG*&xFQB*I?Yv zilI*0Hjz-(xuFVBojRyHe!xW%yoFTM2BdB$CSIL2BLoM`iN$`L*)a}CuRxRN**!ME ztR~s_4Hvz}jkutfEx1hu_;18F62wgoY|D1g077ntDg$Re%2W@|T>E^tct>^MJQ*W) zl%-TI4yzCVszv7)3@XhN2%j|D5g3R zNi)`c)2zEsLfbocuwfJFo<`0VhuBT`B9uTS8>q_!wv=taXO=R*lr`9n_qa(d_&;(I zlFrui9#4GYrJ~O7vKb5}@t_&hRlpB5T*DO#tWO?~RHou4RJe>eo*Y-&|Sm$6swQ zDaWU22A}Z24X})({o#Kz9#9z2mh+Tb>u~8bp}s-Kci5S@VKabyYsl`}XR3(f z3b{9E-}Qa%iTqZ0QAz5EsxrwYh@$F>f;Ka;A$N&sQAm6InAnEvernQ%BDe%O z#C+y+Ic)L;w3&Xh)?8SaP|aZ%VM|KAZvSD+MyVaxoszEd<2N(ATtfH&VKdGz=b#C@ zu}eHrlH4^sDI9#o(nJK9H#)g_h~g*b=wjdwG7Xp^-?`=E&A1_jt04D%NIpgdg$BgH&g6a7r2+37Ek1Q zfPjRYL8l$*pza0ciB+|>qVDO-O1+Rje}_(1y-o(Ll84aa8Z0s=1<7Q{Ql0`N+&6Rg zl^^lMkl>VLN>UQEUS4GCBtr4!{XElqQ`N!onECU{2w`t&uM)O-^eBzAfqwmI8y4{X zbqJ5r`l`Hj5Lf)zq^_S6o11IuZ{?nF2#=2;O4BuTgITwZi-)zo0z05on8vDd!;m`= z1Jc^)=s#=OvMlTRs|co1OK2}`Hf2H@?KUe7G2?L2aB=d6IA8C{F@5@wRHbJRJ8jC% zctjo@qQ{Ee(J>8I39Bd4S>%vI>!@1rrX(C*gj^!g7b`F&)08M}0Efk-hPJi#-nZqM zob^R#e5DaerHU=>Q;fSjaEmYnhdFKo+_x~Jb&KaAHx({v@mL4ImDRUiNCpXOPt`4H z_|-}U{MFvghW=H&qEsyecwa*%SCaqNU{g9pB`E_XButJ+u_ureCPpo@62m1W_8`HS z<-A`wtH`pDX+M`B#l@nypsU=c3z2X7_YnKVT*jlwT;L@}ls!`kQAj_^glGyvu=1hI zTzW0@QPrSkT^%7+25ggi(Rk=g#fKuRdgXFZq{7ae&nhY(80K>8xSFnzZLHi%YaC38 z*)Z}Gjmj^-bZl_LWP?^V`Ira)?=g>iaS4QP7yUZYS4VYXl}*0gZ8V=@T$MsxJaJo& zXO}c}XY4z6^XpU3Wjt6~zR;SByki&sI<21%d+yE`J@fE&nSZn3`S-p#j(=Dv6bTqP z{#rgM&G)5tk9b*wVJJG4+j-=I-A2=nwuP~=Q({y|s%bh}xC145 z=f{q zDgBHlj*mVpLSJ+Fenjwnuiin#lAk<&TpK=)9=4*_s;r@kWm3eIhcv0;~0`N zcFtpL4v6ocaC^VO>z2|bh)c&+wCS9>e?Dx-u`7ZrwBfOED`7w+x{^`iWl?x+2>);i z7u1I%^HG@zF;OB@Sa34=?$Tk6kq9Qg)`l~vO!pn{HV$udyH%pD3Pnb%;D8aPU_;}Y zFppmq?g#9M7jIDgKZmpgC;I*o?idnwQfKu$1E4zjRGus%`NuR4O)s=(8^#UH`v)FJC=FQkwl!r5)m>lNQl`H@wt0hE@Cb^Pr_ zzRY_Agjx&bh4q zd9kEyg4B&It^S~drKt#hv8p};^OyQ2mlO}s`o{6lk0h?g-wjmPrQFJ{9=AzN8Tz2- zhH|Ro>h09Of$B4~=2l!xC&xKwAaulVKrna#ykP;9$QaOK6AbtJUo-g-y@xpkhltUj zSh%aGx-BuK6n1T`<8xjtvw=C})<1IOVt#n@8F3)OBdkLEB8p(;OFPaEk7u!Snfpg} zx)7vtU3RXg1Hb|P;^DJSHwUM{VqglwJw&id2Frr`iR@2A<_u(wnU?TK1;36`*MSPK zi)rqaZgY1b)58#`_wq@e>(UI6iX0w|8H{*HN+gto;Vf5I5Qf8ayp6TIf)vl3Z3=L( zktaoWjE;FDJ9E!a6l+u*7?_=~`U;zgN34lQg`6OT>Bl{b7C)p70nzXn%ATTy zUOrQ|6JcBsYQoEbk;CxP!Q@7ZMmW38IB|nSDp+U+bN1#FEm$(SVc{sOXN!9?L~k)B zz<+P(5=I2fRVg&H29dP@t*g#cZ)-l(Gm+b)E)1EM^_?d5Udo$}WN92mR`mGo*>lHh zChohO@cShRP78Mq>Y--IwzA~JpUj79=K`>U6;Hkp zX*Q7g9lbW(N&UkKaE*PTVzIhnKyjsYs|x+z-GDQNON-|CdE$%#i9-}^jn3XV0EBN^7Vq6$& zsLC8uxg^y$?>AD2%epmOKF7*%V>xO7Zu_8&mGM<)88jSbm=i$>WHH32h;fDF1N#t9 zLJK4K%1sn#YF*SC`kSy=b`sbF6xcXJ3E? z>t0fXu0dQmcpa9ZmW8mu%CT;xb}Zoftdi~2;0BF1^T1m8H)b!ZaiYRA**~25jA|BI z@26zu);i3bX;)%pR)~?*fFU64mY;FtMy}bS0T+PFcQW>ql3UYgp|m`#mmUc=|5R;m zTWuo|Z6ejTT^s4S-nV6SD$hoO!_4{!7}k!OyM{iJi#mB`+1`{n+BQ`^d4!QBfL4{9 zT1~=x!3FtI({XLHoIUxRL*dyjvNAoMQXt^it3X4t34(9J>L9Y%bq& zMCxlG(~cW%M7d?wSmmHGm4VwIQi>I?YWx-oONl$yJit^V{WDDwVH&(%cq$4~f3F;6 zuEJen-KSL2InkmalQx!8XkM{``5eEy>{5u(n{lF!JD>epy z76WNBNxx-yq#hO)JvYw;K1$c-#$uISznYos4*+pQk-ia5nRegXujb=nmF(r0PkNo@ zW}~q!mu-iMkLI+a8tFy*3JGUTHpw zqa4ZZ7TU&V>`hCMS*W9|TChk(`zuAaa@V*0&-N3cL5NhGzd0Rtn4m#1V&zf85)Y@=oKuSeYYvA6|N=k&RwP zQ%{ujccFR=aQlsXxyvb9(Q5+xfx52;8gAd`n?mIMSc5dpzJ*}-=|p~cs^>qjDq^Mg zl5nk${3F951hcE2?{aPlu+&El0b};5ujAQKc(9a=-qIA%VtgVyX!X5&e^t(S{b*rN z=k3ekE^tC}eFXb_=;^54g6)f;9*PKP74)v4zpJ-%^kjIe8#6<5&0mSMpWDjTt=N?6 z^vH395)B-;qkcgqvT#SSH0>hfj9lib?KaB_E{U7LT!9`2TL39#S&45`rNkQFW9{pS z!w&0K6m36thA&z}(aQ^gcj-*j*(E#yqw88@b}5r8;Z3{b`zO>uxY;3WAr7`+X_~Oq zK=`VSMi}`Fp_xU4T=fUahRzHzl&svHXbfqG`MvY<^A^RG=(^^(5>!E+S6p^IL5UM> zLTAdE0-V04T~-VAgvAcpddiksYsCfB;1-uloPrlP<3zz55t3cwhKiz&gv#5bbv(FqubQhp zt1^lQny*Vk%nvZZet!JF;p=~|l;ilvWkmue`hRjZ6a7Cqn~DCPoc*sH&GgT|{5JwX z|2s!B{q-;Ze{=MI-1)y10AgYNuVp3w!O<;9|K#X!3~dPA`??dpNxDSU$P>2Cju2ox5rd; zXu8yk1b4?$H;sPp7nh5lmxheVME552=_B#CySYBxooU&~clV3ye)Z@dcH~5NW{E)` z4-!OqW@V`l&_#OLGqtocwBf8DuPJChteJhck3fEYy;+|uKeHEZ2~X>gDkx#hAhxi4 z+WSSwrf+Un7jE&FwHYCdkcOC^O5=g*zcfEf_pIx1u4~>W^RStYW;(LIKgD!?+jq`A znMO3J1BJ!eKBkSappN_~?r8OHCpv7IwG&0Y3n*PP6W%w+QONdE<}Np?vhDe5FGp2W zlukY;kQiUP%quy6Qkv;$`jiy?dPY=WryXomxAt=|b9{CYMh8E}<3JN!20qwt7e6wq0ZPatf_3FIH zWY~B31&r!CFgeKzRlAuB2Xo#B=TQcPShAxGAVvMAz(qY_XB3g35a&4G$d4-N*Royk zYWQQ-Gp^a?G~i8qxD8h9X+#=|-=u3$#fXG~g|A(V_F8 zK)eO0R-1*H0UZEUb_K(9|D?tq)RSCRp3QKb)04;Y9?;I?(|;P)(`Pu?-N`4RH~SPp z;jdKzT>9E0C*BV{tapjrS^6GiOw5ZIxjaH92f!9R>TT4CTDDjqgSe0^c0cVeon^=t9UGcwkWzOAmUfMsWjXx=R6 zkEBncXZ_;hgn=`ug&a*FaQf^jEkOHkV*ud*03u!>0z=U4M}|*=1pazkG(r#q23TvK zzP$%z2N()6+1%7H5hTzxa%^$GB`~zj`Lsa5JbXut-#PXvzT_i>Y?d+-J%@v{S8>}}xTLJuAz-EB1 zY^$X*l9M$YcH3ZeI>#acj>*zsPs5tG*$1f`tDQ0p67q$yE+VCvZ4>O&x3o-LbXFSWb)?szl9_vQfc*J{3go4;{UCFA32wO3FJYhInN92Ae~owH6x zjwJaePQuw3Cy-DyA~o8!)30zFLV%A0QcYbP`#LG1 zz8!3w9eD;bI1RDVbJy{lI|$4a;X^r<6?uNV!F9pm`NP*iJ9UhL;XClBVjKOys*n?%QMUKLDt}ZTy=} z4Redti2<&PS0`5jW!0inCC zfB5)Q3OjQwkET4_kZ&7;brP_E5+ySg*n%Fx;TD`Ex;aaTHHUQw3>~7|4(;UBNqj)< zoV)=Bkj{UrEJO^R$FZ%DCOE&1lJ;#PX)i5ELw^s8;~MCIX8F_Z56xJA4Al^}0u!IiiCDL7$ zzk()!k&GDs2M>}_@NGf1-~b#A74(W7rtX;-^%F7-MZ`gDshKuKm~2+IQ;-^0)7%aB zXhDAQe5#9|Wa#&$CooVRAHl|P^ z84c^8QYWlxs2tUJJlEqc|Lrz~7Pa%@;Yfh}mLUbYs~HJ_mFu}H^#01xJ;vTh?Xv=y zo$am_eH|6`&J$0y<;pS~X!KVFHTBa-u^x_fmBq0iBi?y&rhucMDg9`Hu^8S4RCP$Y=<@u7fhE9T z`m+?NXaoXygF!lb~qHQU*} z4>;n6o)Uym4cj(4Sndmz&eT(p0%hKH*2&w7y*g$zPjOa>Q<~cdpz?Jhf~Ex}GX_hL zSCK*M0UJ{-q3aXWwdcP``6mzfv*g#l`N!h`_ziT@9hFpuiSNw-g4z8PP$8hq353tA z+UB0Dr9tH_4=&zxK@%8$kXGc44Ywi^c+>LwtcPRq^AAQH@hw`m@I9OlAcZ6AI^Wsx z1-j^@ruo1Tzo`blLR@eD=#7Yn+kgLwLnjM_f+wUib$(zIHoz}FfOyR0opZ{ji^|_8 zR*qnTFO}^Mf1$0@eHI7C#uHnvL*6CI+=j5S021kCAoL56^4t z0BOzG{ zyQ?7!WZb>x+EM#p?}l_tCQ;W*H6hatR2fg534 zY5DOx)ae;Uzd;ScbU;4IVsj=4<#;Me~LCI4sFH52_mw}+Yj zc1r&fcmKJq`(N<(pTzrriMRi!Y|UTG+y8o||5F#=-_tPvFT7RXwA~a%@Oe?Yji)St zed(DJf?jo4K(jcH1VRxH_#JN^875poa>V@gK66QJ5?`!eITOi_bDhw5l9isVg0w9v z@%VmtvOfNxwjrF=sBDEeZA(N&M5T0GuukOpH}vl4$-vc{Aze&gZ=6`pLgef7{rq|U z2+L7RH}fMrIYLK1FkFf}`e%IzvaajJ(>3_p&8*Q)?PT?k%jYA3?8leWf3uP5^Xrf2 zy~Fe7gBs&HyqLwHa0P)TK0F)yDGB7A+v-Ve)K)Hw$^rwG3UhLnMzzH~cz@!KvwG)F zE?9|-^GmhbB0k-yAW}s7kV~O%pQJn1YzhbFMOAfV?|4tSB_l5hXZw1~CMS4g;>|)~ z#t_?jS2Y=TO{8B#OPM5qh6JYG5^8~?8udM>jQX+5tEkd^vyQ3FYl0ugx*I!PEw;N_ z;GNha!d((oNm71WWhSBDBuse0`r%vF^!(Ei)q8`d0MqfZCvdzkt*S^Qd=KF!uO)Kt zls>7A=;GO#DdR9(4*|u;Z)oB)r;rIZ+ZgDzS_Eov!svW@}Vz1-&(xkT5*m$ zDn&r%ZCb>n6kEcTs;=#U3N;Ox8d*U0X)1u|e4x2ds6I$tz>mjB!Y}rWQ!(hXmtE0! zc%-gG5c!qFpcjNMSFzr^$4#Dh*m*miubRSLxKlTAKJs^#Ik~M&F?+gX{cw~~C%WdK ztrq`}#~(*Mx=Pcg1Mw7$X0hG`N?w{l`Ts%MIYkK)tXsNVUAAr8wyiGPwr$&8wr$(C zZQGi@K6locS$EAm=1V+fX6*Q5?{9A?MS!j@*qEW`d)P{)?``?PNe~WqhaJO$SHcR8 zM0Q#^FuJ0EUb?Gz+!>3gC$$_}rt0q&-(ITFY;DUl#xyLk+MfDsyh;M0E|Ji0cNSQ> z`Ziboc7Hg+Dx*Y^CU(dz&-)!~lqJ>2-1%s>+@=U0?P)Qr>$QIP-eitgI_j32lW-T*>p7BKk3b43~J{9)S#SpV; zXtNxtCO=o73a98Z{d<`oY`?j*)0IP+^Dv3Ps#DKsp0PU1>c>0cl*096-B5n- zZcd+K>*;vcHKtN6YaYzg)ugps=j0#y99o&}1c47QQTgpaAcp6Z?cYw%e~9Wo+*f!9 zz`4IIGgfv^*^e&JVRa6Bbw$WG$i)Oy2%5|Q3rwvbIK#9 z&Uty?e;Xpw>|*3XuN~&s_#AQuOd71a_Eem{A0~WT(SvRG&Vx+b_!uYHi}Rb~NC~gw zXoYcvK~47=H-n95Nx~q~*F?hb9Q5B6Ds{toGE0*;p*q~H(pO=^ERd(L`-FAKJs9); z2tvaynMbIJy`%w2@^Hu@JyM#PQb7Ario7$r#$b6>xLYD|2(R^AsAoU9Xks6pxED zkoOlPuu!JRH<}5jFMbHyJkm6-YopmESagGyW#* z;iK9dHyryP6;IK57&2(2g)Wdv`ZCJD@DRO!(3&5Gbx*VCWWLvp_xkQm#?V zTTdfDuvv)57qiS$XaH?4`b)Y{*g>#sz@PwtSTM0#lu?Xl^!;Nim;fN$3Sg(CB>*~Y z{%K$TrEj2G;O}m1064Olp7}4FFD``DH#z#*amf8cAg5;_t_>io-WdE|DNq*KRmL0(QMnHa0c_fCK=eC;<13^#||T{3{cnk0WCb8=vffIk8ZKpn4DNV54wW zz#g9hFaCgA0s!obFo!1(Jvcw^f+u@`YJpX|08()@s~BH9Yj{)m89mdnAE5y}fWw=y zj|YHuKi{7hV~_Fr%kZXRHNFEsm1z^VMKLMah#NaZKNA#0z;__8cAfA5cDLQTV7Irw zZh=AY@IJqpVoBjYUGaXXey^>80l|M)Y>jxnml(hFaP)q*@T&p*q)P$ck7~jDz3m9I z?fLXsKfMk;{K&lU5&W>F{7m2f5WoAn7VaLOzK+a%qV4|N0%!Hc==c)hreA>hD*JOD zDnL#Dz_0*(k!WLt6+HQVB<=Nz(THi~GU;U1a6+hxa|7@26;Q3v|zt!^LaC^-D5OpMDA-|W_ z@qPGGf6ctb<_h4;#i6`!G7m~VMteVHq*O?nJHW+M>EA(w&;%-@!sc+CqP1XIB@w4Y zyws@XqRmTuWwl0P-A|qiFZ-uyGvAk>{vOxqJf3 zlB|G?iLl7aA%>5A_>`z2qf(IZK9** zye4{y?Hi};m)zrYEz(jjd!L78aZm5o6H_(fZdyL3Ljp`c<5uUe)czeomKLA;m5-W} zb$6`&OO4jFTq^dn+@+8=UtgAViby*>cd$5fs4WePr7KcQ&yKHEWYYy(bpM==t-?vTz#bQZ9dq0oJDM-Pr5F`3hdmSrxVIKNL%3yZu zjMbM8bz81;kniXZP9aViav$1~!8amSL^fIl6nz2IS>?6Bt%I_aNr-^4(8G$4`u_xQKmO zIgA8wNr(;5H;^9(6lxARBnPmLI+-L4V-X8aE&_j>MTv5uf*Ki$tW`}Ur_o!I#PydT zlkS84UVWxrel?4$Zn`amwqxN#d~qJ_w4cPMkKtWw{!{Wc4F*1B#0K%VQ9$OF3q{^@ z5IUCQOE!8CH})DUI&p;2mPxzef$bEt%l5E_LHqN@f;=3exPX@=1QfN$=Cy+ZC6W8r zxfC0k7fX$s@v}9WC6A8=XCsxeiM}3)c@paCYUHq*)cg?Vd_4qqioDA@p>@wg8}Eo= zmk#fHwjgVWKyP(HQ~13y-e*W?en{$VTm76I#Wy0ttQz* zN}|#;aP?b%ENRUtXf{>@=-HUq>=Uza*-1CI(J*G&aZ-n-QiU2FDGP_Gc4GVeu_5K_ zAp0NU+p{SM+wuK|Fjg=l*5kqkr%?V#3&pl%@al8kLSk@}&+peX*T3#iT9j40NT>#$ z^cuFj!V4u8Qb~dDkD6bTbP?S{E4=V|+lXomjR&txNb{2g6|FP9wf3Kip26BBJk4UN z-mDHF+xw|-10hJai#vsR+6)%G-{D6VX4q;8g1SdKt<5E-tmPx zv$p}w$1IkXpt4v;d!OBE#*20dTGGleo(=1ASf0&;tponcbk;lYbg=awOy)doTy$5b z*-4eH7*bOoRaet~&KT$ajT%F z%}&!e`-Jd_Zofrw)L7e{B@=u-xPGJTfa}R|E!zeed$f>kSxac@gEAXZD9Y#^KZU7t zpgv*8E-JZSj8b|x`zRKnYLnkGGr7ZWZ^>E*G@5Z*q%EA7alIMsMhbPFQKg)f%(gii z5fmSgh9|2C6kTSTKn+%-C#3)sS9_pxlY1<9e7Q->G#mUlfzFR~l8Js})N@gs#(QMS z)g2NUXRN%|$A1-H@lTIwgI?T&*cUOc2-Ld{X9o&pA5CY~S35a7weOP3ZZh2__d%~v zxJ9z4DJ~gw^HH@xxn5^~rtV}{o!V(?vB;VSD1WDthnp8g^v=fwZd@GXgOZu<31l~7 z#mr7rWoqUV8g9A~56<6gsp&Gf?mh>gmwIiTOX*x}=WJUw)JR}vd8Mp(&yg-B0ZM&t zV)MMZdA0817T3@l6I!3hgGyA*4=V<@gK92hQ}TJt3BVUEuyAi<=XD;$&a=Y+S~c$kA+Sk`H--n+ zL%lX4igL`Sw{{Kx?na9@8JW$h$i)O`RZvao9|e`M5xU(YqZ>yXd(B50Dl_bcZHb#= z1$&l4;(<@~hPOjF*lV{t@ zw1aS%#dCTi4Qaz(=*289@gniD@?eS&skr9y&%`yYaxlIxSHtQMo}+?4Vd`OFx{es` zfQbOZ(=ZsZO#J0nCZyXI$Lq0n^+hdMu*Vle@=speIPF?g$U^CAo zFX8wV_n=bDJE2H!*JwWpZ^V-32BHCJiBb{!V)4u#uM>E(*e@NnA?l``(4t)H0%U3hZ5kW^Pz;- zyTU&E?=0S1ygWLa9OFmG$jKQseVOTFIOmSd)?%M9dyO?zaih4BKLxGM44wQb8>zWv zHQ1NhLdPh3667}fhIQI#rBMa+1f>>u*+O-pyOWp&7bX&ql`TGs!Os`z0%{M@I%>GG zU~9RU+)?A4dS+UWqKBMtGA@?E{~6;}&qX?FNC=TH1`*%QS~_&5ZWLNHGp$i_Y6I*_ zB)U|b6Yx-5`vh?(6XGsICKjghpfP&Pctr`|CJ2;)?H+4g%zOMDit$z|%FJSlhCTNo z#_>iiHbWah*EG(=T5*zPO7yUwA*Xzda6P6Vl3lYrH+ZX*#ksB9GkX3&@z7~(Q3c+!6jwP zo0`O?ObQ?8#CVHB)ZJ#jJDluwL1MOPAKbK=8Za>af*=~`j zF87|E>w3*?-HIxqX4F+^#Ctd3Nr919JzHZvJWY$n9Q|dzV|md&nnVgGbuEWJnhnQN za{XgHIlYuDfQefC;JU%lt@w)?E;SkabNRt_MN-|>nBm$T4JdHj74nH&RuIQ3P;9!8-ts{-7GC+X4OT%v zX+L6exIFC4_cu`4|4m4(h^3Ft2oSFisQ%3+P9t;DNJF0<5`_tL4rO>ao3dh!+-V!e ztkEUU!x>WgKbU3$wg&x5~X z^f4TqX3@GJ)*2TAdq2~j#)qm9>44IYR6#PRX(wkIEPGCLYS>U;)k27I)><}#uNrR0 zcCZdnmDi`~-lc;HIe%?Sx;Rls4+Qt7%U2^wbqovoM-tj3pJ5x(3?fh8y9Qyv=+?;y znvjk^hnH%A=RUPg6HQm8bV@Vth{c@Qcn3PIG$9}$4XO?Y#YL@yNC#qjN@Qk6ms`ccc==F>UsA_cQ^~eyydu_ zJK=%Nq^wo6?uc&mXroJ4(MWjLVeZ$pQLjXPCK8RMKbe&wL2($qXngzSwc$0Aj_bR7 zX$jJvJ;7_PH#P;#XYZ7`dQ!cX4aeaGn6&CJDgdt5|#m&W7d|z8o7Kb5bGOW-{Ku^ z7A(>6cs<{z>_o*q7X}7A2A&K+28BB+38Xx4DlVdaggV@VT3K@jwrL+scV&rk*|j+9 ziZM~46Kmo1zWG%pRxW~RdBH#50UBeix}QFyR$GBzrfp>-%k_Z^ZTV>6$`RUC$#_5y zp6$`6g_Z{rj*%8IBlZH-_tA*#;@0aHLuNI2Kq{t1r`{)r(Bt!jWYew8EEd`6(WG~E z4i(w9U{}stbkANUcNuPq)%7JdQe3h>`=Y0dolDKasKZp6WTVx8(xaJ@Ny0fdxw-oj z8nTdwd!pO}yGDgVS0T(PC2T&W1q-FE&63O9IWF+N)4^}`;ZR-=o{HB-Y`#77eE`S9 zg;71nQ*(~}h5cyp|6XZd@UByr7-cG?>5-6pVmp_#1QFE8NKYDe$!`iU+P{wV2X-l! z71IR|fZ7B6fCq;Tw9xbY9{8wfD9^csn)lIYO9Oi?fe3GsvL19PykGLIwcXsGg7%(@ z3nHg3W$+Tbxx%wtUPJIF-Ya}okuel{ou~TDEe^cABA^5UU>~@*3evcV5s6W9FvHZ> zXeDXr57GSyXnAEfnXIj|hlg4UjDZ}{+Q`6OGMkMaa<*Oqw-d7S_l_AiZOLL9Md%{#OxjI3S1G6A_ znL>r*{@cDHX2ScJrjA=^ep^j(dQ$sbp{PrgnwMn1RwpQqFxmAaOO6?|WBvJb40#5qAE1EnbS1^e2%q%s93O&;m04V2C8y#skp{E9823HJe4|;@ zXkc{Pl#$E((@|wIsN#a&E^nDWwp3aXAD7YL(OG8hQ=fzW#Af}B*#ADi{7rr!KE&OC zmg!CH!$r}ioMa-22>H%I>7fJ$Y9a3f$9GU%BD6EYr?3Tp$4g;{Fi?$yq zm7F=;hhA|M1q#$f@ePiT&&^_)3fD8I7OQV<&wENaj}o0rC*Ui?Dtj>G(Yw~XK!Sec zeBG%?TV3V5e-?Q&lHjYL7(}Ej3s&f08iHeSlGDdzITlkW^jm1DT8J|d%k@Id64eFI zyrZnsKPEz+gOi+y zHMXD2im3K@^C^ZzD*FCbCQP_0pBvx4nY&~mX*w!9F0^A`$A#T{!wvxslu_OM(PkCd zaa+{FdT=W(>onNxhn#iZ^NzB%@<&=vGS6y%2-T%1y`D^VSkh`TeXvL&aRc;>XIj1( zaa=dfhl;>RNZ?Pdd2eU8gwrwUfHLmk-SDxy*Oh50W!;Zn*T#Z*h!)0uT1)y}CpkCY zJwD>(+-#yVtnPM`{Cw~LDr_?<*rF!#y!E$mQZjFQy?3Z#8$xob)|yK!vhWWfF(fXL1PEbh z;~Z*-L57ODY>sks_2g4toy{g_91pf29o&hm_k@Tr@4-2d<=}YdQuxvF{DYUw#1yy+eo>QG1at8@2#(jp z5N)J@x?K4|GOwiNB6sPDBULMjYxCzztP3D~EH=ujqkqOHUv&7_*Ea7cF@BB{x+|lk z<>S|Lpph9hzNZw?B z$xSEoBU$!8}(&@lJ`*D{ju^MpCppBKvB_5>ZJenNgCd9u0Q|1>FNW zQtDnzt8H@K>hBhq&{mXJW?Oa&!3rAO(q>>2O_V)3w*o6!`Q~-!{T|{3_8r#h7bw9h zCdy+$P~;&m$1}go039;epK*r#bEt*l9QNe@(&tr{cNO8szv50-^*9JsorOY3edNyJ zY)cr4eMm{9-+zKK3+HmZz#5K46(~h{tj<;1_rfKY2n^w~#0fp+we-!wNs~)`#4x2f zjFRiqvU9>|e)DFd8c1nmG?Cs*wv(D{ce&PPL#>;*6TZSY4tqV{p7ZMs*p?xA8i{$N zINJT|;a&fnjDjX!?aVW}>F9$Lj7dcXE2OIqWPt4?S=pEL`c=1YglC)=ML&gCoyS1yx(4{-tOg zt?RSZoOpN<@WC;A>k^UT%krO1W~6o;$rsz7-hF7NB_f&cIac4jDI*W7cPgCF7AA=) z+5$z;9{k6Nv+LLsl^p=icRQ@Syf)7cn8hN-{Y4e@Y%*J`Y2NZU#Pwfck>deOe&%-F zn!E05=U3Fg^MZnC7ygrlhdfsf>=)+6$D`&u&lFR&`EsE~Fj;LWW-6r5LUusd(^A(p zCPVj>#u8&CEe$>go(%QFRQnoSOWbRYqvR2xYSS%Ih!Hfg1;|dUOu`WDwlhx7___{r zi>JhBNZsx<6dLp{Ccd}g2L(mYH4VGNT-3i(dQ-&jy$q2MGbne`7YfyM+|{Eqpa`BM zjhX3euJmVp1o*<+Km8DHk`31NH|uh3G=&z6PCmy%pHwK*Wp3b+gvhN#?cFHGP59S-O zH$bWIGS>6^0t_&(@pBRp5O!QutgCp_EorAvJWz!%qeA1kzH?VgCY@ve)`~kho%kT` zh?uZ3KHj2TNzi0xQNIO3#pvr7yl2hk+CtAMeOXVRfj3>LpqNpTkF-|kP z800YulbE9Im<2$RhAWB9M$ANOd4UqR4KQdcHPI--wAIvE_Dn?h*%apOBZ}eQ5U10L zZVt6S5*9%=tcd|oC&iKsR$EA|=8l)@f{(IV@PA42O zlsjpXeUzHv={3B;dzmxmqU38-TIg#l2@=!eIo+<|U7-|@*A*7l9=m?|q_0O|!vZw= zHI16h+NOL^879vw6HdZ@bVHv=_h-0y$mde7>n*4$WA@x|$wfI!Uavm;CTU+Ds4&oc zMw54rBTyIKN1DZ4QYG#zPrD_Gd>a09JYEYT!-!t(_R{6TDgsaRv3e`_MVy4YmiQmr zw*suJ6sTu9VklDb0jYXN#pJMO*9zF5?ejrln02qGU0Qr4HvsG|)HA^b^F7pKXR{Xd zUFC|QFZ%mr3lj2cSUsxOY(5T&s@`4e$=Ja9jv%@uLKN1d@k*?|dMWxYiuIAZUBmle znRJlWyx(M7O)DevHUWy#k)G!zAlxz>ZRo8)L}Y08?DSBCqy=SH%uG;Cr3AC+agoka z@#Y3J9wL~Fa%#j$wj`RAAFl^OC4lKUVRXf2mpTX+Bs6TY_^C2l6mqERtaGYhwq<0C zbGKNYI1~FQ2}IYy3=7R5KFl9a`ZFsVS9S&s>4HkrsyAE6W-V;@5?VOL3!}D1(_OlUX+pG-7<+%qf0u!=Yp>&z}>4^L5v@iA@=iOJgz8 z!l~51^B&rxZP{(T&9G-Bk=zWn#+QWsjKodf<+$tU!T=y)lRRS7d-4^=&{Dgx; zPzU=vlAt3Hn}YzVo$n>9v%wfoDEDXV0U%4zj=n7XzB!?RiU2E4G@NxoRAlZVivnTe zL5B~kq|R)q0A(RIS`>dG_fUM$x#nCU_Q`jB_XKF&m)B3g^S1_nl9OK&XH$NM*~DXk z)41Dh)1&JJ+gF>kSZIL5;u&jIU~+W6%G_t_>1>|dV}4hO5YBcHkDH9(WK`pX{-Z89 zEnH!P>te&#XIc)8sg`!~x#%YNtw6m^anUan$dy8I9lHgT6y0QoVdzi#`$_lIxi>cp;pI0;V(w3t{)5}g56qg% zB#b$$1=`2+p1k3&w6d_JRSab4+E-X1$Fj6GNEjkNcTrM3UL1x5)Z+$48*SG}Uf<5^ zSW{GG03gB9Y0mx_?a07`U=gGYfdzun!J#yy>RcEN=mA?TOu|Fii8bmz1l_pB#Iu&s-76c-4 zK;zfP(<@17hx52&lFx{_8*@pX1I zg$&1JcFwBh2D0Ts-G@_h)p@yR?V*Y`Hf<4x+D>AldyR!$AMd4)p-*hY!FA1U!B!Ec zlM2s1zHRxnp2W^HlcrIN$T8{{<5io*ITy&JE$Mb->*RNqZYxDJTAJdnX`OC$3 z2TmMlBYIqF)JkU0jk$Np>x)w!f&uXWVot>qiiG{sMMTSV6vVnf3i$)gneod?$tzTKN9;qId(WL zIlnCMbk3Lud?qs#Cm6_3YQ%D?U5YAa?2~BI7$Mi%Ahf;C@L%7cZ{s*Q+(j`B#4#YG zcs9Ber_Fh~lI_FL>;%v|1W(GlL5oZvWQ9!gvq(<}z3IY(;l1H0hiI7jnO=FOli_eM z5~9wxNc*OziE*;7sS$~?nI(w4Y?AMrrL!lZGF~>yhmHjXIatZBo8(811>{ta9?Cac zcT72CPaJsYzT;q@<~|u@G~LG%6E*Jhc{7RGuiR&&ClVvPa-4VW^GZ2nJP+>k<0lf9 zIb>Py+-H*~5_I0#PS+1f4ml;tuiQoRClpy)HK>(p~vuV3BCVjUH<>T z0{-Rs{i`MVpA#;a{-;<#2KK*%j(;?66{&66Zj2)MzUcOeL58hbVH&ixcDB7f z2?CK3Vn}3=io`ecZkC!g^}K$H2wTGYMu3R3dgv{C7cwRP;%temru*heh(G5>AdIY( z4_{0%q6aK-F3fGAS2)O@I)ulKKQ_;YVmew;S6np+(Pc`XJ{)@RIA=x}l2B;QWi^Dt zq(F*a698_Wep)*6MU|pa{yaOr>e=4z?CN|bU2^bpDRb@%O(m78qz*7gYEzRen|~en z5}a6Nc}e#Cb&|)2n_3((9cfl(m4EN#Rl!L5y{N(kS9LxhXl$?gJ9ODFCRYWApvP0# zT@8Hq6{fHr;&tk-_Po5EujOy_#!2(Uf5AJ$VQER`NptLT%)ne2wMVOl>RtQVWe2S- zN_Q4X+|(S=@KVjxus)aR*PXUfqQ}e9dQitt+7Sa{G$%V1w+}`m*+`ZRe%&pYIy+p$u2m*HMmOKF8e;ev9squ=m$v zAYv?W-VMLk0QA~*tTce%VSb5%kCuh-UtV1m`Xd7?{KQI&$uIe0-cGmk*1mrpyJag))XLi2|(-XiY1NH6}o2hKY{3T004&KgkqwJ$EMcQn$EaA-r!oL}Q4MO9> zFn~#hG4QK!xl4}bf)5IwjKYl%qxd4=-_-1QOja1tMiKyI8V*~7wa-VctoDXadY{3=2k?f<~-AFlcng};h*5}jBInB&00dlBam+x$59s(IO zox?3Q2F1*e#{jZ0B}I|)1_%X3gi@jc}Luku7yI+%&-z)G_pu}eT5M?ifn*{)?X(ScAH0EaRUh@6ee zr+*r5`Er*UwUR&K7$D@ZWv4#7vz2xO@s^j4hkzbBCAmH>dva{Ylh!FqH5Y3rlTOpx zBA_bWPLDT>sS{PAGAu&eWcUQ4{*&-}F=u9UoR%R#Ezid&Lp?f&=rP%dpM3N8g%B=4 zxzov-;O#_WUYVvDPESn-J_Ryftuoe)cDf;@pDNilOAqh>PZHnf=k9Ch-1L&S^>cXB+aa$;l-^#dF|x4ZlpX=kmX=W$s9`rVGb` zDmG8{z!ZmRG1s>b8UY<@l$(eEXI6vKFa5!i{VLr^zgdL|t(06qkPFY!?55r6kzqnOLcOW%WzEAPV1`*bz z612rn7G}sJf=w}o!B|#8Imo-x-qwfYRXrQ&A90dtM2d)=vccL8Ub4qFNh@JOrl&$g ztfU4Z96t#RQcLpac#D>U<|&GyZ2f6HqVkZ(JPct>i=I4GP3VT$eIjArKc^TcMPaj_ za-ydL%{Ob6;!8GL9*gC3y-`PorxPLu3J$4uaU#$!I9%~$MY5M*RI!=pUM3e3#tHgt zeI@W`2gZVic;~4QYC0UuJ;C)HudC$l)%BWGhJ%J6oRN!DZclHWk~T(vKT!+Jf^}@Qn|R3 zs}l*Y;~eQkED$?6axgAE`l(*BOet{?51qf?kfO84B^eNo)I5KDC$c^qfm6!L&`ea<9~R`s|gRXA0%TH)-Qvn0U|P_PRZliYMwFXG;WljUM0eP?z^^PXA( zs7Xj+f*7OQIjUdx`qN40VKMCXkE&FjC(1KrL4(kn-jrg=1l635YInxR`6R_Y62o5_8QGV~PFNv5ItY)Ndp&S5O;0u1 zEU)7L+~+|nc9!p77egR0C_Ujd-dM~%Zi*{iMuufl^YfexYYDVrR=zVW`ShsAaBnkk z+sUf(a9Py*?kjiH(<(N8SDlF)@l>f8{7in=UCPN0UoL=HR^stH;PO|Zld2gS ztI?oewfu5lCmeK(j4PoLjM@PP`WSomq=nxm|NEDXFmIdXV0FiQ-&k`+BaJuVoX*7i zU|6ikQ+P6Dx<2gYdkBSk8mEapa}#eXFn{V82}!?f1bHde>ABrBH9?xpBh4!R*voNj z$Bf)J5^KNbxw3ESk89<)PB_y=mipsyO2=q9_vGL!X@W%BSn>ndAI_urPlUriBDDUK z8O-$W(WL(uW-t@Ozu~q158~ioR{o#pdIpZac&>jG2VH8`wi}{|e|tLwcDv;T8n<7x zpJ72A1m+z#9=*b0*>hEq>xI__C6cHV?YDIQ(t7*Zlp?U9zJwiIIheS(m}Z!y5;uZK zceFpfUF_d<{uXy6Pz)umQ8I8d5E8Mb( z`_5GRbpFxq`e1%De*QZ06zE7OoDVWZMCMSK+|P%?R35NMp_d3+w0UBt&4Cn+Qv4>9 zVBgbWhjvbxi27BWZ)J)g>C4vfdKJ(|ua-a$njmaYN}@GxRM+!un4tQs4Z{kd3Czr{@*fw-gHKnq4=w2&m2N!=Sf} zf;OWuE#eRN=#QVb?9s>X_FCY?ARYuv&FG#;} zRa$@`x*1yyjRgv9rnyJIF8}~)$D8aJj04bNpK>e>1jO0qMFlOxSfLXKjOs2?P?YHt zi=J?hx%JI8rr6r>{;1OAI@!%27H8~$dyF8P=$S9j zS~P9FfjZu>5wQCK90U9LL&t0!NwK4o&P7;+4{UY9brsu)U5&ttK@T>HT37RD^;I4Gx!Z4MN!?4oDNEwt! zof~~3VUqq@%11eB4hQEUOcdHP<*bf&=Sdo+QD~G%K32n*ER=^Qp*`l8Q1EtS#EKi$ zxKzj%MuPbq$(#g32A->ZaIE)_N!MltfU}l01Sa=ir?X2ssr66wyneIdSCBL_@dEfP zB1gOUVtf(#wpHoULSs9;-Wa$&$R#P91F+Jp#o8T4kccEo@Y}Mn@qmA4!8GuQ7C7|o z@+|X8H3K)o3z_jz^ms)E$bpY!52EBfmIt0t=uA}mwt~B<-uZNTa-rU90&=n_SE#!` z!`a|Z+-|#%FgAwC*5G}Q#Uj6)H9JH~N%7H!DxHuI1qc`(hY#L2`569s2%Xypb5^{_ zGhXtk8?CTt(oL)bgXoPy0M+M4Nidt*_^s4gyM#Q8O803RB_s|}K*(AC2$<1&b?qzSegPiBgD-cHc+s?r=;G0NN^Yh3R(6ExhOl?u zdDPxiuUVB$jEZ@vRNk};1nZwwqtUZ!J43fDXvmsAP^HP%n!QyQ4gd4JQiK29X?TKv z?wM}OQD~=>h%M)0Np%@h8SCNYp2m+5p%4q)M)XH!k?8CZDF)8bL{NW#0HA&gyS2$! zJhOF_Tgat?pf8}hE%E-8FK$HRZ)v@3D=lEH5hMKcZU*=#aAo=R2~=l%9=A6CS!H~N z6lJc9M>xCxF+87_%Et*t&)v6~b;mM9*JP?c*F&Y$#E#5XW81%u$LhU?WVdb7aIg7qEcH`|Y6WxGiUXWLnX zsI=+akOtIDu;`6bQuHHY%ROTzxM@+6Xu3P1XUR!dA~SuS9gYF^%y(25sOqh^n^loM z!d~24NQg25{4YP+m*#I%V8^zqk6bOV2p>X1ri$=9LJoxZrP)F{LPjSF$+VI%YTdBW z%!0iUsMoTvsCr~$2DkY0D6LOL(V)@k{4^zzC|q(M2dcS;LIioC3`ZbFfZUai&tPRS z(q2tc0N{d_KK8wvU!~D#C|?!2xHUc#8_ol)m@S!tL}`b$0}c1TQZNkm8mGsII8A&= z;`t%YUqy4oh;^>pPM9D}2ymI~(#JsiY4_vZ4R^06&Do50@i&9fVp=vyOYgz{)4R28Qql6!h!& zPg%t8O(*UDxt`kU49}}$S9mA;yIwBRMf+_%&S`jM1Bun%els> zj1f+?5(tt8@k9B@-8_2!`!8qY!So{`9)u;t)i}}sSlZC7_?YG`9C5PH^V=UlPkY*^ ze8BGbM)%1dekiRY#cz6O0!;1d&l(skr_*xp-7 zP0ZKYK7_Cug$k)#G5QK&y1b~170CQfp{c6R2ioY8F)tn!$E_-2@ z+^tOhb+?^z?Ccu*vQOArd|!~cjr+$Shb1;U;v=L9CpwNKuFnEPnPskC5rRqLyeSHL z2U%qfMP2F=2=_YvSeR1KT}1=l}(bs3zsyE!s#eaF7cVHd11P z{f{{ogmo&5wr30y4k`}9m|0au-ee@=MHt526wnBQRKBsl%%PE=eOaut+_^O8>~hP$^pm2fgtzhzJ@JY#s1d# zVNc|pKTxJ*Q$r+DZ<{(!mkx;5XH*eY}$K-#!l3Fd=;pMqQFxvt+F5??BFZRN-rI~hOp{7@p8g%ka1U~8xKSSDj(=XPT~0!< z8vh=9rF;YuwYOAR+4u#WZsruwgp;tHh)W1{K52GVq#Vo#kns>l|5AmMDtJA`up5Xm z{+eG$`L?X~Vz6=?)=bVg!>q%0)FzwiXCOpyHBd&B}I@F_(Hjx>| z9!J+&X@TN{vL$UTXDTil;7rZ<^~m8d$73L!2r;hLFK2vy0>L%i!0QH)5BtG89Pj`# z5EsNSw6ebTEsifa0h49;HW^uyWDLbKoENm{O|3XQ1#~)m$Hv>x&{%YZSW|HgBw{E$VX5} zM}$LZGL3m~hmm03s(blNF@g7j7yy$@ijD6x``vO`9;b z^gw)*{7Td~9r{V;zkEv7DINu7a4&fW(s%@T=uDAI zDZe=%Di02uP$Nhf1FjgP^gmQnfTs2d9-{98kA4#)^D7p@^RIrk0ra!2G7|5J;c>50 z&O=oyyG&G%eKDvXX@C}@b+7ql9ES>3nK2N;(T}pep$DQfHxNg93x`(KN)nM%SHnp( z-JJSce3%g%Gvn=}h*zUX5}~yLfE)A;Ok|PaRs{~nxDD({qqJ@wf86BD5*fkfzWry?} zYwrM%s+Fe2_fE3gF8hA35V}dKRf5A&xpbTVORB#*xOvCwzIp431VvtQKrVu17mb%H zob5)Zv&*Z^$-Oe~Hf-$ZSqtt1v5^FTCe*ro-C4(wttAWDR@@ip!7rK}A|BEk>yV@% zsb&u{6Ag&c3%Dy#1XUh$+X%%;sJWYer(=+)C7x;lkj-FfAJQxTX7-9QijX)rXD<;N z&mN<>4LpT^8ndPD#Xf03@8WsUMnQeK87}aduSCeIcb^Md4f9F?VDW>ewO+t&54@^wc6DJ8t!8Jy_j~DSg>yGiL<62g%rI|!xs>pTT3AS|r#z+1{ z4M1Tdtj~4V_TG`tELRaJlqJtNkM4a1(K1=d&ZUBNBu_5lfKUgwl+4^%>VBFMg+261b$?M<;m7%~9&RUI|3cZMtZ>fjLAtGKeJ|m0X ziN2hNQwGB*l7Vp!$0Z}L2A`FTBj&SFUPQ8q^1W`AJy5cVep(CcI(DP!^nOZYJ9L25 z=F{2~^8Lv`)V~w^#XwROdXQJc7U={J%g#zQG7(W`{b^S|*cUJ!tPJI_5J2SzR~JoT;`O88 z9|g}4;SWZ;Wq$Ry5s0b-#p=t)2OKXgdgsT=!EgJYh>qo-D|P-0(f#{%IsX&UvHowg z(q9qy-=me7m|2+r8?Dr;scnDx7ty`e6Fe*|1-9;Tr^7xhppnN02b0Vy1^{se3QDKQ zY9OIXafN9g_nVu!rK4viT`QlBmbis8H#=|HkMVTMdOXxO`^(JJ^)s>|2Azyem~=@n zWtvc#(`C*j>o58HeZJzC-}-UoQ&=j`&XH%Po`>V_eUI0F@$`E6v-Wzu9(=8xyQl9_ z?4Fgxnlh~sL}*CHiJ0?5fLSF%%%-%7@J1dZlWLg7{6M^9KFt_biq|=pg+%s95+DDu z^Lp9J3@}|FK?LKdBsq$ctWDmyxJuXeWD4)SMVeE&Ndhm@A*~A zry!G&>Fa`>s*O5p%nyDC4_oZ;zwgbFhdrWH4%!gqqIM(cF(u!ut#)myjy8SRbG}Mf zJE^kA11pc7?K@=3T~jnd7XVk%GNw4~2w99Ok!9Fy)- zig~(O9eRE3TAU8Z$!5~zEyi#-)XG_(po?8}#L39;zz zxuQSN?!B8wF!Xa*o*8fnuUr>3l@B{5^PzBkb2mE_{)luaS2A0r^@#;poj(T) zcG9mU7h=*D;iby#5Oca zM56}%)BR$)|uRM-C`scHadf?}Nx&*pt>-Gn%N%;Ie zCAb|Tr7_%~Tv_TchM^fG!b)&qv2<)Et;o}X{N4aFJY&De~Zhl7=fyKW_D3ppPsIY(N<=9AX*53 zf&X|iFFb&ydGlH^;z*&1Oj1}y7J?uea;-E5=9K%~5=RSM41=K;@XX%O194d%HV0M1 zS6fI6whBrJm*Eg3Qq(~$gk2cOr~Cw(qKGJkVwyT5=?@Cl!~sB433hJk4X;LuE)Pkm z0HzI1`?(^^;}N3!vW8uaWvorV6F$l+`&C_hzaYKv2~QD<^wgoRNyHe9NY-eeHFw9o z2ekVl!DH{AvG_Zp#8i4IuMIxy|9S<#a+~eL`S9+}pWVOdi}2I4EBA6~Zp_L+Di3cwlNb+4UQDy|Q>6&s8P$R2liZQ6vXOcb6(4ezS4 zb~*W*w7%e@e?O|dtM>@92H|S!${nSHGmuONd-q3>O)zr~jjYiW~X zLk#!>RRG=ag}fZnL0P#CfX7NupQpE-2r0yE@W*2g>^F{?6C;R*t|B&Ts2P*bm(ubm!m0kE89u(mm3v9Q%4{)#JM{Iys7 zI^-#}h?(eI^1IPg3_IXxK?QIKnuCY7P8_e_;37r8UM_N{XsQ4%l#)2}P3D4aNJ`%Z z$U!lB63X5VSzS>q?~;jN^AKZ$*h-bUqxOu8PyKysR`_FB$RT!@G=kX^uOtIk-~P56*G3 zn6xn5G{g9eHK)JDWUImB$1J?p3Xb(a0V_0FFLuEUv^ESk-OlEj7Mq2`+)cm{|I)mr zF0kc~;)PzX8*#(TuyHI1ruJC%8smsr_j21wAFUGM?#{Re?yGikNB2QOa(w^0miyQ* zY|zV5G(vk;xESN{xX`xXop}?+b-}Z-s1j(rC8aFxJ>p!&|4G2Wss>D`<5|CrjTI6Q z@y!(@DIoBQA258%>CHAfKo?heMX*?A(hVCjhIB?sv|}H=g|sQ((bRk57|~S02o>;f zfOGj!tDg&ME>cw1q1#$afBb9`1EIokR%ou?o|ppW+dw0RTT%c#^T3t~xD(ekA;{HE z_d%Uzoon0~c4>68p{$a~+EDC#XmG4pYtE=qnqt^PtlA@N5P6esXYBx|RsW6d^n^n+ z%-Q01!udOojAAniFMATedQC0;Y^;}K-$GG1n`GjTS^uN>`cB}1m?&ot|C7K9BnzKn zry0?7SQ%Vuwh`-bS4=0}H9(qT-l&rxCZkdo;%ykBas~e#80eqTVMIVGYtM&0)q1=* z2?4f4mU(q}aW5~wT?Y_MiT9bGOg&~CPvGfZGmao-(NqGx;p{ruk_G73tf^r<_AB3O z{BM{-&>q}^FAqLlV?1rAZ7@!aO!%xd^5M{3bVW0SD2R^F5C6gq`z(&oPU`FhN#?Py z>09HSpE5vIFQdNoC$69CLH;x$`8djF4jg8e;Ba(2oV)#xX!E$eSR{v}J1l#cGI0vE zhvAws|tpA|h{@G~6^8etre?v?B7ohKdo6`Bu z%l{UQ$H4O6_eWbbw&MP3iN5*u1PSO<4V%6vrs$suCgYPBV*Be*4FR?=7FDc7YDB0> z4+D@7x0M%GN+lwb%$FPFFQpo~JG!c8Dv$eg`-Af8{4{lXJuHd@AkwjkgGQ($OcAP6 zNd}EDyW#wQzP__ZpSL!2CMi~I*y4#X`@EgM@v+`*9Uni;9G$=IUL5Z)Mx{r?vsxlE zWLRmARU`w2)VJwjmxvIuC~-N@J<0jhgGR>|d)5^u7MGMqS%P0h=$d?W!nlz+7Mgs`#)zOn1B3aRofe}Y_a}-jFwYd{T za(zyuqiyBJCY=b*z4cp1<T;gA9?_wJE0G=VAvt8$C)?{{hlf(NW=3nwY+7viky^NLo6+l)u!W}Yss znge?;ONn#s(VZEqClvx}Re$bI3frKjz2~Bg7P$t|q1?WcRp(N;zmHrK)|F=><-6T^{>t(4BxYoSIb z+5QTwQPXI<9IpuMN^9wMwghx6)KcB*(7`GzV-A2Q4!7EWTAn4!!znT^e4tfMxqLws zsMq|`XW!=z~K zwLfKa+XUMvzS|@m3%8ibiV2bqkHZ5ehcuMl8FZLnr$fRj7Q=h>3D7YwfL$%;5r8jx z&fMGKQH35y4SB-0L|qu(DNI8xkqZP%X2)Ejzb5AwlBsgF!3(c}V#ZYX!g- z%#O?nw*ask|G3J&h@^?DVfb_AxpS9Mm~?%8#p*juD(hI)z);;}`E$VKbkCKd%& z>{SyM0^D20ZTn?S=`Xh7{CGmixR@^xt zT%!IUDQCY>rd>B*jI}q^L+}E(N{2xO5W`gy$@El)W$a3x6HI}5eAKvmKG5P9S&0h~E*;M;+%P&J4g#0Ggm zi18{dSkZw+ANGSb2d6chdv?U%SO6irq2)6Q_o{={Z%6oDDzzP}lwO`nbxJa?aD2)H zXeq3Wbv&ux0a;9TMdd#JiUM?@eGpvnWG=wWKjW|H0$yo4yT6YhcG~l|k05aq$Ojl* zqde!qTH=~UYU4KuspJ-Gr{({?+Me=gmWOiYu;g2?Y#%XHSz;vx)U}G%(|09ic~#+5 zWw~@fKV!DMnru|&f9eZRsn8^kEkgBG9WI5zKlJcfG}^?pLE)0^ zo3~Y_dCk6p&xaDItI3EA}I9`2{R=Lzor zxvYA(J4uNaOP7wP6(iRj9z?kGY0I`Tby%&YKK5bcnl&;S7RiyxW$$89=&O|D0_9Ml zf}hK0!lysUKI$fJHgeFHse|){?fI7J!N3OncZ)1E z42m502~*F#+2V2rGaALQvy5zx1!LSZVmK~A|5&2_1<@-hEH1J-K-uZP(#o zCAs0~=R3dcu`J=%=7$(woaxMO-p4#Lc?LrM!|}Owc=b@507*!J8blWDT4YhA5#`dP zLE1l~_w#shbU52Te-<-^DSqZmdVaM$&i>=b%uidlr%PYA=fm}5dp~@l9TuL_kq}Xa zgQ2OEk|k=s-W;|{LI|Zu)S<}>KYbQMKpL_&lIT!kXw;D5ED`~cQp*$el0CYS&J46n zAT9(Vn$#d-7)xE!(~ZO@@On9omw(WpWW?{?0H7@=vEeZ0KU-=iq@6`?>;y16v8 zJ>53@x8C=H75|(_iKG$kaOWf&HzRuH0SixR=GUjw2Ab-|NDUjg4#A)aQ@H{BwI}V( z1DQM9t^06w*7e0j&c%jrfM5$(g+ZM_xygxB=T73ERHd7-Jj zm{*)hDwL$?kkLvukcGqfieU!P-~AzuB(u40)WkgB{+#k%RB~Ksz#*i`!TtRaWWSS$ z<)?*uUTz>paSutqsXzbMfy5IvGGW&?A~_^#NK3~Q6PKJ_SmIw}en0XY_n7=Lj*YtLFt zIdXfwCW`5EDR#XM7u}HZV?6DtdTGzD2y=Uuy{sHy8wI)1_?}GG>^9fsWsygs%qM87 zVf(awhvC|5+fXkD$K$xOPO;DndVXY7#K&z{ZFP*!;y$_r7gny^%^T%!x^Oo7?i$J>@%On*SP>zukS$ zM2Ok)J)(8Jv}EzbZnoO@`uzRe^LUv)z)~+r2(-c44TTioQg7GOhD^zQAlCp%gzfBQ ztm{u#%~jFzC(i{!&BykI#qPC`P31aJ)2F6)z8UFh?^w2F1Y}AV zMNIemrTF*=%In*Z(32)d__+ZQi;`bA)iO@xJ7SjNI!ciY7yga(3E(=wtM$<~kQaI< zd&^E<-pQc_sr`vQxzA=BVFpq-%4sXkf`EzF%bu*lb%g+-3ZW2p&cy>&3#oaxg*a!f z?Y*rEf2U)^bb1?BHysFguatqc2)b8SYDvHy`y{sT8k!ma7IS4TBgy%IW=GhCCUg=FEHaLzQ|C5H-Nf=d7u$0?lZdSf(Zv(dAL z*_P3{o*8I|=;fAX zVSpJ%Sb}i~Sm;~>RmCg;EA07_2PalWH6V`3IUuwto^#G)2(Zvbyc@?%af zfiBCEf@aLj4*^1FQX>>5b+SzFYx=Gr%h~+X4mM|Hb5EpUnQjMeoR~&;I>Uv5jgu&D zMTrO(n(ZxTS=%Dz(pZMm1FK-n_sxC1A*wx(j6%ehoEa$KV#*a@j%p)A7|*&-2v~82 zE24RqN!@|$qe)4_M3mL3LJj8jnzr3K(_L|>FUOj71gS(R%`>rpHFh>(cPF`!6Pymz6)$|uP%1%lmU2vul@pzhQU9Guo;S4=jJN$oZ+RE0(FW+8B{~0 zmt0VJQsjx5AcO^umCzhR6EpLIkhC|^tGnA)&XVF*8@#SJKNvwXsh`U!`JY5y2eSo0 zmK*OwLEWXJE#me)=M3_LQu|Wq_hG)tz;v%1@q&@9>hHp{_PSCXd$M-DR3|p+tAD%V zP$JVLV*&v#7o`{RATv~w4GY;)USnaQFfz+RCHJ~AA@xgisjbL-jNLTKltrEpkatBu z4KOGZ`4Wq&)Ik&u9EF@zijNUlz;2LJo3@<0}ouW46;^5}XBs=&tv2+M0E5>BMHhLQz7Fyg!c|<1(VJLIbP+HtS zj%3U!@3RaQD|7^Mzl!FHmI&W%Ekz@_9R3)j zh_mSFyoDt{;i-bkG5O-)*X;VT2{=lr>07<)d{s!%wVcl5yB88CZd7cLyv18Z42%uUsT*&#zBcK57^-L<1yQ-DV=&WRdAeB6DwqD#pQL}UO-5iPTj=uBDk_j-Pk#h^W2l|>>a zmVOW3=!pMEtiS@bxBET5eJTJK_#k77hL)<=;j*VPx<1^8(^MqliYkUvRfOC-CcTw$ z_YfHSA%;SF?#7ERlS*pmv~q!JZX5sg*gxb<0AcoT zaDW0aNFg^TDOfBLOjDVDf^QX2@=H!x3PYV-RX9qeWeQa5Z*CyQOkPF@evced(iCl# zOe-%DhQcAq%2%uENuWqr3raYviCW`keHpJcO;M}~LvdnNZz`2MPZ-NjPG=P`U$h3;93NzP}wWPF}GzV!WMGCKavqf;Z3{LWCb`OU`O zipR^i#$2`2))Pq$n=GJoUU2rtZJ8RG8v%o}w*R`cCkB*mP!5wIOL)vUW+D@}!f#>v zIq=L>!JtWzY)wb(i7{qG_SZ7#2R$me2op>G3GQr0Ony(sG1AbKao4v94lsW8Sjd`( zGGi-n(aw$cR;$ieyH4t}Up97U3VIBIhapiYHb9snAHzEXWVq_0oPpxTRuaZho5RiW zB(cETXti(_Z*2I?5WyZ37EES|h|(5fN~@=-yq6pnH>eb@*um*L=C$$GVR@PY30^qaH6{nlld3cLB4|N5H zPP5FD!)E55xGC7g^aOY=mzMlLFQ>B@nt4K6(yx5Ht9Gpp6l4{^$hcd`*7^fO#n|*!JL9VrQ!*ta z#x?k{#az-!3oX#)iJ#t6NPz8*U>Fcg!3(%xNPCfiDIkLD=a<(?Fd;20-3Y+C!Hxq0 zz+;bAj~<9%QYj#m{IVd!#A#8&Is?K4p^^I@eH_CDj`ZR*vn3=cX63T9mSE>O`l6gi`dwE*BJK-Mu)=v)0MPVuOrL zl(XnP7>-@N;J0;nG<=uPC-or$t3w&J=BjFV5Ovj}jWjcd?-_h*$MT?JKsUXu#svgO zJCfeq-{f@sug&i5d7!@=G&9HM(aN^Lc&X{%4jX6IM!zV|P92Sb%yHr!#!Tlud*3gG z_uF=TZer72xhbc}60d7eOL{@)1y2XxdjXha&X>W#B{!)PKa)ky9Iw)MJnNkM-xhQD zR)6Se_PXm|8hA_u77u}XDiLA`mW(0vu8j?6#$xZ59tuFr(9Ro;G0;UN!Qb|gR^T;D zsc9byaY{WgXz5u5vXNu#=F`#TcMvB;kZ5100>Zr=d=)-+S79Ev(Gh9wh9&j9x?|Mv zX&mPX(rP8Ha8IEVMH_Q(+tA)SrN(&oGCl9&vD4iyx%2(^{&*nwwr7J#g7+O%kxrWO zSX-9>Jw_I^AVb=2q+5>ExmbiNGBa6qL+-}>Vk@%8&dI2M?`d4~YJh}md*6)TPZ|FL zuM#WNy5ql~6~4(J75SlYP$CpY`&5thZ9bPq?{hj=ULUqd45tUt>D7#joFsfu^3$3b z3977167}l$klwI?4+p-hr4|Q$p<&4Re0lYim(^w;a;#v6gQk_TK=(TU!$y_|BuJ+9 z!B*?lo-cjKadd3A-M$hbOd~B(ez(9)6I|T6c@T&L3ec$ygSjf{pswCrx2839d$nL4 zfsjsi)+=_w{s>iPbdRS;2Do~!(s+vj(2SYtJ*;izH|~QEBtH9M_+1he6=e+DduEMQby9CI2R zSk3Q>(hYJULv(jk3xuA|myK6pwc6f}de;!h_ltW1 zLF99Gr!4qappkGqXwq;Clbfh%$@f%I=`@uK0}@!0lJJkWbz65Tx4_-%CSFdI`^k{N zVbVTlsV(8a=8_rvwrW>7_t)Iycad$*!QI=rGpJ~VnK?4jEzg<3g63!s1-u#T54Xq`F>G zzvf<0!7boGXH_@VC89~sO|Pr18Q`v~0gsx#tXsT6IaS-z%YVRc=icO^yNL`8xS6_H z|M-n0#M)k}cMC!0_n9lBvkkR21-$(B55P&PN;})st_*u}#!a618zicHS=ZEAVlo2I zL-H%TO&kIx87ajjmSZMT^;(Tnl%Me%ml&>6KzEHv2;zBNJ8pN0>DzPK+hu54vlyCZ zi(#NE<2ir!uv)&lSc?5&v;ogp^6s$K=s1h+O&eWVyG`}CzrfP-wU(c17xq~LDDnAd z&mvIDKiBi!&GcGllpd4(iQmM~-7WH76;p z(TGCS(#wLdXBGK|#-RQiQNt{+^S!6pAA{7ua9!!WaJKkv^N)R7Gi$0icB{AHBZc2> z$cyKS+fY#4Wzjo;9eKn+t7MjqIiD6cchV4!Xo4aQ(#T0i=)LWmB zD&F?U9x_kc68>*+`fXl9qna6TDyxG_#`Q+nA%I$h=fc^EJO@m9?(6|g`3HQSFgB!jX?yy&!;Suxtl2W@awV88Tt)_=r-ih%{< zqN9y$r)VV>gZj&F?1{4T_uYi4V+*9u-Vc6+w|IdMmBCZS>RNw*N`c<8{skQV=j_Tq z!QuZYgtPwt$+NKiZ$kKgUjBE4@V}wj|K66fqq${w)Q09eul`#RZvwy5EdE5(F`J-d8~zxU_D+%L1o`^WC# z=KA^f>*Q;FJ;+WPNh%pny27!Dqb0iTLIGB_<`4;@QupeS+q(vXQOZL$iK2+-LB^&Q zoikB}l___0%~N}FG(R0inW5wm3Q6S1LW~1t^2YaQ_?{)xxcwe^N(7Je9~bIdWJ!{F zMlG^6bbio!m=#8hag`erMa-D)d^XkhAK%^_CL$3(w9y;>IGD+*lCl#$i4_LOZe2<<)KYU+}V>da~)$;y-^BQmYg9Es=kX>da>nE%6+9 zXPSy+Hg^b|<{ZBp?zLmC@`1Zy$YH!#4`Cg@fIC%XN0>=o6-;mKkT zRsM!sn=1tBX=SnzbpD`sbq9|LD?ShV@jx|D|7Dw7F8P)j#va`>VpPY?kbc zLwg=NTY$mrYAa3s4O?|()>+DFE}VbvS9RA$^N4(pmvdy(Vi~*H=NcJK0rjq2eO&ZQ zt7iX$@*i6kvxd54etNW%Du^@78z}w;Q5+E3==sqlO6>0ChTdYP{=4biQyb|9`x9fb zh=bp=I>|6X9|JH%h@Bu9q8}4IwrI_W>~-k(G~XcIq^!Gk+;2QeOu2N^o*V0?@qTW9 z&6~A)Eu?s0jLWV)h7uVf5=LSt4x+oZLgSB6YKXPDjxwL+seDG2x4a!SB_V(g2ux~W z0(8Gn)i#z7nsU;gZIstWxBH;#XLbumXGWL3chGd68C7=Y_w-2cw}}Ls1T_e-)g8!8 zKj>5${li+4>vhF#;$civp<53+bXJDPr{?0!K623cDVNQ zO`XG=hRedOz5@~m+uVv=mau-JzMAbP1YfnnN1Gqmr%Ik9b9joD1r7l!rU$a9ce+!+TSW#khLtoRP^R_26_mnD-7dgmcaejO3> zl*AoqIE%4Pj^0#C(51dx-|G8g2{aUG24tXt5SYXlRH#zG%uUg;Hl8y0oy)071N~Iv z*VC^{Kdl)O4A5qpl`G1M4&|PMSCtpU%Ja(<_pum|=~Q>VgF4NkmjM4IuA#=LQFFEp z$yfroQv^z}fDUH>6Fn3iVS8b2zCj!4W@bH(X^J;hPs#WlfI z#Ts zO~)%xRcO899<;m`ue5fih+d@Y_RFf*<0b z0KSkb#w}@rxQPSRjb^;3i1%Jrx)Gir=1pp|03LNzyFM=3vSxGLRDYQ;NMmbsu)Iqh zCj{Sx1(%amgivua>R7WvMsjx%+{VJK+aTa~E6b-dC;gX*?R(t`+mixUoqh6DMOxB|hTYFPSA~;b;u#Q4E3R|8q ze?-}ln(%iyL3*_!-Lmcz(jS1vjTZN`GXm7I#LuT1g-~doRY&_=DAl%^uW*e~DT8r% zFDy0B&NDf1YBbNsw3m^ADFR460F|&w6oIMLe(;i!?-qCb!?Z%ra7rMd1DfI781J^b zBeW8SQ~u_+y(5Cq6Op9@_CsCuE%{M(MeD2nL|tVL2pIz>c$vC50AvCJqWzzj{~ZLv#Q68lKi7KHYVJ61u_66O=hr!J%9IGiz3fXFeBI?! zN;eCyc4ucM%TXaI)nO=-D+%h_>)IX=w4Y>y5xbuRfKc@Jkdc441Bwq+(SCY!{;7Gr zp7h^18WN=@gFa{$XcjpM-0Aebu*ZG-HO6dr&X|22vBHRefg~$*G zDsA7|RI#J!_YMDf3YuV7z|;a<_>{OvfUxM5+B*BneL%tFWtbcZBq_mslL0+dDj#|ulsb;N0A`AZG@56OMX2pEXB zJ!=m|3`+F#da}*CH|k_1Dhj597t~pra8PnbC2IGHV&gp}oxF&?VDr2zn;J_*5)wrj zO@$y$8ZcrK5TzQgfIi9g>JFz!bP3-$A?clH9@>dtuM%QzxuPV7Hebelwh7YH1AadH z`1*2XQNlQVUaQiB8)V<|n!PTMK3lWP*GS~gf81u4i&uPW`2u6MEEyk_T{6Ye* zZW+|nGL^7NePc=_l6fTRrQI|YZ>M1I?wKf)?Yqy0cg(+=`|77@R_&YZIdw*Q_WSUQ z{1RjWF>9Q^!1uW#B}P;gHt2X?J6V0c+No!^pWo~0et;}u0V?=S())Cu3q=}%*7#WR zaG(F}71e+BF5f9*GvNVpKT(F654d*g|IjE8u*bo>pJ(ql0?g9fq-BO0Qg(b*xKM(S zl_)1RB(IANaE2G64!6d52eRD{F%_EFy;MXY`?M|SaxcQ!5Ios8N0n3B4GHTm+9!cM zA||YM*umhvmWj)Ew6wz&KF^_ZbVkuM8x*RFp^FRB+%xEy%SEa)Vs0m%XwQ!wx3MHS zk68JyQlMJKv#@;Nh}S;%?w`wg$kE$bsx0jJ1*Biqpz3t#jA;_7ig>8N}aaawY3e8vdrE zqlxb;#zq(t9-a#MDjDC+`gwcl5ec+Lhlkz^=+A>b%`mKV*%#0+;M*zMO*IL|(LH^a zLy?bh2EkyZl&^Km6T0OLQ9Q$8BUa&#o-*=T@TR|Onl~a zZjGI{1m1e(*;I~PnH`imo8@uj;J=1EtEc`l;x6B*#IH}hzT@IQAHT=Q&209Oegbh( zD}k~K*jQtzX`@Sl_VMEe!xJN~w|9Oy`-944TuC@h%Y}Eh0M53(8TuNM)nQKVrxYG` zj*G6~umq|;wu~M*{MwiA7gtefr545rrpjFk<~m--8bIdJ7z6jpSe+ARgtjFvAKHLA zmpQkPu))K*T|Qul!bGtPA2BA~3tNn4pJ{k;ab$ERA9@b#b{&z+hrsSr zXwAss>bR-P)E%upw2h{ajgYgLKQnU?jpqV`WvqfLH5#^swnK(!l}|WTsBrn%oY|)y zDG-V{Oq0n>MQra1{YAnmlPm2H2nt6|RPl@ere0pHKV zIy=o>y=jV%Fst@ek#X$k=o^?cd*x>zw0YCu3HLXcYzE?Do^QFLj`xxWc?!((M_Pmh zACt>JPe%CO;(c|IFh?NPxeq7wMKK6pI2Ctt4e5ki(AU|nAxuYaJ5m-N7(NgOpWX8Z z9m3^?J{Ue5ZYOu>ZZ>`giE#_U5#xsj5~d4$yP)Oj83@l!LD4mSy}?4GIRA<=UiW5CQy~m<5DfVMIiD5b`{<8_D4Y8MG7#g9A4qGn~`{k?ut` z^a6Sg!z9>fd4mj`fsEc{wHK&|A!{}uT6medHMhT-v8Ec z%*6KpsYzYU{;OGbp^opJDZf?T0WcEVX+a&AS~x9g>#*3C2?Stwqw;*Yq9NpsG}}|1yOBYvm)e@;-~6dGZM`gJB7%(G+RSVBuC3hxK|{g} z6}R>8(}%#bj)W#ldT(dixxGctnQcZgGGWlik21}@jjHP0VZHDFdbz*0$LIg5t_0Z> zkt8A=mO@KmA_8XA7I39OOCv-hf;#Q^>Z`_OQt&er9W>l4M_%3(s@8e4a(x44z$qXA#G!+qp9t zwE}c4maD*`>6}cbRFhP(!bnphlSQj+?vYQ|xPh*a?XdMLVMi2e@%xjc#?=MpZ4__Z zA=RGgr^7tWF zefd!H0C~!@*Lf9I6A^R^BkzM)&S;FbSYnbkr~!-j#sfo(H`<*%jzKkZHN2@}`&R-8 z%~H}+d_Q+BBI00ZUcpX~Dqq>hpDAz6La zrn{_+8xuVgXTSgu@kQ)1JpFTa-MyJgtTEobalgn*#BjH9zX3Oqp}X10m0WO%XK8&k zjGkmET}I%m>od{#x!5*PbPor2A`%`}$tt(-S|D)8oqE%LBthV@Ewq8IJu2Hz-Q(<* ze7A7tj0?z&BE-7MIg(Iv!U!SvV61Y*zD?Y(ETzFKnV}wHpdOxPO2jb`GcGf})j50z zB$2+WK^j6Llou14keYo4psFwuFk=ddq!6p~SZ-LOJ9QQV=jrDb>;VjuvPA||#%2`; zxIDr{TFj}#a!hUMRtN(XJXv4S(g3Dlf}8=hAfZ-9`^qnCHQH&P+d8cvxvTCz)%<5h zVn-2i1|$K$+nAkfeG(M&Bjc|2K$(hzUo&-sloE1hw@;?s`swkOt@MvYdj4=Gcje{7 zUf*K;I`)@jA`pS$PfStB5xh;m6}NiMaFPbOEmp74R>fJuD^HgO&7_~j7u@FeVS)4% zpmNsjm&tT)pIArNU}t6xt2C(XDNlN;q?E zs<_uo(|FYuB3&bSqhRz7YC_)Le_G#!0=3=Ol(J)~=v*gG)Nkn@Yc7ZBomzTjGpPyT@eeml=wf;`1C7Juu7r zfVepr{O$PV2uTT{%Lgb!I4vn?bE<0iT+wrXEb2@fyM&fKWW&g`S0c-x66Y|u= zV3EM1HNfTDI?S$jf#``=X6E-;=dXi|GE}lkN8sU&d|BNQ5dUoZjgXKkPLvDCKp}zE z#I7G*%oy*?ZFm@lF>7ydnrjs%f-B12aoGf;bQw0I$^mPa1EghuGPHTLa`V{Ib(ja6 z?V-6XB>la^V#vxjS*-%0fktj_pw{W1mXDQrwjv$|d8KzUx=SNeqbJ+U{tQ1+5VlZZ6}G zd1W&W&8)CB#ij5c&)}3U!M4<2oCCWz{T+>AClVs|BVF~Oa|h}D>&V7 zxbkLNhuR=7t@7at7xUNTJO&~Vw`G57LxlaCIht}_o2~Vn{wiBeFtcrWaC5`v#DD)# z$2Qd6v1aqSyXCv>H33|_O#b$C^E?KkBTBeT528qeLkouTX*FyJ_U;SF7Tg27$jbp< z4}IedA@Xh7&>h`y=8gu<#Dg!Oyp?_Su=!ovtGm(f&TpTw7!jK&VR8jQ6Nz4*i`bAY zKwSDc0ITXt04|4M;|xCbytY1VANxJn2*4Y6qP|b8%Hi^-vzJF)Mx<%Vmm3cf$&B@J zgTEhGR#CrR%-j1-nBBGx1 zsL;Q}W1)4VOSbFX$v4nZeLMI81)tq5)BAy6Y_n}$jC|X@yZ4zLsRngGdFlP6tF61Dm^gO`j9} zj)We(*kChseWb5Xu&jhVt}+K_=U$+Q@Mc^Ly>=7^R5QVO@d2iaiXyK}|NCPI{ubsj z(5bE5HdDfVqyNgPaG{6c=GIe!-L~o!9a;)Od`dsck{J>yID2adTIt!^=5K577%%d)Jeywg144B1BYE^2KqxST_#PJ`Vq7Ih>~Ki=p=Y z0+F{GMEQj)t)~nx>Xv`bYq~>q=cPgy=A=WqnCOWv>D^K{?8VyV(OLuxfwK1oR^uT( z21h68ETUW3tsUrxvM~Is16HH{O^ufd`V=9TC6rY}9U0(?MPug2;GHfQfvWAFY@Yvn z1OiQ#AsM3P%2P;K6 z`4$WyVEG(Hf}jC;v|s-!Sk$Us6lxMmQHP-2AbBweg?W)CU!0r-0*ZL~Pt=L~ch8CU zjQdWbV|Pbwcg@GUmkrOgrwCyMeG(0Jkbr^Eps+s_fHS?CCKv#SL)&1hCI8EWg&W*Pey1=_5tNT)FyDy` zu{4hHA<&q?R>kjgSz!MV!Ml}fqG!`a8L=d^`I}n3P`>_4A6UQ#yI)NFgqvKu>zKaU zx0K^Qre0nSgs-%_8pnHiYlSi7OM6odq@AYqbX;lM_B;6J`5 zZQ%T$S3s}1a@IvSQ22143pC#u-%Ir;x&RQLB%%1bxnqy=Zj1eZKtF(OzvM6>hI|Kq zdh)+H4}U^#b=ALh@qcbY_;9DEd!~STu6{x>_5v|xU{}EDx&>&!}B7VMgrA^v?Nf-pG0HrzzI6{>O3J}7Wd$dzE7onMH?5STId z1;cf@brOb&0A=OSH$PY#01XPnP{8njdS@>GHhw;ZZ?(FX01*E1hotCRY^NMNGp6n< zEB3AM56KTHEA};PsKT^VeqIDYj52|=D4p_Jr;tiWl9=m!%p{3Whz=L=h?9AYIvokR zvFX(LJ|9!|eqLxy^}B_QC_CQH&+UiSl=1VRhl6b5pGqWefHasoRRq_SJY zlZ@lfD3&VVbMf=~A}7x}EsN{Hr_$${Pd$kT`~fl=*qhwvXa=0=INE1#ml6-odGffS zhtd2hw-uG!!xC)jX1%io@)MCj-`M5~aRD|DAI} zw2>t~+pyi;G~qRc5orx5D?pd7*n_c*aNq?p5=Dj*=^MLP&5}`qRi+dw0^E+LESao9 zN~wsW;ErWpV#PALFC#mw>EZ@#b+Y@0B5U7Hziq2!1Q^=zvkvhl{W{LgSAVY<)d$Xp z-!8bC*k6ZF2)A|0?OMS|sc!_Z<$|!yUukRKbxu)Sh{km({3$BPlRKsqHHFW4$L~_u zCrf(DLLlg(c8M~4&*8|6wo{4CLf-HRVGBXVe%E* z?y5B=qTjnUY&Akd%nUuYCKx0!^5{m@W`E|&IKHvF21JqD1rT7azV3P}{4Vf&xAhwn z07WR=yj}ut{fu}z_#MWEA;UNbmo>_^>^=deg%)-#a9DHZ@ zMq=iWv%ouFyYIiL^)HFi@P>c4I9Ku!Xe>rXus-JRY64~`?bz{y<+F+p)*r45vMh38 z6q$fgBHbjcH9;t=nL?V9xLRkscC9-PvwG^}8k+l;v+rl&fysm%B2%t+tU8*^Ugx%L}QJi121(>s8O{+fJl#xHZ7z8m!@N*srv* zWG2Yjfbj0NbSDScHt`G#FeKTZWaHODWC!)c7H}z^q*#(sm^+nJsUAN3=GT2joS+ie zZ@TJi{jLmZS;PVk(6C-}{&mx*2>oe}TL66H1;R*zop=Zru^f?Pk+=#&qx>|D-9B+j zwp25|(+9$D8VPZRF)wpe*dz8z-uARo6|`N!&d0+wdn3{o$caYienJY9un&7)J3)aW zqK@bOXWo?74)S+sLII5Kq_znG+aiZz6FOhS%vLnfuR zBx`0#zsS&%MI`*-~#?N-nwS*qZ04O@R~k+eV01g9eRv8zjjso z_CT6&@CSXt%3H7nq;tiaf#a?IS*l2t5*8#*ATJ&dtD*Px209+9m2~MdXZmV`cZe4p z)rEfACXsSbGM=M44oO8<6M8Xgn^CTjwT-O~J&TGRUWU;{u~|j4jk$a-q^jSjxD*ad zTO32{&RgoCnN?oV=>z6Z#k+1ugohS}Cxq~8wA~SyBWN`cJC0Xc^U{bj+t>=) zIw+BAQ^2Lsj!Kv9Zx;@u%rhMNos_KId<{o5&>}#D$xjnLCM0aOu-A_7Y`TOvj!g!b zUG=Hc`dce6eC>w-o~Nzqv>RC^Hs_H$ z7Ioh_-cS0=3!65jtoJ(=GW&FVsaS3#N*-NVv=9Q~dim6tJLZmkw@`Se;ILxUpsvj}1T0@-X&CiI=)Y z7e);n8h4}co@?xDXL4u`@;I1FDSb01{70PbqLoXECIX5xzdwJGVBo(9yYvW^JNV(G z8Y9fPB2Ju5ssvV()0GOZD7n6^%#bZT@riuoXWOd4ZFxjlgw^J44?D36lRhQCelBh}V=Up8 zlY}EP?X)u0k(WAJ*?S`PH_oFa;7C*&`ju$CO;ln9?Pdnv7-Xi4_$U=&^7Km--= zT*y|ej}o3CGP|M1Y>wU3`(~)Hpu%KJzD+94!UkdIjGKeSQ(lJZ!+>R4Nl`GSZ6P?P zMC0AQ^b*cGrr)?^!pB}QdJVjGygDJF_KfGY;_~MSS$YlJH!8H~*a6NmYk%JUo;^Wo zJio}LB(v^7xlEIos`cM!$9QH=mPIywtOhMMN@`QR%};q4mZrHJvF&(VN;f+ss>g6!5@`m?;Tc^?>!`K)n z_cg+M>PhI*1$2!(2Da$U8>&Jvhw-kf!zU69?q6$b;=jdx=Qa1#+_Xc?8l|iBYVPE^bcV8}S`BC~%p9XFRGsF|QInGn7VKmgksZh| zd97rsFDCs-gL?SuVb%JTT-|vYgqE+?R!nc_ES(!=IP^YpL18F74H|J844KaDOvo{6 zFwb}THL>5zu@AG6aN!$mVnZSC;CcP4x}Oxm@fN&v?{wbZRc^oP@Ma15@cRa4!!eDY_>X~gV^MYTsJ%0fcF5pN^$Wvm7Ph_!4=HjOs4b*aT&#vvnJgCq{0ZxI zu({J}#>bi2z?*U(&aDwN^1-Hnz-FMSXLxmk3~f7Ef4g*|6(3s5pD}C)mg9pka;p-2 z5A%Bv6qj)dv&(k=lf$62Z+bipEa0t|Xo4+#;!(N(-68UMF;}M_pja2KYprzZZOBvj z4RLY~Bj-ujKD1nS>WY~Er5Hw-I4rA8qyJ;;sl*41j+1Q7|hY8NQ~@v)lfPscB_YOzbMjo+0& zb;~lRcSSL^#S_>-eC6|pgou|zXqZ$8Gw)>ff2z4oFPr@2rU2-SQg_}sz{2+xg9o4!1d-s8$ zt}tUyNx!>r`qdblP&R=ejg~-Np^vzqJlb`y!E6;0*iEF{Wke%3G?4nU@Nr138Ftxz z&sn;$HlycDkZEj0DpOE{XI0Qrc+;R3p+L>*?ROg#@M)>ri!{B*t4Z8nRg3xUV0P+b zh!RARYM!d}Ema+qaG@eut<=_2u(B|3u+>#&bB);jDf3^gMPeaD7eric1 z8trP=AQ-SpWGHBFgj}hHXNoPLaDx1=I??`#)sN7=#VX!Ym5D^A?v1F=B(sGk@v+w? zzFtYUMWf|9uw%z?ZK9R#p%^cQ$L|rnAVg&S>8%#wMLJt!G6NnOmS&bQ zF88lPkA4u3uW;I4T+M-zpbbY+HUO4%`=!~iO)V)zlQEKBLanh!>ptA%HmKP0v4{3Vh)DJP zyk_?a&vOtDno;{AhX>B{tTI(t9;nO$XG6cjGT_?GtnPg5XRsy#f0R(KdShbp%Ge|v z;c9zJ#1Y*(Gxteh-&M&tEn>N9iN79MIN3=9^7-Hnsi~YDAAZsj2(T)gTP0Z3F_P1W zvb<@cDg%9Lk-C+(WCHq35S4AJisB~>{y8dV6~~bZ_TW@?nk4ygPc2`&UU4>X(XR!&-1ShdLGe(9EZ< z5FW*kEJ3qGNJ-ae1*~C_p@wyN0o!wHpn-;TqLu#jujdArc>!G?nr0QLo_T1MN3uK^ zErxC%z?wFYBy}M&$O$|IhUH7#BTpOKZ34_|#IV3;+3MoKPIu^}j%A!(!Jb_acy9Wx zsfLSXTW6YnQ6cMEf;1O?Kg{ZfdN@gSMokLDtDFIZvJhb~l}bH+;3w$3ygB09u(q9J zX*3rHnVXUs7D;P!TYE&WvIOTHIhBg>{pFZ~Kg)`!w{I+HhbOf0kBp42Gq?KZ)n1l>gvEbQu^3t}hJH6*Ial)68K0UaukI?WpH=^x1=2 z&F>~d5yANmZ&=iur}s=6q5o0h)Ov z{Il;K_C1j`0W6;5-(GRzE=>0oae2kYZ3cJFSr`jVBN-R-J)1K3mTF4G7}5ftA;M0b zB{hnL7M@Bt4_;a|li=`0?OOUV9`jsi3Q?8Q2uDsHNJGwjvaw*GOT01(gH#^S#KZce zn27+TJf=yQ=k>xckyg{X7G0n;)p@v)!V$0Y&I4NG4m~3mn^}X5ks`KHRnL~QgZb%Z zILKUQUW@B$bYd?D8bxF75P&S0cymIZf*srpRsZYwtPkf!(Hy&G0OGsail4Iaj(NQd9987bjzCO#{RgHi%&3feiF~5#2s$bc9@c zg2UdnN!jzTWpTroI##lx`dqEXuacWsiWiu1Tnlb99UjVG&g#70r1=)CNAS8DOBSVV z?M7&yZ-}Z#Z~Yks2`O+ZiP2}6MEE;FSa1$cL@y;P+{4-jVdZ6yc7Cw;I5>2VnQHJ4b z==A%>TgjiTvx@PTyV0Rq>!RP1^-xH;7IpG%!@NR;6!Z%bop?O4>)l>2>u2Lsv3V5~ zsPwu{DO%v~RYdH7e$G+9h(Yutvd^$C+wO9eo$rivOq@L{DW%fLC?T zpBecKdo9$>&%<%sm&AXE{p?AJi9CF_KAXLo3d9Vm z@shcXqyN>x)VBhx2L+4DQyBg**LI8!VHuMIUK~?yyM{nGHVT%(oY3s5i_7jz^>un@ zA<>z!iX~uR*jI4Tw%S)343<@L7~w#eq73Yz-Jz%;*j4*hGi^lDF@&U4n`=|53VvgG z4*~?y>!bM+1|jPdYbFq#C?sb`tbKS;LsJ&!ts!6RfnsP0A?Gsx#dk*9oR%okhmSp zWZP)vo`E~updke~|COOic}C>O86yh9>5D%fq=6BfRx*(bqiT+ye3Lf+a8wCPLQwSXA4_E*A!dTIP_G?c0{) z@b4nT`rqYMCcGa7_@;u&+_Jj56=S-e(S&V*DTLy>IAe0r6`5S$Pqhb0L#W)=mAWxd}ex z63+Oh!OAW<+86T42w@j#5JoXKBtIg<(F>V*w0dqVmd-0Yvq#oW#_%ALX&&j<{w-~f zs;u;Yjpts16>}(l8VXj4c?C|G4OYe_NUS1nK#~+$;+L|d#+^7WMOwM3uXkxvjS_fR znF&K6m$4qK=}6KjH3u%)h|q}_yjHM9&0N|F;E$FR@@M@zMNUILjrnYKHJ1Z5;O zC&?GD@$BrBoF(CzrWqV4YLolFF4;C6!7XbiU`I+~88g|0+=XHX1x!t{VQ)IJ@MI*) zX(It8ZD&L5xw2V3wgh|8Rq(1fFCd({qR_Jxo%NM2N)s!L@!9xM`vl z;D+?A+On9*@f>V~Q@w_NFSc!%kH6s9Q>CWKT?3ozsXM%&SC}f2`F*B|Fws)sSM9!b zAEWcqajqR2DYyebq~^0yf~QQfPJMQg3Eg0Ny6k5$*9(2>NcOSdmi*|zl@!}a#iyKq z;B&5BfMsR}7x8A^Ijijy-y!9CD*w6INCcA|p#X*%^Y5isHwmFvDxne<9@K8zgOPE7 zOfW#C4Iey8vfHW28_izuA%Bs357jLrbiQAw5NG_S~5)FaW%Ee<)`C zs!jlBlxlRi!IrSgZlZY^kl(>y;(Y!A3}Z>L{3mC5|0Pdu2SJfkj~ke?7V|^e7SJuoKtRT zL4F!t%j9-V?QTlEe7Q#1+B(v9H@D*C($rkD;Ns@3U+Jc5anXBOBi(6wy4@Yk{KKU~ z$=TpTit!=e;vc|s`Mvd>og}SDmiSf71Lw@Sx7)okFlX<>VFG8UOD{sp<`zf#Zo*=XL8P&$h6?n%_!DO}-UFpJ{0O-M-#So>Z9q88OOviA;nJn-&`Asg_ z1aTL1ZN(*}C(o6{#?3lB77e>@y|H{1;fBi2H1P|?$H1sGPU_5^9ET2jFTM`4UJx)y zMffT(BtQ{Fu7LvpG(d)56fhrbyeA(ZxfXRWxB|FX(FABdDX^cDIYb^Nl=Uz4EGht| zqLIbm8GLFmP7$yjs`ac(om$Ef=-ZcFla4p)eHe?G9&m>;}5#`Uo>#og$Ysv$MMiq@?sV02s(N;{9ZQX&)dgg#W#|zkKT@2k$*3X@!huktv45>F81e!`*|f%uv17%#5D-3(6(NR1=GvHoO(h(K-$*5=pjt(8gVx7e?r7G!o)UAUW#sC{%afw~%?J&)9{#Rt2oG6A|Aus-HEpY!gw z6QjGS>L5Lg_79QW)b9zmGsCFuS5f!#FE-h;6$LE*pz!F__*DD9YxyeQgQ1?p%=d%-kT)ciIc*Nk)=+I(Jl0R{Y`&Qt=-n11X)oO zr!`4GUdY|)ewTGV+DWzjemlOOs?4SH>G-_cSP6Jf`D@0-f`q4(zMI^B3|Nk}@#${& zx_b@iQ>|kdqd;WLHG&C}`>kH3`+1L*O}%H!E3+$0n(IY8t;n zT%RygKi zbb3EN33dX0>lp>nNe;~PFXHC>f#ad%Uy3Gt_?l(~(k^zskuvcV{l&Ng+JvS-ju_{k zp7okms_?G^$$CP-%wzDpQ`Qz?h;Q@;{}{jcbBseARQ=`j8-R6Z zbXW1%tiY?Xb_{trK2Rw?9`9wI-%oky`Vs~8>aMy|ipHIlan&{&HTA3lXM7Dp1?Qhd zdaF*R%4Jcocdc#LR@(L`klsYRpAWbjB(mfe$=#mfuis~hp%!-&S+DyADrvvg;&p3P z|E}zss*|O`hgG!$poo(z_{**9D?y}yOVm-2lLDf!c?Q0n* z8+9m9YQnyd0DToi|E173(doxUagZwOx|@zF76R=M_ZpEAr!*eZuse@o9FwjyZfD|U zTsoPA_u=_bE|IFNTBG`*9aO61P7V!(=@IBQ&(2Ifh|Xmk#kY;^zW(dOFsJ_P1T`iE z+8+B&0$a2hd-s@c4nsI5S0^IxFB0W|>RqX&(tDP%KToer)0yr9%S)2I$!`-jR~}lY zu~W*-U3M3LZ^zKPK@`TmOqgi~VV@w>t|CMEaf*~pQ>!7%_3V2 zc%?o1hl5vCEuS<=CDoWW^B(?3Mh@htY~_@WWRfv~SWb8hJsAh&ksQ2`dVuF+9^8?? zv73^N^XNTo^3k3H_GEVs>0}3SnrC>w`Li%La>mTSB6V_1Gg5>BYRha)BYjXG zEYU7ChSSavLFs2q+0iK~n}){CA3$!cIN){FL%;57Kb?}>O-bZ!sV5e7$cc~A3(gfO z8xejvwwRzF3~a@Puso2N2u-sQM8dEMhGE;L-PxYlIkjKr)@*QShjx!BEap;FI-chJ z_K(cM5j>%K7IQ0p^1#*Ypr+d*j@!YL3r4y+T73CD742Jg5 zS7i! zU!F*TlPJD`i~We)gwZA+XK6EzI(Ay$Nk|z(hIs~9DG^!<{L)SxTn|{Ar_Pe|(glsV zn3His5_{YV--fL*SI(sQF=O2{9aeK3;#KGG!5(blB@c?mua;RjACs`Xxv`X*-IFY% z^-MQSYE`@%+?FS)Q$yI5KOvO|pJNd3S|G1L+8}Dl_=rKc$_*MMwu)y0`Kc0IC|=32 zV&rCoUvg>og(Z;&&aPHkATDjxc%ETVsjFtV$U-?WWUQd?)k!@%lWHl_Eolr;u$BxM zn3ZqD`9AJKQRD_dMAh|}XP9IsbeN{D=9%-tULaw5Eb`x}%nm%GYJf=RyvF$?TF! zjG|mR=L6*AXa0&LQ%Vh^B9Cgf$X38792Vc&V-BK{(E;GQNmL-XllFQ+ajEP9TL_A4 zs7tE`EcW66npEg-f8dSnw6k){vB;edBJXTW4JsHWL-Z?l9asC8fXgKKXjEkLw`i8h z^7@-mDFy|eQJrg8 zgIAB`t@A7pFU?|IEM`baqf5ZXYMPPB$`!1kFN8?&{q$YDPSv_n?82_>^*#i#U0bj~ zZayIeIi5gb#%%r6HN-<4L2+4)0=4^Mz*A@WGqNm^%l%u2l8_N69ZCCA)Z$}XX42S5 zeD|#P5z}{Sr5-7(y^A)OpUuk z!{Sp>E61h$cZ%7MO5nmXT$bZ^Bs*XXcunrfX~@3c8^=ECX3o7oAe>Q}^$Z{2hyQvm z1?}4Y3Y@0EGgXEq!cExU67skftfooZDnL zZ9l1vSZeXB%|cKMS-Q1#U2DcQSl4{9$FL4=p zTR8G{J|**oweNahX((z9XZ@&KFb++hMj3M)GFsEjl*Ujff}!Np$RstUjiP;|rXy2S zZddG{WRaMg^wQ><477A8HKDG9T^%T+kjo}N8)_;H(@+D*h5`!#E~06wY`~d~*^2-! z`mn343uJF8pYF8M=3Q(lYM$P1xpzBmPCiUQZch>i!TG7UUb`E%a?b)=wHrH^iqqzn zM88LrSDHn*>K`qTedsa=1UM2 z*aPzOXY^B-}8my%2?n%d*gGfyp!Y4RiI3u13TQLPW zLo`jH&?j+ZhLelp9q8i5`kjwkpUeT&Xms5*CcT#)pi*@9ZoRMjIqHK>oBhmeIvg^Z z#GW|%IE1t|`P@2r_QRs=dlKvNmP7+?Yh2av+4nKl*?S&Zd9MK({y_a4k8;{Uj|#z} zVYTD!;QX9Kd1okBiOx48PY>B(LK6%s)W_(L#15v^%VSbcz~fl|)>J7DukeOa&EimR zRBDCJI#x*OI5i^-7tkE$xoDXvCZ6T}=}*e)FL{#K`Ik4nR*w)-wf$BVcyilnn*vmg zd4A+P!(2)9ei1y5*u#b=1L`6OPJX}T4)d<;*(7zbnd~nyuxhm-36xIgRJapBb51)VWlMR&uFA)Z@<3knLytq>XD z7i<1-8WA#3|KzS@EgrJ#NmSlA;$P}{@6&eHf-E|m)^08DRZ8%KS7|$xaUv`in1mg_ z5zlZD>Sy2#)5Z*Ld>4D>yW?8_yIpXMvu*+W#~U{X4I$1;m(c!ZsE=33uB}eN2?NA@ zS}vw<%XAwgbFx)A$#2C*c^eFt%;DXvyHmvyW zzPwygu6qGG?g?11zjH--0`QD65=ww}?B5_gHG=e7n?|9VSH?~;b5sblW69%-?&}1(*lHjy*G8a1Kx(-kH5vC_-6$}8WK}x2OkwhKb`8hLnU&o z94hM+k7;{fkZVYL8eg^q2v#K7Wm8!g^=Sv(LRLk|q~D+3g^l%aYHCPo+=@e&R`q!+ z?t$}zvsSm({HIP`Mc2pU<6Zmds>CP!sHWYyo2KF-vp@~?X{%EDsm)hc$@N#}(WSYn zm1QM7yldsqriTA$LVB0Ia<`u)Vc#o=x#*oa{0yygAKk}s?ft{oS50>x$q41x(c{5~vhh2!D2ZF50J@#0 zUoy{G>-s`C{97OS-ci})+GX7^8*^K0h#0TbZ=3inzImIw8KcxvD2-Z6jvpl(R+Wg` z@>tnQYyZxls-Os0iCXSyF@mLVZ^-INWi;eX8-lP%aKrSt{MUpE#WQsgW~`!4t|kT7 zNh`sF^lVk&U;Yk$cSZp(_uj9UrAv zK<=c0j9Xzg@SrWnVJ+xW_$eJ~b#Gb1fX#nef9F4+(^PS4W@R{_6@F1iI(-y-z_QGo zJx*WucWzI&QWqw99qx^we4?6bF=^JSz{?_*>B=z7K=N$W`HX zH2iT8s9I}|C#5&p@sUJLTd05Y3?1NtTrYw?Wy|R@%3C@^E3V~ zA@-30siUg)B=+-F;=%v&5s3Iv=ygT>skOb*lRr&V9G^GM*}3QO)c3suL~ReIT=G>$ zW%BVc?3w%+&Pl*_T2J$|=VL5eY&73pzxvIa$&&ix{b6BKTXFW8d0zWG@9ccm-hJ4G z(t5@YmrZQ%^_4eeqM!FnUBOXRE}mqoRcTv;8-w0VWRlT*L>D-W^kA)R_$RLza1QFo zVRyM9xwn|@57K4qc(sDe3mR9h&mZgP&)b$GFW%a2oDN@DUq?;9*2TA4OBhA)Uu}$u zb+FhO4TW~X;i1gC_!ABiVhht3=XCoQH?<_0lcs+qAFGPc((${CTe4^M(!&*hzV zuLH+EOqE-tRT~ZC*6INpQIuqvF_Kjb?sAo*2kxk43nnh5Mckkiqh}U#%WEi}-tp;& z6%zGD>$3J=r4@)$)`O_Im9{R)rt*uatS=w$H-Fs4lUIPMzZIX1S#{CmI!~pfdMd9i zn=JQmOAU0k>M3|sdM?nmsV;mq(`UzMhc?|+?j z_D`ZE|MAg3jh6i5$^S~(EbIU6{8G`jU8hI!K2d#*7aJUuu}VSTaFeevALj3 z;+q$l0GIAZ$b8;8p(FS265O%Sn-4&6iV)zB6#xf@ zv*7>Ru5|a0yN~;CyADBVRt9Sgxdl!XR?)y~H1>zJE8o+OuWPXm$DL-+lKOBXM5ubh zdLbaFjm>iXvPC}K>I>2U9D$;hrM%LH;0GrK5%qD=?BhYnqo&$3EA-JmV)#zRGzm1_ z0T)M#EBeR-DZ^nx36{mq)W#!0rO{q1ond**EF}qzt`3`ndjGVs(>fo%L$+RGRAy`- zQt^Z5X#mAP&v59oPF8gYIgp-G(EJk82!Zkk9^iih#(>KO@d=&@q#|ALe@mIDG9Y>u za!f{ZynRyUsD_k--U9^vkVo^U&GJYs6+Fv`cc=wjjPlXVb$Htn?8bm%pUO$KoyX}5 zSQ+wJBWuJ^C=dPOjG3oja0&>=-X>$BWvBrFD~8@vIQ!nh4@nyVbD~#?l*qqc;a^E) z)2T%2+S`=`?^y;EATMzSjID^IX03pJ|58GzP}#7dQYlVNou|eFGS||AEwWGaY*fcM zbe^RGSdOL^4^Z+qDhC?tr%|$RUma`bWd~W&4ZTw&+g}#Vh*fDcFF_(*V}?qFQE_I~ zt`ToK>cZbmVNxEJrHkd_h100`BrKy7wPFRv*nyb=3%s`Da+nFZK9gMRR(4?gV4-c9 zIJBVT8Zs8-w*77JT62@n-(v1ndB1y`BNq+f3#)NNSn1MP26cdc1^jo(5xFp5;;m5T z!^|Qnnt-5`nWPUWzA*XWLgjXqY2^HmGjF>#a z4tJov-=(Hj=f}|3Nu6qaika|w;bY-zCxf@ShZn1d-xu)2%|Gw|Jx2e*=Kjwy^Iv21 z{|^m_^?&0L{(}MjpTGCNR0H8N{9F0Y|DXY>Y{jmNAo!lt-X0+J?SI{Sc%Bci1O%0c zlebD#GIL-|cMF1MqC2jXo&Rj7Yhzj6%9o!5uRnRse43ctb%D>kY(M&hc@&02aSfNr zM|jGgn_rvjo1F^3Y@6P{UtLjS&U^^=0TY`0mI2G4Hs007+)FZlnPW8bmgNEED5*^_LZrOi+hhwfLH~l-ZRjG+bu;M9vLcNm!~^| zVZxe5fhq-;xP%aFTf3Uur(Q=mtCVO1GU^7zlsSWGyRg9a=NUigcXXI61}Q;3<5}r2 zV9fUNQVy&JQUsG`#RXSvwdcI)T=6qns@Q`~|nh7i5M#vxp*On<%DQ7sR z9BbQC2|DLl%*~JUAtsfKm%041x=k=|2R5#r2jNaGa*yYmR(J=gA^(-&-Ccbs zTfV1C#PT`#?F1FeaQqs?P8t({i=nOx=6J|uDpNhay`B3mArKA+**y1gRY&#}hYS

{{cbbr083gMyLs4{PJYey!CZWo(uV7w+6<0yA5+qsXoeya&mN-()!*P$y` z<9vY-v_F5O!N@Ke*20j_nt4#Qnf88#r+!PCEeF{?KGpR{#?e|+c;$OP`z~G=FMPAi z&ND57aM{fi=W!j@x!>jQop5@TwQ}&Vt!j+C)#02E*3Zyne=OQVnM zoEw!t*A93gYZ1MT@C1?BI@*lx{kDdDq2QseMH%9{Y1G+=>AgY6JY zcBc4p9{-UllyR0H7Isfh>G0}j7-m`3_h4>#0$=Npeb`vD;_A^9YI!&C;egd|C2eUG<{fDQ3?ca}P{=28(KUD+&pO_zP|C^`aA5Z>Q zCPqeP`u{2Z>QYy?-4H|iEB@MD2mq>r``Bj)1TCn~wrY?W4nG{$37)aKGv58RJzyKZV zXlhw>ryG15o0QiBP%3zvJHCb+hXQf8y}yI&yWx_UNzt#l<`tl!8_XMwpUJTY}99UT!&-&bxv?{^30U!$rO;RkY@3oYIB zH#g=5-`k05l_bqyr@AxJLPdSJ5IJ(GB7vwOMe>tx50?3v>63QOR>zZ_UEH`v@CC4K zl|a5hM@KdkjScwD>8E*xFsDMiZ!E8Q_T8y9$H4d0D9|3`LGlBl)#l*@W99>& zCWG^H-1Pc>y`kFXp2mo|;_uiC=jG+M$*G+Z=L0rW_w?f4=3|?O)uy#}b{7X>a0hXs zC`k31v4OZ-M#Ow5PQlL)1ibQKI44mD?!loj;s}li!`3Rc+Z$DkQxm^jeoG~sry%jk z?{XCS%Pm3nghM}}5PQ-4A!`&*y%Kpoo)m~=Vms#QZ1JR+*i8Z;raA6Z-T*#WdZ^%N z&$DrYw`z#Ko?%W;*ljW50%9Jy!|vViIQiH1%`r=dksrsli#^YlW!zEe)ZCN@0#GxG zfKeA}Jg{0Gg!<$kx?jY+c>%X%%J?FN&^nyjN4uo}IDbVr1;DTY@PR8Ukrg^b+G+TM zyHfEq>-O?Ct zq1*_BhwJzuQAAz3^5B86LB#0OjWD^C1K3*GLI;8aqbO;fkgSRdACqibMzZxxp7Ynj zlL!sxyq)1Y5*3}nL*9khYy<(Om2LK1x#!SUGSbMgXz-HB1p!#Jw6IdgEj~LB4NBm( zuOkncHP)hswKxwkAaO*rE}T|T{=P^6=X}tORl2m*U>q6_S2m5#%xPu^7Y$3P7dT;5 zdC#p}zFMf6U#1zyIj9J^NHb-zl&1`e95tT+@(wk|Ih6pRzK zScieA;hQbs=7Zk!CCcr-VR)X)~c9(C%-woHeek;<1mg?$6LAFl8K58$;GF> zv{hl1Gvyona0W0PTCvU+a#hht{3}SH(r70k$3Vf)vN1$cS)3C*KM^xT>|A{rX51Q? zp8czVP9iMv-Z`;xBg$wNjX=T%2Z~031fWITcfG>r5V%x&0H0$*Q3VHK^CXWngA`QW za@fdmq!8!s5yLsSgI}If;AGfP55`dVO@GuX$7dSxc_P^0iMs{bc00XaU6YVeB2bHNF%dV z3R^a(!=vWsHe=^zyb@d7{XS^P@EJ$pW@m-1n}h$fKu4c@$kDmNUz@cKCfMKeAttEg zL&{3$2x{{jYGAcx_4v}2I%}OnB~&g(KtWstW^0crM~0dD*%)yh$Hq`>vm0!%c5bWH;`333HXLtqwu4bw}QXS=k5?tF0AZd5r1 zUUR;Az4>dBecH>rcTi{R$B9pLa`v-eG56^doYr|R2j3|Kf0vGtr+hzp-DACID}bb1 zb4-BHgnDeP15bXU5rU($6J)|g(*>hIWoBrDbjygO2?ZT7B%pR{`LS-cZE2yoHx?uU zvp~WQAQ!Q}4Q8L+Me8az08;W+Fet(h%R3Q&tc zcg!>>f!^Wma1BgUe$NcG?A8#Mkzq@K7wOFbW|Zae5oPxvQLO2DJ1fc4kt3A3+)8fO zXQ>fhhHQz3M~-{>%^^7YIh6n#&d~3i=WNdkoU#*xS_H3nNGW`lz75_>JH+tux>C7Q zv71?{WjuntrKSTN>?%DaWMXXdH;Qv9Eleu@%E^BC=~A^S=_%Ow@-ekQ;swY@Q8S>*$r^ zG{XX+m=Bkrm4*@zVWWpBzgM@5td`GBl~QL@t~h&Xxg;IanX(UdDh1j$GTUjetKk5k zmK$P48AE5bTZyPbSqs`iq8?4g9efr2%3atKt{w`4iDEL{OM3}eq5nhLI|f(Ut?R<+ z*tTsO9XlP{wr$(CZQFLoNyjs`&F*Wi@3)l$C8luPt)mq3^_V;!w2CAjLBt!(4wQKzkpw;usy}xI(nUC79=H z9y)X<6r?se9OAl}-mOlmQcZmRVVt>1!TLHo(Pt~Gt4E!~D8^jk?${*tw-kSg z%uU)PJu{3?-cS4ctFpz89naG7(@k@}u8*55vo^=a+lS|@Yh68PZeyaa`2HlqfjdOl z2-)&9s3ls1Q2SC+#aWP7?XUQL$1GH&GN;k@Or2a)$5e*(PO82m8x1wW^>PheI>1h+ z?xzd&YPJ1h-kFY;>Il0lW9AgsxKvMc)?)Ikw5V3D&8!b9<;cu9W4>5Sh<$>TRKcMY2% zN&Qkjh%bZs>f5NaZ!6VXY~iYT7Gi#V(5NqxQyR9>VWUDsrX)gIByuH*NL?OS%e!>h zoOhcf)UDVitG&McTmkm@CRpdie*Z)EQ(*0sz*`QQt*Zed6r)O~rT^agPv~eJMjpWm zSNhm>A5YHyl}n5?U(abvSlO=unqX4RrkQ(4C+D4L5bg}50d6ggkOIBFF0R*m&`Xdv z*>qsuC=nQ0Mfu-`PIu?mtQvz|*T_;LspNUIhveVrZehjF58e*^_z=bSFoVIAG7d{p z>=jqK!lj2GIme^MSrPFKi5GEbO1ax>*tyFOrcbpMpuaT?xPwj)+4az45a|a@w{CW> zRoZU$b7Rp*3wftA4mvqo3_%5}6@rpM@4fbySR^vZ8=u+n9&#H-ytA5#NP5V}VJ~2y z<&c9gfXkupb8(W_hW)_`2~H!ENvO`{$~Yuc^m$P}O+w*4EMe?WdIHYecy9JJF-}a7 zcCrCPLXUTTpJydmDE0vYr2c|Nt`B6jD?0~V_HQsU>p(m4_!dR3yU0q8zP^+I5Nh4R z@ZE5-FE6H?`h5J88%Lvq7FX&3EOT8N*9Dw3RU@8lv{ha-$RIcmJjht>v}cdDN*%XG z^VSmjZO%cJZ)f0-le~50paeS5F%#+np;i#s>jySUzOFE4$M$#=LRa-SE*MPm{-n-CHR4Jk-u@+=5 zHx;v0k$B}BgI^wJhlJ4+YilmeH#EY*r*C0TM0Q4o?ZnE?bXt&Un8G6wl1&Xl=Z!*m zt@g;df@%s~W~awpmJuy~I3`I^kJ{#~m}QzzD$hNZl6QdcM7K5bLG_LRq;7GSc{~@; z)uW=5)^E6O6nv?{tp!+IXqzsIcXkZ5427CV@iIId??u%+nS{T-FfYs8bK0#S#(4>r z@l35<&|HgWD7e}AOwL9K17`qu)t0rRe6vli{+4)UmJzVdpcg@stBqFk9K*JqaIlbM z;hMT!YujE%%o$lMX{h&wBDA*(t^<{nv7Oa1*(A8+`ReforI)#^`xt(cOf*-RZft1) z^dgMIZzjwHE+A0E2Ws+f+*C%LV%*qra|_RK@2mLZn@14I=#jv&1USy0of_zH%P3vw zZk(w?k;bzj0qi=(p3lIjV3$-$TlRd57#ppi6by5}feTTa5+r=!gTTCA@I(|XK`29p zPpH&#^J{z2WqMrRC-tY0CU;SZ+kVI^B<(Q%pb+;RgjipxZn8yHH*Gz>M}>rRKKu49 zyQL-I1{3)kKBsok%J&)cj+G%DIhd;UKLuOpDOrBh8)4}oN7{nn^$x+DYI&cF(2+Tt z0xU~iF=NcvT46fY34+y4U40NqU?+x3EoAL4NSnuBD#Y^1CcmyU1B6i0h?XNKh6Mwh zEhC%{j)s_GWX8eWj~8|8pzd<{S;H)hgwuv;2~z}K66z&v+D#SNI9vKNIAes*hA+3B zE~-&lHOk=qZ*%z}8L49K)$<}J!I5S0BJ2bx;+Fx}&n$)Moor#{AV3Vecmei7e~Jf} z@;z|nyQ_N8G#G>(AE=dB?2}AC`NK}Fbx*`)n-F=eS=MXQPtGerw~=F%Io?BD_SJRV zls~ir0o@BA$-5iNRVTHW_@(Nx#V75_>M+s3b#Wl>V@1Sq1R&JdcdYTo5T@@?+#JP3!cTvgXn76 zB(_|Tn)xfnjr&-a%lecmpe^~hUsW8ESH_-8hH31tn?o2OHztL02)e_)x{8$J$~r5* z0x+tac-}vT80JwHQR}5w3<^IFY#u&rc!P>Qy>2GM4k54hrG#y%Hb^_ zoNu*h3UZk}PmPy!H@wq89Gl_Ytpu5{Ia;fKOkm z?ebS5a-)+rYAmkC`Kz;A->TEPzCbz0l`1CSE2EK$RUS|>1M-+^%scjFSXh1 z|FJgvuMpY4>oxfM{$oG#c2%*GezOmeIWZd9RoEScSida4|hljePyjod&Jqa`gDMcy` z=axv;C{{U1WF5L9e$&|xpO3e*k*q~7GfVP`Q*9b{ulKhRuP&$8tB1O(JOaHNcL|}d zJ_Bn1pn?G`eC`N5IZhc8YDkR9>|D38<7{NQl0ONg+4ethTfxUfr8raYY)GIL{Ty8G zPJ;*8C6E=MlHH5cJ!P%*xk~|r@S;|N39c!Xr$#W{ZO!#OgrZUM9%FUiJ!OdDM%bsy`r=T;N zj>)QyvdL9()%B~&@@DbOvc&~Rvj{D+CQ_3@+q&>%DIZ5_?0WlaHc`D zl&~5wJ-?lqD_~lL9|_2AUi-!+Ld`j)h*yymVj=I{sDwz_MmT4sipWKt3ZK|ovOX1w zCMPO0nM_d}1(VS#LaAe?C%7dejJT=<`Y>9goj(P&P&YlkG~i9E+8mGC+ApldaOq!; zPBG+tKF_L;IzfLfxVc_e;rZ4Nv0-CMaJPLMlnUx&dZ#6)GTM*(%Hvr#U12ZEs~Rw2 z*HA)>U0GXOLEu<(?U*5mVNf!WQLt@l>C=p|a_exsPV5oB__>il(@HqMzX16}>O3dW zI*Bf$f#zq%Th|1G7(H0STTvBzUZS*dqIOV@D)G2yaq5dy%RWv%Ra)vF46`)n4$O16^S3I%?E7jt}qy50mm;gr)4O zCLtq;DiJ8*1FG8sVgaT7tEik_KXpY$)t}LcJ|rrM@stis?XYrIgclFGP-%ciC<{=A zAQMi2K`Qg7;VAiZtqpLB3qA%5=P(Qqw@4nwA)EU}@{uiUKaaP2Uq^I=x>#cNAsi16 z^4f{ALPShuknBpKN#j+PHN{u76U|7zD@k|)`5f!grGDVjV>$4N`seinnqKDf{| zZ{u>18c!{2%6yW(md9t;FrjAU75UgQwI;K>aU%ooDMQs`Q8o6clA5ESEPBk*jeKbW zhm`~yh8U$z^St3+BngwwQQ`{C9wVQ6zb#JaH`zg{?vT++iJ>dH_j)oil@Hm{rm;*o zYp2*=UK>mjk*6Z!udF7oL&K=Lxuqv?^NJ&KTYzoaYaSEYhW9J$1##fXmIyR2 z!ciLrPM>uLq*+B?j;-4otJqT5#L!QJ=AiAG!?@HQ=^D{b1S^M5NAaj|(vRNLKHk&} zJaIkh-ko>-JpDn@GlsK%{pKG25Vi}!&oDV{n^ROD@0%fQojk_Cx4HJ6k_;1+;CyDZ zHh&oSr#LS(R^126#VBV)ircyP>X*R+L0?|f(Qm+BC?X*H8L1pp+S{HAwTwJsz&Kt= zfft1e71@3EMjl!vQ>H{7Gn=P>iW^rtX|1xl-y~c8FxQ=aOcOvc*LBJZkfYG8uUEe- z@sCqCC$zPDUcwSgE*kQiF zE7tWJ#9$Tr?TM`hvAWAo#d*pDUtii8Qwt@3b%8BxT~<1(p=l&-FnFk>q;xTUC+a?1 z@S*AiM)n#H4#B0+OOzjjUBicyn#Z?9+=gPiLH$l)f&k1$NCyYD&s4rE=+0ekFnrIg z^}9~j>`_L-Lnp>vz97yZO}zSW$Xc@IkUiUz`;X1{mz~hJtQA#{;PawLTZ71Azj=)nVWJ zb?^@NzP38mu*~?^$bwtf{Z@-!F>P*Rx;N3qKpUlLdMmknJGWB$p1B&oP_GDk9kn9$ z9lP4k!{>Ii=BH)zXBJ!*QKZ4wQupy#K=wpX&Mw8ERCvU#jRiHg$A{hU;~k&?Gxp?} zcbV0dk8Uo*HVFBtUNEco`|U|o;HhD6$p;8YZ2yIk*btqviy;$kYo9ez@|OTfTR_rQ zL@xp78p7wTFWx|Mou>587&B~C$SPVJCsP9fb=V|5LO!NEaOnePWI}rHo&+1&>h2aD zk<=UX_%c4BrkYXQAxFZugElZ)YvU^sQ;6*qgU56sh%Pn%7hRdjh;=n)%Hkf*#S%Md zX9k!0)2$m4lXBjw1oQZf}IM zok_GywA7;`f8fPceKk*;$Sy}6+KUO;z=yWZa+wFy)zR6UPcrrE(}vD>bb{H%VP1w7 zd-mq6cK` zbMXhWL%DyymT?o!G8FP!az?fZBySyy-y#so;zae-4c9V9+3J6=c1LN$&zB*M-Yynt z=#?1`#<>#oT*M>f>@V=MP*>mRpE#2Y2V_$qDmZhG=7efIrLGXhQzN`J5^Kk3!Y54x zK}$;zAX9W_ph%7(#JCJ9SeCn&=2vfHl}%xcoMizTcEF@lHIh1N95`lB*;;wI0V^6W zSVN)2q9Oy zO@k19fQoT4Rfm}82dfF^ORtt@nR&J~5606TZPl#jfMO|i4A0&?hsK0g zy1EUu?x3~yhZ}@>Y5Vyxal~&cWPOB)n~${iGv&k4+MNq`Ct}%^K$_W^hgR&Zn1A3A z-I}8P!a%ZE_c&&V6pmB1BixEfGFwJJaZZHkblU+t3H287jOi9OVjXzB9=0ek{`8}Y{d{%WzQ2-ZNKFuu@_JN|M0Tc6DF_ zrZriqo22ZYJgZJv^OCTLFlG6`(@bvF;HQxrW0@RM@lWQ}sz0(oCGqh2ps%9`Jrac%R6dwyjkk`Wd--Z=E8?03(lo3dH`jL6SqBJs@ zXAM*BXY^Co4O1CibNK@)g#A}PztMiuEB*y6{u_q32yiFFwma%U!A!1G+9LGCA6X>Xz5%@3GfkcXxn` zp}Q7Qw8#<3DLTtZQf+7`CZXh}pNDJPX1MwVW4!nlsihHQ>0ip_Jx*o(> z;_IzKTV5;}^u3;iF2482@X%B!n4#4up@H`3_)uQ|jRh1!xAN{$_w#u&c_E6-3FVku zlc@#Doc^>Y%xlt9{-0FD=w(6K%l?XZIPwAc4%HCfsvT77*m{Ij-_0ZE+_&)`~ zQ+~f#5}KG_gHxL#$>kVe<$-0xTz)!oByDm`>lj=CeB$wy7d3bO%)tnJPdGtRLVG>V z>SVpVB)Kx|Gl$BYZ>?DYNDqJfktX$B#tgh_#0_X;srhp;`c18r&X&5V@Lfkn{yzRt z=T)M=mHzss&|zcja@koXfv2(wXy&Z-B+{rl<(1{2lA1fnvH)M3sf2i;h?Y8u%^%Am zf5p{wgU{(~Z0wAJ2u14YmeVht8A&b!U%of5aFA?Rd8x=dn;6)EAqjuq*9eC-q$4>8G)D!o=cKsVM&QF2_}7Vepg%qJJAgBb(Rqo zC78H0Nif|~%3+#VVqhnHrI^GJJ?dpR@N77+V7idugs!jH?Jn;eAbnbszWgR~EigJc zTluT_yuiHtE4`!moM;hYm}c0AqtQ9k!O>!3fI!x5sm985 zYs(rOR$Pm2bkZg&9w{<04XyMG)pRG!WTw=pjRIgt>b+%X{W=$yx({F?V`UCldbd;& zHc1Gu$n1n#j&TqV3k>gKTdM1%;xo}vP*eI)4s1G*=cvuc|2dwgC!>z6iF|z9AeXvG zMv7+SB#T}oU}2t9fxlttVDL*|}A5Gl^esjP%D#JVBJCqkgWrK*KE| zabGzjF1M3WrWxp~bmuUVQkbJX+k_x~T2L-XFf9F^Le@8T0%t8${cVjtW@tY1mgpf| zVQ`n6I~xEIQ4a7(wXi`E=15z9r-p(4`eJ79m<)U?mQTIhbbB6`v876?I|YQf#R+E$s{eU%67yO$PT452nh?QoR#U-eB6=vbe_pt5%vLkY z5!&D27r_Sivc2#Gw@?@4wC}C(3*PQ#wQ+SBFzSK*%}H!K3O2xPq~Um!PvT;K>@~l! zG;9=72OsslLUSd_S7Ij>e*yWrVC|9@YB8BensgdX&orx(a?ES$0+KRqZ*+(CBDF zUGAuUQD*W^zI?Kp%P9}adzQ*O!ne(gsiMvW9;2Z%SLPdU3x#H9e-C11WOT31iJ_YW1JAreGeL{(d!~zVgPRm0ry5rA~Q33b_>k7XlB92Ouwmcti^| z{4^Jxc{+pgFqq9sc#1vuQv>=sa-WG{%WgeIMqPVfgu+53=(5Xmdw_MtcSJ9hj9rm- zGoQyOzK4cGftsKeZz6T9m(fe?MA^>gYk-xMMdk-{bI_xJ7Z#9 zE5+FDr|6G|bT;JEcx6*wy*yi>Zs^3rVL4EV`YwmJK)(F>v~V#$uDAQk`L&bA4GaS*lHul0+nI)Mhshod&`cCjS&i5KcjbsRbP}69rbN zwz5H%=xyQuc@H13swXvsCXE=MOSh*g8hJZe*|um7w&NE|4kwN6T}wHaK%PLstSQVY z>hqEpJHz}cLpL;0IE~Tzo?2D?@z!0F!J;mEm{oq1jZ8MI?xI;-b$p!><^xJAb9|ClwY8tOo$8Ura8gE{&L|`m!(b9d zW}L7zpQQfGW%tmC{=LB`-i|4&o+u(UHZ0$RfF4aM=v@7sQK^9>`+40ylhs4VwE_?BbO_u=k(RP3|P zDwk#Y@Geg`e9Iept%K7+L9rFtHP)Qn$IXML5a2b#7O z@}VmYtuxD`yRh^d=CG@LgteXH!X}#PC!iRG*%siWA%H+(aA1T{Qs*(ATh>iX#~x=Z ztXp(Zu2}V(v=3h6_uTS%NpR3GFh8UJzDzr}dKuTA)Y5C96K`}&GK^)bV))|}&Og+U ziW4r)WUo&tUkU+%5QrIF73B8(6m`##X1b%NZTu4pK67l! z=kxV$vgZ^gTPL0VjabaPA_zo`0vkd^iXbo#NVnjWR-7PrkF#~K>)ygXlA2i5?J2|v z@|3C6M3*pH=CbvdfEY~5lq3H( z>dy;~N#g{%?T};^aLkA+L_UP8Amj>ekeU_tmLEkO$+)p7ETgNhsCcEMoTz!gH(uA^ zHj_J;isZ(qzv}0i?)dUr33s3DpJ@7yz^qY{$5^J){ms4JT%AT+E5 zWu2sXS--b1en#D}=Lv zeS1e^U3k}7JlA6008f^T(jYnv5U^n5(J!d7muBZHJhA|XerVZ5kNX7t#%=p^7wG+O zMXUbT+3!txIE>4UoK%+n8`ga)s&X3!y5i+ zNR)oMQzQNp^po4>O^Z2dz2gw8_sulw`#dSgW&38q7Q>$LAO-tcOiO}S($Hqs8ad_i z-VSdm4M^ z+0VP6Z)R5CBcIpiMy)*{-8RS@KlV?FmVVg*ENUiOevRi#?$bhfjXn+lS^Vhc&P91S zWh~@6Sc?Lh{f;+t#IK(YV4Ic0r}e`2e9&#?3lc`!z&%g;dQo5dzHTwO#7o$|rr2WT4G?SRp&%6E`g?@?G(lU@zZ6<)8(=^@4+^=I`Yr_-4xl66pP* zkOSn0n39^^FRA!3@eQe!oJaR|hN_HgAQFRp)nD&Zdzl|C`XT2V%^8pV{YJpPp$kI@a`Xtwk_AmYltGZE%uErgOD@)K9}U zN{dWtwwIzq8VjJUXPmQWxyf3Xjd!D!+t_krNv*bcwE@?7bz5dNyTp z9!By;!St!aawTI4uXWXqKLrhX31~eg}t|>+0qNzDdrKd zXYK|cc+D5tg;~^dd*P9?wPO;~U*kcPEa?LoPjc@V^9tJFRMu!A?G{6|l$b z1)ld$y@&^Rff|;a#H;rVb_o(O72JMUB~!7qX>B190i}4*74{58w(!`e z0u&m>F&?5xuc)Q!HD^n}J&E=$*kgbl-FtRo4PH1oLp!#(L*2HX>?Jra1`%8%?BqFD zk3I7PatQvk$f~M5DUT)%3^u7-S90SbAuf3HlgqzWBo3L2;i)WJQ)_`J$Z+Pz5N7t= z$=Z1*7;QQPGUVn~-c?L4l4n^X(**MRr>@=16mTS55LbVKp`@q$1r5saubzkh##H~b z9{k@3(^wh*T~{f`-zNV@n2O^|;P$UOn-&c%r;XOX(V%lh*$s$$Vu7d4EVhPur7oGQ zuBJ0wJ;vq{kz5HPA;pR9eZ5`kh@>X+u5v!QB0#~e7*RdG(c}c=^9Ns+1U)=n-j&;6 zr&LQiafp5*sj~Gcz^uyjV`!AX1dtfW&Ol1OuUp32&c=^XqxzZ`Z!rBGRR%cOzHYa;Qqg zA@i1w9uHAUlm2)RyX~@cH4%_%TRF3W-#u} zP3X5tq|Z<0*yLUKlYcPD3c6?DE~#cSB1zWOrJ{#XAk1G(M4VrKDlmh2*4|Cr;m^}X zjE@f)X7CULN=oKyh(9npalAC&C6`D|ENBg_Iue?v42$}`x!pYUtW(L-!{%6RVqSSO zmZPm0Bg^D0!gQ)EtZN`3Y93eNjCozXZ};N1iSed6f8Ry%*P1`l@b;FBv0-CNd@phr zG~DgG;8yph9=`4 zo}%TsHHyQ76OR*#0Wl0S$;QCpvd98l#_J|d;iY=h`eMKDTBMod85x3d?Gy{l8!Xcy znqf5-W;%qEnReb{w%e*T$zp}`J9hWR?x_(5e4ZX-y4^U!|A5%gw7e`M8R83pn76(zNqHr|xW$TeT>Eg!aEi8U4 z*7}LR7sj|KLp%t;xL=RjG+GY6OfRTRMkBlUGS_a%Iekf&V1kq6jWpw=!$6# zUe2JUWZ7ag{-Z75?73%$*6!v7&Xe?yZ?+0c&0ZZFQ#pkOtuxiGCvhvf;y0$bHL9Fs8`Cy84PL(3o~{!EfpbdF0J(1%fs!hv-G zeG8GBkEEmlp~WK}eJ2k1Fj9M#Z=~)8RA!p*QWYH&nTQq-F#B~qFnX>**7IJ$>UDL#$bbFRb482f1p@xzNF3$MNB#RMlk!+0{2J(V$AA1go^ZWM= zcuqGlV5i#Hv`NGAr#jMT#5q?X=GudlsK^@Ru#=@hvij+guR0M4m1&q1QQk_&MC4GM zn#XnLmw6<&Ld+>|UGIvl93pKq%dtT{IXP$p4z(v>pw#cxQr^!cu4c7C;;Qm76ur6p zc|LAPiQrevSA`fPkqmbxty&7}xm2rz1t)mgA~_r~4X^&l0^C!T+2CE+Ihf+2jHRWN zNool{$cXR+MNwaWQsUyATgDpQOqpK{;=IpZ)8o4v6TZ~KxN=^K<7NwoZqz!WVk}gL z>kI_gbwY-*L`nZs3u6 z;DBg5f=(vq>d*a%WyJXrtBcm&T2Pmy`cQl#{<{lPHY~q@XM>iT0$- zzQN4a;w+eb<<9b}R@3l7Q8dO4YI#40BY|GyA4LH@VV6O8`l!dLWlcdCMNuZ*>4kq< z^TUxlnc(V2VYPfTa0gD5@Lww0g^J7X>WiZoX9aFM`@*&Y2KqX2zwV#0;+}ppU%AvB zk4TKk`OrWs8j*OE&--<71@p4DX{|u-L%vXyj(tw{jfC6eIn(m!9=IqNP&PHGb+zjC zwuThMU{E2zn0Vy%Mf{Sq`#76^)#6~N8hB$+4i2Hj4+fD9$d>Zt<)#{f_rX};!Fv=> zn}wMA#OWONQV9RH0a1YX!TxC$(#!e&dPht69)yYk&IuaFoqy~Bxm%Bt+*6YV)#rdc zvUEoG@CgxoVHRZG2PF|)CuNP_zYfF0n<3Aww(z3tzyF55&bZoN7QgZ844UO{nD}nU ztgTAqyAZIk+X$W5Q-)k!nQw`fux(fe6w*8bD$!P9aV57G1jd#C4NMakCaNF$iG;5G zwKNYZxQ#6+Ux7|BwI|Yai@7uh;4}=UMGX+o)~`OC9h;z$gR0OjBif89gM|e43VDh$ zOafdmVd|T^FSyu%R1#KR3M5+U;qZH{EbWh=pP+xn4%nwIH!w>O&o0n-Z0(HcjJkK=iyCrFDOScb{zEHmK$u^2kE)u5Y$k0TElIeiWn z4>;MVZuEh54%*2YUwkdo(M&~yqu=h%=g*%HAdc$jfxshMO#2yM2MJetYJ`AOvJE!Qh*n0uujO1)og?8!U7fAM9P{YTW1LmR1ivjzV#^o#vKf4BhNU=Zb|`GNj~yyQD*r-9yC%Y*zJT%iVrv6vtST%h|U zJ}7`xc|tdwCm$!*e_c~D4RjX&WOOh9f}3wQXA_-aw^!yp=m8ZTmpf!=xHBG)HV z*|p-eTYYN*nyrnof0onM0#ZGERW$bFs`mTH3Z{w-j*74ts1DHCeLPMOInQQU=v<3q zdbtoM8T*j)GN3Bb#;Pp8|E;+x9hcrf0V8maP&i^nS!`a4&0jQ!hA57KV}v?9Xb)ob zV5`{nU<<0IzGp~2uX4|!pY4}^Ap(##hf>hM3x@?rFpa&)7*iIYZYSMJOM%dc) zi;a!i5U&2S`y{Ljuhv}X!ZD!Ru>P;U-VlNY>zla^eTwFYh=xc(wztDHaL50-pdELrkFTul&GQ^NS7#F+L6 z-$y75tvZ2NLQl5tRh$XtR5X?PfnFi!N95~=akpi!IC9i%a!tza3)wXKkr9ldiSr}g53>?Lw5EX(!#Ce&yZfbow5~?;`9`iG z$J?pHmInj87T}aB4w&vzE<7K0B|;Uj;`Wot8V-cWD2GV=wV0q>$1>ScYh=^=p^~s_ z9et$g6muzFfqL%D4<_zDTa}EpaXL7b#N|)-Ap=!wRXW@H#gE_4_Udj$Mwq#?Voi{z zw{-Pn>-3b=Q#g{7;g*#qQX*CD_-EetP>Vw`b71y&MB>;Em(;`C< zsvUMv%zbX*i@aXh#Ll0xKOMi1t!RO;q^rp8EPAhpLhzyR5=P^cfgiAooX9ehAj-^0b|72{zDDbIuK;YMu~e4=lT__bFC}MO5!B zyBaxC7|LkVDtc($57=?{CJl94bO68Y&CUh$%&rT#I&08cK@+_lzGA!_fJOwZ@Hbyi zMYzORMW7DLT>4{}V9=o58B(LE2EcFc?NTv){7REG+P7VCKk>z)E+yR$yGnm&HOHd! z$LM+NHm3{l>1+Vz;4a4frX;(44;J){hl+DTM{h`@dE=hNViJclhyfi$?AoMOiXSs&$ONlpIeioDrS>z{Z_ zX=_Ay;2b~X9!w)mcF0YKu1&c1YY650{mPlFUibX1vXe8T>BYYClD2a&>iC%(Al7A*d4FT+HL&U;lp>#+wbGM0AY?7 z($PG~p6yrjEav$in~bPntF>eoQP9h_pJL+rh#R4bfYes=A?(MEbMs(AS`p;nOMO8$ z);@T$yphd*7-M3SnI^_wWk(?pzt~S;sm~;czc@$!QtQs~pKIO!NwF!KIN7;48ksl| zvadKbJVr$HrP@B?mko;rj@)Uc3Jgjm07mc*kGe#tfqq= zNwq3yJ&?Lve^|N3O)Ml0a|pFzNR`0%Irc5Ec%UkrpB0y@i~F0>ok@(D%Hylifi=!K zF@d#HSLAxH>A0+}Zgv}Y7P;0?Ce}>z_T}vHmB97*^pt7kcCAh=txRn;j$ixp?uEF( zh?NL!Hv`BNoPJ)ySp?53-xO&vn1w3db2(`iS*$tvi9`k&1`dbBkONWp_FP@NaTKcz6*g>vwxQXiA*w8Ob_mqJdu>i{QTtX#LX-nil3Zq z!rijI+`bWTa6fy=ZKo#t8o|v?l4;fxEEj7gRQ~c?i|=~5ZH%RMp}l6s508SD-o9er zHH*W>Aa2=2}cD z!4Mj(b8#4_VeD^&*i=Gx`?gfFY1c5W7NGQIRpa!R>nG4 zfa^*K9|tVE$4c@x?P-y?pSSkmFGHPdfkYZQi1t43$1TOA>Wgu3GBc-XK2C+zZF+dCNZ= zOrLxdnoX2w!*%|&S^+*}Zu4bBpGU07WW~<6b@jR(tQdc~e?Gte%3e{Kbvq~*cRfbk z2|jY1#XNGknAhbAvUhc1H~284q=awmSu=Yt{oU-igvm*dIVs8n4+^`8?z`H@e$sTG zrgr>ott?c@0Pc)V%=BEjo`$kET5f~FdAkPB_>}hT?(&fA%=nNI zYW&KW;@zO`)IbkQ^B|gRjy(U^K~(X@JACWU5%Xy^mMR&5Bdze7I%27{Nxq@GtMaxe%RM5!S z0tzr5$GGS@A@ZBD+%Gd>*sDzIPzN#trm#Z%>ZdIv{1GP6Vyx%=#qr(NhPrCV*RV-g(W-oyRJa zWLDNWSg_8^-|rnGIw~q)v^g~obZob|Sx+uoIY?~{Msnp5YS7d|T)dUgZRYB5E2|Yx zeWB$*bD>5gs23{Y)>V46grTG<3ACeNl2gbX-c8atY+-mL$IWr?N8)<2E}!FcB>Y7L zLfs)AutNIv)J*cgl+3}B+#K5t{c)1(q!BEdC@a~=DSzk_E`CaZ(bDvvh#qp%p_6gb zW7h0QOQJ4CL?FnT@!JGiq$d)=^jO-%;3yA4xSQKN6G01i4yc$j&QJSHfhsJCBT}b~ zuRaTi*hSR_d2VX9vQz7Ot)R=&nkN?A#3$RI+MIJcP;O93X4J`;oC{or8>zPvdAFC4 zEr=7apZFDS$+w`oZP~;9_B2s%qSd{s?D#3DZeU?k54~p?``S)Dwa=ogMPi-TYrnN+ z%MNzoHvMJ!FhF8O2qO}L%^^wejI1X@3_rXfw!TO%PsRfsIuFlP$C{J&S+j{O%|5nb zQSC3yh`BMza?_btCiz8pBUtbnkrlM#S;oQ@WBFVbV0^n)sf)2JF{OUKe6=xi*~wz7 zK!bowG&J4Xw8$x=pyhNm3KX{H`y@d*jT-Gy@5+(q^>OJ4QFo5Q^F29-;<9Wn0b1BR z>uu&;k|yT8l`EqNb*ZpGCnt1_G`%=DZiqmb@vAC54I(O+Fk@@>mzsXok=0tJ7H+ur z>vCkboyk;%tAtJ(w1pIM=L*hNX9Gyz!eC|t*n7>Tr>41|z1|<}B}`NC6xbqv!BHT%d~(J}sq3(M97=`F73_AN^pDIm_iqBm zb&=OYuHDM<)ekf2Af}VWRyW_3-r?{O!UllOAw$uSxAbWNp;?veZdqaEEy=KCi?G4{ zKOy68J{ZVQcRp_Ogw$|8THov(s_>(=cw@D?hq&(#Q_woiGuJ1q!8hIcw%KgzbC@S@ z@!iMgv6hA;*@yjDf#6<^P@h_V1Jbqf?&iOCJ2MH@^{e zt+;Olm$!%!fw{u)cC9OKHGnL z{K+vwi^Q^OH+LcDr`LEsx32#ekaL#!Sd zgfrHOP>e)7=wotYdz+U4OGg()j53^{uRTgRMAvVN1v$r~D3}DXF+t8Kq&00^So(XR zo>bQKr9^9#m%T$x4he^m3=7o-Qi@GXo_eBsDF_@s=lNQ<$EQPkLL&Iu*Zl(}Mz^Qr zI;*Nga`5rIstmLVG)KUo25eFbYAB~aB@$CD6tvcj%bFdULrXRbPe=KO!63cfUHw`q z&REHi=Z~rndrX^!NbtN=d!dup$jVE_Rn1fnF_yg4!O%9=T18Smj1>zt<(1~1DvKJB zka5WebuayIW_vwp-CrGbrF+ur?Z+F-CaE0GLYgM+-!6_bu?zyy)TArYIeA#0pZwpZ z@CaD!1sIxn5BfeE!}!fiG-fIi)JqTY>9uN`BZllO?P_5+JpD7mE*(b%zu^bgyF%AH zTQ26)S}EU^l69WfU9BFm3b&C6OWu3Mr+>=sUpA~ei|VvEE!VU!Njva~4rgfK`@JUH z`r7<#1~mN1F3BF7(p=1XGrs~FYF0scVejgk+R(H6RP9Wi%Fg!#T^=s%o8)OjZQ$HZ za{3Va4X{Ec_EuoEIhH$f6+Q1EXGRP=#yo^q*-7D^x^rDb<%8GE?An?6E|rc9V*WTF znc-wMj-!o0?lSGLm~b$d1D(64(%&p;QQqxoTV;Ns&$SGr!$X}fJ}mu=g&ZFJeTy6i67wryKowr$&Xm;Kdw&st}%z4v=|tTr;7C*9hYtt_NldB zODf%9bda%$qD$0^GdmA&oWx`*Poru4hSr!b1wS{;)WCnsn!V*bdDQB!!RRciUE-yW zcU*R*-)*NdPbS2D8M1z2oQ@1*!*C92(+3mH6Iuc8iak+v`%m#n)?&-;1U-_jnTonc zksj=>J#l+Z;t2&qeJq{Jscke3mN5BjN2VA0KbPR$yEor(k z|EOzoP}64Zj91b5h+}_PMMYd~=5T8h6m}MQ*mbXw(QH^@_13dcQtP)igX^5i#uG}} zm>r7D;W{Q?7>uSibtQ;tdcn@5HUQEtmyAHrA0QL)WU*nRBL53)L2n?R;{xNM7j-}H2(Rd#lcLrtvp zW|sVGm{{05HI3?Y9&Q_+?puv8j=W(87Z%2rZ4F*P-J(G4~tLxDI#7D<+bW?ZrFDX z8mQj1sON5oAGPG0rgxyMz3A_laMN8rUJpkZz22T=am4!rrOba~7e2lIymm^-CgiZU z!~(GV^ai9iIZsM)?z{Kwe1;xEU(@^V`s6Rf_Me*I|KKG5aLD|B)FA&;_xZ2N|9rpy z5z*!N?u!4b2KkSz`WdYQDriDk|JAX8gvkjL>a?sZ*YYNd`1E|zwY^{>Rua^8=Eg6t z_Sqftk*Nm}puidMwr;*$GyBd^H2&<477n-905<3;jr>M+ZEae^x=`c3i#@}JXX}?g z_{aQu9j}Luq(K^*&TZjQ>YuMy4|4o-3+*|2AK=@2hvzwFN0%>UhvN}SU7il!ZF}SB zCHQooFZbY>QDGF;sp2R%JEbEa=vgA!6<3hmd;5A-C@B*bjp`CphE=D-J~H0WdndQH zE&5zdxOwEKHg_Zgv61RlZ7S2UYLaJ%FYDb2W-6V4_Vrx!HRgL>g#|LsNqFJOfnDVm z?ryDB;gv70;MC8N^u*-#7~>$#5lNwG(uPFux;G~V<^osZE}p7yY&DWgs-of~{b@&| z;$%h_e+)C&39^vJy);YOD<>^*#tzAV5ete40pGY=nvCmv&>vE;rK7f)V9d<>!;R)bxbl$nRiWZNCAwA7@c0|g=%D+T4?GCe9J&~eg^6T=FuiB z@lpKhL+T|*a<~EJz(iPdGgECodE>Z5={;p=(ZJ$>Y;2p*!s?1?saCu{UfeP-AIsW) zo<8-~Q{(9R&OpwXC0PZ$2p9qfr{(fEn(~9>H7pLwZp(V2pC|0u_+?tM7LNM zJ~PB+LKe@wym_$fwjO8(fFE~i{_GUp!{Ta)a*JQh2(@CYI;RjZz*KD-w>Rfd-ZHG> zc}qE*afePggghAUce{^6Jym&`cXTFStsnw(koqW+P6Rs_5POt5{G`LRR|*b_BS6pz zD!?nOBuk;3f0*(dsUYbX@){lNhH2YU zc!PV*C>FRW2*!)|sIu7{7Yw&QzIQh!HyX?F0W{Ahkju`dEJxdTB#Pgx=z1!$=TDXrf_={Lld0jk1tNj$K1T z@MQQYH@QVodY$jq?j>htX|*n>gE`c7tlpKwKUF{{W5SJky@A$r&^3C=~SxTIwQ#Fl_FSwQfE5{_2D;jJQ288}%>Po}5_-T~1> z_kC^6ja=Y)gSS?^JrI-R%O);ua3@Ng9kv(^111s*ygqSh4)5AvH;NOxNr98;bF0lZ zk>!CdptLb4T!dX!`73CAo>D>k=HLn7B>$Xc^Ey5hI`|)pW+NGT&70)ihk@R@ zkEs&17PVF|sF3DqXf8f`Sb*+4EOa`kL}|65IVUG4*s5gaY1h1Rsd%FGA?n(^AuF*T zf+UefpF5ZW!G?nwXWD1dE7Ec+)IRKrvIK zr~|p3xR}x4Oef*M@`~V&jK6vN-BEhbEA+rG;LQ*ND7H<*+5?`U9Lq=9?3D)$yDc!# zD8i#NgVl>M)(fCoPW1Kl;Ak)-fA*H6I2iDTr{rzONK`UT(wKOu-tLUQG=~(!Dre~E z<;jj$rw|McmiZAX%tT;JQSKcyAu5C23Ncc8wbI2ifRKzlm~9$W0f?{szS0DI)S|J0 zk6i|Xl@&TA5d$j$KxKDppnu&6pw8*}1xdAruiXiluyElwdNu>sQ2n;|)XUMIqGf^e zY}+Lyn8H)=C-H6Zt4PTYwxO;1Y{&;~8X}CRWFCsOB7+VzNe8)rqO^&?oX{W=aT$e^ zQU5zHP0c??LNr4itYo5fMrR)N!c7c*Vh(zlG5|2BNgZB2Fr(j|YF`<%^^y_6ah-_| zVKqa}#D zmg|s9b8v5SwA*XlO(@E8znphtOnq9*9wIg}Pj-Jh=%-a`EOUIy>8p`a;biiqkaNpk z+%JCr-0_y%n{aa_j@s2cuph9Wx;WlGfk4A&@4A@bH>gG-fkf)UMnc-Il({R?mfa`S z<_$LI=0=G6>nES$(*d=V@|_>)$Gu)GN)qr@DPlrJr@L;6?{e(%>1lbQUb0fkECquy z*Uv;76Gn&by3YtaOBhXye8i zN5;!xFNq}uc;Oz{zCdEt`UB`{ISTszBY@_Gshb@OZZ6O>PECNyzxY{EP!l$`H&d?4^c9&F)KV4+HZuyBrhlH*CtLb45 z?#Qy)9{efFd+yx>fTimF>Awz{NJsFlYCAZ&6|GD2*hR}!>^uN_R%-&>?`ntQ_1@a) zJu$h`v93q3+Fs{ZnD5^^cov+FCJHarH7U<0N*}wW+R+7Ls-qB;um$Ihf%qt|mxUb= zCRG`rzx~V#;~E1_1r60)j}eBR9P9fw={F{7eipY+9Z-5xlp5>8{U67W+D5bspv0Hrk zT=>!^#%{r8zTV?bszeJ8;SA!S_Z+!wu?3Qqchdo@^H_0KM4nTVnRCFB=CI|8N#q?G zI5R$5C1_sLVJRrk^DfSkdpYF<{-I&5xqv#sLtM7@ReaX87Jz-*@#D>{+Tq8u(?oy> zh&Vq9VkbD|xR<-t@YQ~CObdMAQ(lb|4=3Jd(=Qs%rQ3p0dzy<0zu1O)s`jDkpbZKI zCB3xw!$Jo-A16Jv9oKd~{}61K+2{0qzZQTZRJHjQ2G)=($fVUTK+LxjxxZ2N{|bu# z2aEE(SpOGu@>ej(e_s6mr+@vw0g?ar&f{OfABqI@e>-3NtMb34`u`Ub^RKG^QbWrY zn;q>NB2N{=ykY2oZ;kM>tCwIGO_wo3S0|thuVZNfOJZ3|Q?S0Sx#lD}CR3_!kjMaK zqsNOUa&sMVc$qRy-ymUmxjJ|`9BojOB#%U_K#`-XNr)s*s~sRoi8$!L804SY*6H%} zNr$R74bCi1J8H?CNAVH>*03}XS^jNtbmT4%Z`v#YQ!|fb}Hv>SG2KR6ZNy%X=~|l z6Vs82jhfxtPS;v?*WbIJACzUXlD0yo>(4m9VsUu~EjxRza2v18?o;{wJQr&-Wj41& z6@dm>LZSpw(c^JdM6umlGp7x-RHDBODz6=OIf5;9* z60O}|f3CB|;D$5jn=Q$VopWVEckIDT3z@3m2FeCaM=Vmo+(&3Pw>^ef_js_`y=NTN zeA<8(iG)UhdPYuP-dsUw{m0k^n~| zV`7;c-@AAe$oq{iPeeUoqb=G5nd=FzlwzzVgI(6MsqbmGp`7PuZ zXTYekH)3z5Qhp!?bl2E%H(N!AM!eI6;?8cQR{Ss7)G4szPz?NM#Qg-z_oDgp6tRPy zq@Qgr8|Rxt89&B~1kvyFns2?(t!nG2*hO_iB%Wjh>p~*`_f}0f;67H|h?jv<>^cH$C@} zpvzy*J;Can&qW|JnL1t2N04hUCrrld2R3sz#cNxEr63oeKlmlDBWUFkHX}prux*wC z*CAjTio7y@PB0#Tkm5r?fEadbX=StCHgHdvWG^pP4r3&V8BAtYW3%ySBYEg^y+hR0 z?8Hcq4Nj`qe|cfO7_7Huy!E=&s@FC2;Vgr3;lSrixAn2fUXDhDF%Y?4f7%SFqkzn% zVo=EWl$*E3(zWlK%XWz~Xso6Nk+h-84ge)%0m~$M&8bV%xe(l=@5f zbKdF>OD^0xCUgHNI&SeQs2zMNfHDrwd!J1QCBx>c7@{6`$=6nAiw4)`VUtu_r@NXG z-C$K;TZRSC-ns{~;q>wcaXX05NoP+dd&Y;uIkle(fE*(KWDh_CAF=W}p!AjXbeQ}H z4}fBOYeN!1)*%Lkp=ky?Y+JD74rk`^V0E=H<18*^(omWU?$V)7z}qzK)T4U!E%DY2 zDu!k1DmGyYG6@|7l$aGFz!Mb*?LE+%o{Bo$=BM$uc}}N)B2N=wt)e&~53n+F?2y>h z$yPczCqn`6Q46;Ws#0wGE-^eI0u0l!sT$qH0L`o>gv(}hr>T85=nf#PTD_`zeK5mN z>o<`w;>#|2h@2bZh2vf-mK)Oa5vdaZTE=~u-!kP=;q2%LB56$_(R&iA;DLx#q0zHY zR?C(sM1w7AJvA{>=Ls8QG}TmFSAAAXku&Y$v=wY08qVM`@6>0u;`(e1@!kRo_8Dpf z3H&T}_Pn0+wk1YZh#$I@swe`3K%5wWWMMk_vk*@tfKL-1%Wii#6{@^gS`@#lbNpv^ zRSySWo)M3hAE?~0s=my*Asy$LN?DP-fWXbMS?Ce`Qw1~r9$YJWitksX>yBQ$g)PDg z293gsG{waX4{K(_Q%VwWUqO>2rnbxH!{8i zuYI&?#Gd;U{cXD%m`6_}Sd&7nI}tQ#DNfa6g+CEO9xZ+foF=P@@BUrjGRg1<=(0k8 z&H?U>bMKjl8xB$ox@x1(mqca~>qT4?rk13ECfed}@Zf8BHvh~Xe%e4mMj@Ib#Mt}kTuOyshT%SbO+n_V z9|I5GMaE;Fn`#$akb1*Y9qH?L$FTKWBfQb>q>$p^qRPIqQL_x%vHDIU4QIw+OQ>VL zUdsZ%fs}9sOHOkbafNRLkh6HfHLOMVg?wXFj*`_m1T>VyR!?oc5Mb=9;5iS7j+@({ z+8?g3^*PMorqq~sE5M0ykrZ*;AgknBqkqCmP~1pdm3C~pTf)x&^4X=BKIFz@pfbF_ z`=`g5`QWy8`_^^n)|F$g1Fb81xIYcoeu{j66Puzvln4-y*e}Hk73g}jBManu_Cprf z-qajC{e%RnAs|xc#{t0br~U|uhtD+zH^))W%5EC4&(2)Li9Wf%$4~snmK8(?B8nem z^P*(zJEMALuKsYje?oKnZ=Fv^Ofa5)M&^2G!7bp(a*0d=YL^6j8$ACXugmkA?~;gE568(~(w?#MkKT z=YtR2MUclVYLc-J!G->X60*$obfd!ek1>lW50}fvnGm?fj+iByB0ihjUf$O#PkP^! zAZ64QpT}g$BGdk?`)EN-h4Dl|#$oeA$hiw7H+Y<+Qk+z1Z=QJc4`{S}qB?1&bh7XP z$dWR}tuq^72mt;o8YqbcEdfk~0{|gjcM=AE;W;RrTgVePI*h5(iRe1z0I}88w)=QY zp3GYkkd1p)U6>f0?m@@`tf}%M|%s{O39XlUa4As8k0PwhbIL`8 z7ikG383#Ht?wg?+PrAhuK;0r8BsQ6dBcAD*GfifE=WmuQ9|758v?rYAnH(Gel>h<%1%(#c`k?U zuXUUK09<`{O$Z(9!yl_>~iPt;8&TJ^fShbDvz>y+3@c;_oz6eDL#ZB2|UDdQ}u+gQ?T~JSfqj6FbAb+DK79@qWZ1qngfIj{eA5 zGq2wV2r!tG{BORE{uP`3kH5TZ|5&s5hgbB!u32#W|3PZm{>MSrzl+o|G5!~%c2Hd} zW`hmRXIpN!+1*dQ@l(S&oR7pjzIcSxya7;?q_>y5VD)y;NX}ZW!Q^?XEwt)3aOeLu)DRojZl50SKyG-U=&G5mc~em*ys z+xL{aX>@*0)x6YESeHuBgjx#HAs~&ZY`x46?;*eBA3S?$CZciNeyvEe7A}vs4p>zN ze@ZBV%4lBC)Lr6O{EJ$uqqlNCJV}JdGmFZ?>XjMjm=kxuBi|xHPO{2N8)i-FAR=d4 zP3q;Pyv^0)PyxM9i|u7}H!4a-VD?Q^7u@8_jo>9oF_%{h{qCkho@%x_c;tRk?LA#* ze@Xh(Y|T7v+M@G!c?r`c=fYD|Gzw^hF>F9eDUY=N5->VbGPPxrN^eXw?lfO0K5SCBK@|wW2!e(^X_#UpF$>`e-2r?Byq!fqV*P( z*J&R4(@5U7j!6#JNeY!79%yc|07>3C@29DjqO-c0c}(=!-dWn_?Hbqsg{I~muvHx# zo_yzO{idRpH!Lvfy%i##7ZY6J4gi!HiHVn9D4yRGG{32l45arXzcAy0R{Nx}Tkil4zgYyXd)^->z#GIi?ICPO z!!t64(i-XJ&y?zfyw0<&kjFxA{WO*p^;(QxWFqY z#56K|z!0TL!;A#(f%OH|XZ=_O@M3U-wNrypkM;q9zk1~dF7XB;EfO+64082M0i_cV z#W9@7S1Kaatl^M~EgOm}FLv{iv& z37wtJud04tzb_Cq{aKMq@jwrD^VGQ<>qSDWCuqSw_#Fjp%9zb@p@;~FR0_mGQU{9l zUMFMkiIq4mEZ!l9tSi9B0?z>oRUMM!pKjS~M;D^Z(GUrcO*COpk2AXxS$ZL<$2FlA zb<1&b9b(?6H0es0?DvvG)EF=a{3uij#hR^Mjy8%FEK*$Sw+phM93>FMkN-<}dFg}0 z^b|b7P=`EA2VZr53{_;Rny@z&n~S>~c`Q4z1&KENnetWYSPT;Zj4rrQE{nsaJdf)9 zYAQyDO+s|59LiwMN6^`RP)asBvk05yy~I|s83 zQ0xu>&r8;7JjBN9a!8p535L{--QKc!@~>wj+HgQkk-~`oxV&J!A%&K;b`;$8UQ8neor9JoixHq^my@!0iaWl zxHF&zfDY~?=v3~1o=kw_1$&sW-r1>FKXJwqyZa-)M zILf5>T3(~=b$VXE4Til`X-7>kg)trdy4ZsX5(lw)Z8gq+on#fsJnj%<4%ty2jfH;S z;U5__IyvV9tD?H<)|KI1+fJ~OJ3X}+SjgRmeFAbn;GpJ`5KwS+ZX*DZ)0R=AwH~xi z8(NPkiT8en^3Ih-XNLHT@!iB>`bf|IC!Qa@%o(0N6N7{RiTEkK_I3r8_W;OKeP*Gj zq!J=Z;hn^`et(4q*)6Hj*15vSFXU3`1#@E}htDq-?QLU@?ur~0=>A(x=+tZqtNKOr z6jW!w)B=hNAV``&K70P}-Ohf$UiMc&9AIr^~0lw)>O!bpW< z*m-4srwD7b8ZOkSkbV|+y$a4{lGz=&|9G!kCMAKmNVNw!ghE4kj@S%*v$0-OD63&g z_7_GIt3MH~ojLdNVCycDk70Rib5ysDBTs5lD? z!UN7KmVK&jTYI&E30XJqs#!`lyPE}XsEVJMV1Ovr0#)F`92#O)xylNU7QpXbNOHQ| z0>cl=OanZ-cQk5z;=MFy^fP(+og(S(KNzyz>H>b&bzh^!pwPO6e3XsbHl>KpbOs8e zz9UTDKU{Q=0dx)$)xGDBq~kJ=JQzgEAU_xlvW*$WIhSea3dO3}1vB-?u#j~9QmtNjA4ehJ9@H;U-*@#DXY`MwuV|6#@VuZoEC-*^B0 z-@8xeN88r2%TaJu+B1(6ilX1mf9UqIq8?dhtR}?|J~zCu$I>E{U^BvF zsoqf4F?jE3%uARMqtZtP3XAgc#;fk$sQAs>;|$jask(@WOONuC#Y5Ql+Pq1o!7$_E zbOO0CBX0`2WW{>XRvFK{5$9p1Nw{ZGbYnEKxva1j5(Vbj#g7?_OvG~Q#p8@#H@eJJs_7@PyKv77nv^-66bxfLF;|4*sA`POI1UZt(QkqDr*WT42*Ty(-n53tr3Yfyei9z#rIszQFfaUekNmIET~6WNG821mbvWDUDoTBlDvMQ z{(7FIznE_-{x*SYoz<5xn&bf;V^h5AO8clIT>f+(z5`?o8BI$;cXB_2SB74aIe=3RKyMZW1bu|i{_=@m zk=H>+zpJ&Jfu|PR-Jf4mhq~l#aNk0ZTEK5+DlDiVSx9Nnh3L?1?-txFane+nNzAW+ z4M_Y}>TC!u5U|t<=-+`xz=gyujzI)NApi)3l$~gGooIO% zo~Nwt>qe{CRd9wz*ulSfDIV2MJ04mBO;gP=!J0zUjqwU;lKK7qr5+7f4mQV{>mpZy z0HRla7*Rl%(#>|Mk$S%Jzt2CVJJXMS0VSSgJ zV&Fj`WG+$R8rqEt;%hmCmz(Ix)56P_915YmE@JwUvCy{IC{y`Ih~KDrFSvxNQfRO* zA-GipW4zifFcuZ#kP{ZVQBS&`XbvR73GlQ$MoZ1f1U?#oLPz#t!U6`wR=%zk2Q7La zJ4BA`_$9is(M2E@@M)?6Z@~p_X5;ly49BzWJaNyY!Rw5srAWAjWGxQFK5iFR>BtVg z$m&b8tz#B{0ZBpHt+(bY#|0_oyICCH^J{2aC;h0tF!5-M4aKOqYye4siZyw!Ct4^d zgsW`Xt)5`Ky$x~2rWonyNT~daN<8Pc74fZgM_+HRL3_Egs%QQ<2vTTw>3Cw-d@TiV zm+I&mzFZiSg7Ek022)*;qhzY$uaDNXE=ctl1a-M~xj@BifB;`vy0jJr>qxyI1vW*& z3>B!S@0X=!(sV|}WUCx8gCx_=F(C@sxpbXV_({^74P%%GhVHE#4wJ03z`xlQI8Ix8 zMa9AyzyfW`KI|1=Lfve-i~*2d?RzDu&J0TuODR*xx~UZ@6}sCDCm-HQuJF4GPUw(q zNJ`d6l=z9pzO2+_27SW>)8MMO58s} zEdCuF{ckks|FjbKSLJ_R!~cY%voo>%r`bW2^0yZX148F9wPT@Q_%4x!pqx&9OUQz_ za<1qcu+e-IfCdvudD&N&FkI0Mm|-;&JW`jSmXj?k!sH zWIehXQjZKy1xi#=AoRBdiM>oZbzh{xunBWA6%;91=As$PR-FMM2*W3^sHuBlYes&K z&e0sEbTkX;FAq2&SqC=2Qum1#_6IQ9OBaq=hf~~F<;dPiI}SJpHE{`KzEw%W~;K;rL*d_x&c7T=$kQ{?^f#U=~qTSRB3In@(p#a|$* zLaEMvaOx;`G@wGD7?3jYD2Tj_gGXahrOZMGY@!7iBc*=*u(G#jWJ#3s_p0}9T-YF{kQzgqP22!8gvb_09j?Ie;&`N$SfRANOIqcS6g+==ff-w;+ODN++Mp>|aIr6r8z zJ1;ySX8Q)z755*>LSZad{MmyiqRYelnUzY{71+AZ#l8QD*rpj zk&%<(KYJ5ZrAmAU#Gv?If1-AvriaO2fc$bW9JZ$-wW<6)PsTZeX6(=>N=ivy{pE>| zCRx}=@hD9X;`an#__75Qe?mqyyNU>T$S;N>i8M=L5{CrDOq+kccd~DaM4R^^BT~yq z^?LR@T$~~ZGHjPOhAzhY`XNP|J1igTd}T#26QJ!bRKf}(=8Q!XmTNTz$q)2c*h`QB z-9#jZyYABHdqGoS${;`7mi*Pw{{EbrjtI->M^PwRg}8il7{WRxP4cYR{oecF#rx*! z+kV8dj|?CEmX!;Xdq0f6yCT!N#~7&7X2}nID#Ps$;*XAH=*Na-XtoeUV4@N)KXN5H zQuk}gpy-I-<`s}eC!d(VDg4m{_c_cmr8xvgMJydtSOv)`Q*=*xD0G5l$ukzmrc8X! zq$O!s&rNP8&M8)x6&|bRIkFkTBry_|5-XP{*IxZ-riMY38}8ZOI4%Q4iTwvKpHQS1wpXXi?fn<eN5ey`WJBqb#~t0?jVhakM<0_D5Xg&Lw}$6NVP080?1czKcrMVOVzjT5xn_k+D> z2J8FM>MJ*j8SH%tpJ-DS%Nql{8)FJ(y()?fZ*9CWOKW8^pYtk10Yd{rt5_ZCWvoXx9s>Or5wH=4CbjS^d z_DIZQ>JN$3Q}dah6gHJt85k8_jQ=J^A4D$ z08jb?-1ABSa-hVsFyZB!ueQXjl2I&S0QPv!^NjFg=De`d8cUhebO7^}*fG6`uE38) zR^MD*{B@%x2g1mE7$Ufb^)hUZ`?^U#H-cd%NJ%BOZ_v{gr3*JGZI{7qiA6&*B(DSf zw^5MBmvyI^DoSnkZ@Tz;oP9s408WwH{!#S8y{w`4y~Vd<9f|^dF^@bL&&(Z0DmJ%_ zsyoNFEkutj)-)$9Rqv!E39svIencwj3IKp4_W4HUz)Gu5mg(vZ1g(dfo+h6=RpqBH zgjZLswL~dP6eHE#3%7@jFBGKiEL4bZR!stCI1;+K{@k1e(k$ zM)ldwhOCltnp-XY@$gESlwN8^0JNz`g)qnWM5X8XY&)ESty-ffZ|FI< zJ?4T7aI`AI#1ERrJVTfJ=Hwski=ux9yPyK9*)+QDs~BPq$f||`ckG;u>hWdt8)VOR ze#@0tROtCTUC;@!nfo&s)8;qOSm18k-G%t|YZ!r|$Wj~(6T!zqHIYC0nY>9?HSemhy}mpK%ST5+(>bD?VqV!TQGOiS)Il@R5CL2#vhwM zYHO2B$$DmCnI>GOtvDV3ZIuTj6ayxXE?9wW6>A!kmHDxr%lZXL8hhl7RkBTh3*nuk zF!8+Q#u_{MdrEPa2yiur7S>{Ei!EcJ`B)?E6;03fDuay{ORv>o39R!E%FKw4cxhMQ zg6egqJ1Ag)oYM8vE>`#2cm!*@*Ucf+5lrh$w*)(LK*wxP`QwHwpbqBG2SWHe!BQJw zDb+dEE@^kXk)>|chZKeV85rg@7hdU`%Njrv+Wa?q{ng^q`?+)9kT!`HAng|Em49r48-lAxmh8Z_F2kKS}6FP9V1W zhVSY|F>I|Vz)6`qBdNT4;)_AD^dVtiUF6u8uFM=WFnbTy8pL!G# z(HMmkkx@FUAnfo$mmUhaz}Rq@17A=47UfLFq+MTQKTkj^FrS<6Aac8+l1l4o*>{fw?fNW){5cy9-OAwT1P|jJ# zS>|8BA_pSMBB>aFk&!g_k&zP+2M6V7vP(T*PzWQ7esIxfO$1jyrJ)=EuvuHvBHwqc zhgO0B=BAba$k4uFSs7sg8F7d`6C)!J_@Y|iHom2K5kZgw(Rc*b&_G;7u@Nh4t=#IV zY22OQuhZndbE!~01A~Kt-}JS>2-u0fffWSM2qsq=u=N%(7Pcm^vQ-qVuk6*=zJL7k z#^`8thF|aEV$#;kP~6s1Z)8q5+K$EUPdIrnE+AZOUozkBaIg{VHGnTAY+fKvfyIr! zTRkLHEhTa_VQ_+-kDj$Y42WNz&Gukv0Js3xyMR=R^#GvU1Sfi9^rw0zTN-SlH`pE13Qpv;rmoO3;=B0)pDfTceXqDs)QVW)aQsT}K!rG7LQS$>N7U#jl>LeCB+-`l3O zjK6->GBE-BJ_6)s)N%If5h`z9`uaepeR6r%^sUcNEy3x(>O#z{_n|z0g7?nP&VWML z{jvjd_xM!0=??4}0AZ+Oa0bEvoTL$e@agEr2bTF7ye8h!-vyg7@XQe)1K8K&|N5Bo zz-L0%ifw$uf9SSN6BHHJ71jwq;%EI*qoT1o2fO)c2s*>qzzCFz!N~!DbB(|CbuKnL zv$yT`-meVx(*pW=d|B_Mi~WqBv;ExzhT^M}MA`StiOlwmuTucvFvnoo_@@zz_t)V4 zm)pS?+shaGsgK)>5B}pYrM zaSXaxD$ zrP;k2axj76fstpQpVv|*Ru7+%99{57-6Fx!*VxDRPqd$dJx^J$+b9D9Lrr8pwD`=} z+&weBy)(GGA4l6^mtF{4%?ltWk56X67$<^Fve#t3Pro_=i<{sed^VZ5v3&(kY6^T1 z!F>e};O&7hM7|KveFZPN2YMm&5x#__0l>oe2VnGL--T%az{>asp!8!ug|BCgKM}Zn z1s~x%kBOc_wjAQV=}Jb04$@A2dw;5)_Szl5(5Sw5w-ulX9kX4)ri zx(Duc+w*SUQs3jckB#m_who8BNSB^cuWRxr`7gF@(|Zr_pSS3D_-{G^=6!ZNKuvsZ zc;nOh^`<9%KDu2dH#VowKf$|>P4B+bXES&4o33k60xt2duX*b| z^iHLoG z;A^-0s{p{yM!+a=kWk7i;=;e-PviJz|PcnF3%)U#}_Az-RA9uVC9-4gB3m)QxRoOuzq zFbJXbeX8X(2e~|^Xl*zphOSr=`cQZo_sKJcSMGq6fD32mXTWkBZM;Creuk7KZp%Fn z2YH&M82yy)wFK}NiWI~}!7Hp5e?(vy#ZT|@yzT_-FKgc3uF8JHrn09+81Ir*XNtC0 zZy+gRi?8AX@wBjNQ1*t{ouTLT33dlg{kl0IbR)r>3@W$o#y!eaR-eJ%Q`&TLz#GMc zL#V!PK)Q#RJFG$1*1>(1ciQW5!)WUmkXtxF_0n!av0bl3cj+9Q-SlGXB>byb*_?i) zZps@!9;1AZ42sTBf@5topc19i_dX^7d2bYNQL@Oe3+Sc&41M)Cap~*#EIs?_p+op+ z{CL2MgZ_l_e%YVpV~FN?ZWQFstGgX8jJ;`jd6|whL2MRDTbQ0EyPbQ@``m~qYJRH% zE150iZ8sHNtfA7%bF=Dak$06SUxrOSi*Z%QzVzfxk5-*SN(8@bOt-W1XW9v(FB{HJ zys9GZTBC0ZYTx!M`-Y02#X>{|l=e$%l5So8&Y$a2y&G4eOOaj!>#k0NY$R^X$kY%d zV=xVBFjlqts8FPb5Od+JO&e8&2c9jEDLWlEZZZiiW@c9whKJ1?Mi%cXQ*A|k`jv+$ zaZP=RFa0FPQ=!R-TYrKZ3+#@pC=Gtu5}L^jc>RBjy+f=pT+pR^Y}>Z&_t>^=+qP}n zwr$(CZJ+yfZqn&a{y~pxR!Jqb_OA7;c)E0N0cJI!-b~C@6$_1z6&+y#ntt(F5x#Bp zF_MuP%Cc{m2o{LgGqL~j`Ml*R$uAKy_ubufAHV%E@{dj2Xx4#agj-bSW+jyJOxw0B z#mHW@q!qsaWpvApP93i+Mg0!nE0s&ON8GGoXGBj%g9cM!Eb&Z8$c6aM3lkPDgkXVH zi(l;dW}H^&)Mi6*J~TigVxZs1IhzU% z5s@A4?nH#%NJ#2_;pXKGgZz}Opt(}}zQS8Z$a7+g)dR%GybV;RFZ<%!F5A!B-mVc* z-9f%Su5Fpd#9~_<$woz@ofI4F^i)(^Bhqs^6Yje!)UkL;#ayM02Ky@2aVP+1__$s7nE?Cb;CO&(j176?AjB2?w>M<&sl(z zgbhJ(jK*@w=OuH$ycERSJP z;H|Vedg6*dQ=Jkq=06>yh1tReKD=}xyB`pgKC-gQ$#E+34meY!wR$m&%hj81)qul~ zlSX2935!G9xEg%-YM}Ig)RJB8v1?)Ackq$7>Iv8}1=)(4r#)TgCErrOY%BcYwV+JZ zn)npxp~)(sSXsJ6c3PpD%Oh%Hrl)E$bMZ2+)9CNB;<69j$9NSDPpy8pSmTj(pphJc zT^LPXDRx0)JLC2I%cGsKjbh==w<{_H#d0&QyHUV8JZK#30_C&bz##9Pi87ja&cf4O zT;dZc#t!AisP2=?8BglQ-;1Jd3Rs|POUBhBAt6k@<<4Q zKBUn|jHd_MKhz$Q`b8IlPnM$3e$#paFRZcCD9za#^jx<@S_TkwM0H|*z{#)#IfH-E z0tqh4ForN$psIO4?MV7YO-CVDW)MCePnE_ExaNUu4)}eO~ zQ9jzh&XyjhB{{n6JDR(*5VwAvu!P=|s{H3=C~ zH-GtPcD?ILOBTx@!)B72$T1Tk`Ve4TYYCPa5d==prYla|b+2{A)H%ak#8-u#eGczWcs;zX~t zkltOys-GGp%0HuW^rQQ*fCQym3#fQgq|^_+XkfI-2v<($T=|ZN|HzHN*%UQ>qYUa+ z{6kBD#QP(sCue1iFD*!J>QYk7OG8?2`+ONE2mI%3C;>$s;@E|FB_%2Ff$70ao?4f| z)twY0C*Y4q^X-x(MTsK)o0*rC0Cy~eU5QR#H@22O9CTn@3hsU|$2v0ost_1E!Ubps3-sik=LJ(BGe zg*j401hiWT(S}4~Ucw4&8(ZV}noizk610BV=?`kZbdh$%il3D8|E9KEIpz(^tx4)k zNGCu<^sg7CXdg>6RR)9AEW_`szW0K8NQ5K`XZ4l@h&91lq=M1QQO+ua-MlqZI^;iU zw;+w^&9|y4h=kt+niW&Hu_d+}bS1Qa9~u-4Fx2%8@`JGRW^m~|taPG-pM>K4Ox*Lz zyd8)3t8jLaud0B9`I=!{9O9r+GsPnK=&GdnhDntrASvXiOf1ny$%!HD{5FCznqXo$ z`eeP0Yk~1+1_+UJI}+vV{+7%7pj_GfQRpB!49S%80+P6vD8?1ybGlvlH*6m7m%~Dj z_Z|+kpT=Q2{?zzZ^c(ETobmA&jXU6XBYP`YCi?`0dJ-h$7F=ItVv^kHKlhQcHF#S! z5YHhmeULEL zw~l+0Z%%dI^uJ)$i_iTt*ubja`D1aus29@)s1!W3KN8c|vcyHMfKy6pO_I=pAOyVU z`Vq}D_Z&=;&~2@U`$cd2Wl))mX~0$1FoVq6Gc5?}cbmBaCt~|Y)?&vW;so?PP(!u( z9iU1(go!jYtXL{+Aa+Po(yewC5Zl9gNz^55izP|gG_<~(WN)EKgv5Rx;GNp0&wMP( zO@>r|kCc!qkCyZ9T3h;+9maOoy==lN;1t;!BdH?0^j}P*Z~dE~P(9CU`7*x!0gM$q zI5?+A1LB^*K;HC_RwWkmv`94I+ql9igq;T;2wG9paL-5*{k3?udD0s-25qEtHpimg z$#?`so-3C#9S+$zQG<*ToJKa+DS^`nlenJs+gTge8~a*li^~Yro?8ZNfzMP~bUr*@ zh!$(Uq?Y7~OXtaLCKhZn6O~10Z$Y_SXOa6C@jTqT+_>uyieM7Ffe)4-Ol?J&9({r5 z^0WXp(Ll&o(!C&pz3Lgkd<-*%7;6>X&ScY8lB$m+64DY;Ojb;qaPm}``Jiuwt!GqV2)}Wr zoZyk&`~u2*F`x=2g&&;G>qp{r6E^lZ`0jn=l=Z~>)>MfPmLsWTkkw~o$sCs`?b7MZ zU&bT(_oT!NHc6sS zQO?_0GtmU>*b<6xP!d zDORy~ndsZWqVtl~z~m~~SXo()7kFX`j7du#MeDanDPkl3F%?_btm?9P>?3pzHQmd06~nBEq{#KcAE%3zg%cNLP)p? z4$mZE+j7_~X_!7$-VKcD#~T=BbM>&{*;yoQV0#>}yNMZwE){!430=o$gl3|4@CyPi zQqICG1UICAR%>gtw011y=PU^=AhjuH=aXRwbcy4@G4L5GB6d*wpa?1`C&bs{yIinnAyg%6@H z{x4IJ5?95GRqpN6_dUeXa!8mfECAavL;iliu=+y4S2Ro~FrX|5)6vT})k9q;@nzkb z(0ZjkDsRz4Ap<5o0uf!iaVTf=_2r^8dnE7vt4$AIr<>7_Mzf(HzF);DodWaP7j21EG*jt9=CcIGI;hK4@CLGT+> zD(+u2BV>LZ9yrw)UZc3LwEon&Xp&$@=qvKB-_8nhQ5r2J3(t%I#STb5-M_k<><5(x zpMP;TTIsCC7X!}bOHa=M@{@ylAQuYRk2-=n<<= zK+wsgpjpb19|MyAUd?o7HjPoEXCXmQ75;bl6~A*{qnrBaJx*%(zr*U+;URSkgn=|-yQ=jDWn>M z*xD8yDsFN(Hns94F~pc1DWIU83F&erKR2sHsEQ!< zY0VQ4|u)n^<*-l%(u|xy5f=Zd= zi!ilHF#fzicXLI@7p%2y$R#ZclyP#?%;mtZScK${QyO?~T+NISx2hjg=epsG#QH{x zYnPwbmVk6MVGse0r-C9!zb|4DNR2h;J-cY1R~%ecvPy@{su1h2z{ zMrh$);)|dsk|_kHrW)yx#I!#Lqu~jnQ%oKX z3$qiIKp<{!_=@TAFHS zRekbI;=g3!QLl`HbF|9@-Bs$BjDsHH%sqT%q4LI_= zY7VWuNgy+PldL~NlQljV&tK`$nBGuGGh-p;ihhm;?!!qCjgXFfHvDD0 zy;c4+O_Z5(GI25*D*xNF36rF34CZ*#_5|h8B*sBaRDI~ zlM)qM43X*Tp@d^KZmz`6^uz{=YFQo#V$-aUxWfqtY+2rFSDH&qIy8SVN$VwU9VT0- zI$zp$@^(b{tyuV9_2_6#L4~wuAtZf4ZN3_F)8_iektOSotE^VHgXhQU3tt43<9CA7 znM*qd-%Y7cdE&<#%xkzQ{Mr{!%jlZ+JYiEc8E2FHd%QnmGImPE<&r>LO(EQZ-ePLV z-r6bBq7SeopHIU0E5w|B@kO%* zL4qYYD&{;-MND@%>L)SBHPtDg+AKKmg$d?k^Dt|V+mKs;1?4Ui9{UvGm+I5}clHlC z!C5B$NAiT8D9fIDkq{H&i4FsF4OW}kumu9IN_d-HM`DFf-N<3$mcEee*x++~@Az9F>n)4T_GN92g*xbhXHk@me_Qz%OGEVK zUs(aWC=TP!Yj&n(@P@88nMWil@9i~b$KJhz%N3%cX1Q>P01b5$nPo;{)C<^MtM%S8 zhM6P%e){w7VkN7SPNV67V*k2uZ@}nE^!96Xx5Y| z_uCAskd(#RR( zzei2p3tMRwTJRq`KdyJSIz1Ugj;ObE7gJtk5-z&;Er!uF2>e}CI~A1OKrq=8X|pY| z8MD1eN+&OCZyXX7`n51@4)HfHeVcNv>+s32j>;Pb+U%~z;>SJG-(w8WCtq&&#WtYveAT|oXIPPC!IWhcc@)Uhd46j zShV1gbnW84w6gqFEF}yALfElM*u)&b9M|D@=?4`hIKtx;Hj;!mC%?%s@n=4rWZBkG zChD&8+yDf_i$GmTGgv73c;wr?TyjF$Z4tkLDtb64B_3BRmfB14Ofn!Kp-yvNRC=*U z-A9>_>$jxIT?~W`@uOK=WKj-B)>BJ~{$p$&6Kqb^HkMs7S8&@EKxfH{D?vG`F@yuA z%gbJS-iY?|ibmEJr9mdV5yuB`+Wq%Hzs_X7;;ZK17`Qme0+HPU@@E?ll;fhp9t(oJ zdKy=&5!3^4adu;Vo58dIYzAG%as&qY!dafFBEYH9tD$4PsPQoVbs+f6B8-sxrR)Og zOJ$qO>Kb1yJU)h0al#PeyU*QsU2bhx{+@Y`zze`VJ2;CGbz5RTMQ4qI2>wGV9=H2` zk8x(BmO9*tA8J?aa&b;hrLBVwsx0xxYgXi={KIspM%zYFno2YCDxwotgNuy!dtX$b z`qGfLxbf^y{y>`H8K@qCMVQN97skk(K*y{6!ymyq9z$eku`0`g$E^R?Y2EqIQj{~BO=JI^Hy{hiI z1u1~s=K#FqN*LE_Bn1o0*KKSmt?etJ`zK-chTP?7U!s}C9(6>ND6GOk&33l)*wc%i{9u}CTQrA?NLu}NF9-)}!> zZ24K0@Jj`8EmJu7%#r8;4#4)5<=SKgrg#W~F+3)ERZfX+M)_9fvqJ$maFcla|CkOp7%qKAg_Cq)`ON& zF;!7ipG`S5a74O)bb7jER(#{(A;)qT>D~IdOZB`JYOwDLs2Usx#ej|@OWgFM;TSWn)>WHXU1 zThWU8p-MgHT(B{BPZtU6Ry>oXns_>u>VHeSG-v7Rp2v1P=cLAjk7;H?WtpA-kP#R4~e0aZ*$?sWD9CnN+HNr6)$=Z@m?v++dHJ z)n5(4e^ItaDG-=Sab_W0>C9Vve#BcxZtkJBLfU>Gyt_<{0v`!EZo|xbvagz~6?CL9 zp6wgxr;MO)uO0D2xJR0r;&LofWd4nB54-CE;~BSIWvL@}PUoP^%DSH1F(LT%v>bzq z(XRI+ZI+H8*=M+k`PB!gf(c&*ll7N{V$Y6y;!53!g7?1usOGZ-2Hx&9u&bsrr{Y`~j0^9*6`G;L zFd64;i5pcC*J>B55-<)K^NV{hqY#H-&>#jeTr(OMHR#G=$RbWM4o^)mJFSb1&NT@nOs zkiVHc`$U|0%;@vsJ>2iX!wtrf6yVheUc%96O+&hZkDpqjx5{`XtzHQG9P}4UUjpc` zvCH*I=2pD@#=A$nA9&Ke)ySAI@y)Urs+FS$2$b+%AH03E?;YI(40%{0wajGpjYhcd z_BP?j73o0C>zeYMzr9(-+oI)8S|J55|7tEyh*U%0lQ@C#O=`EUJTR{U|0k=V5;-~2 zs9sNa4K7W1pbU9|p=WzDET}`6%@tkzL`#eaSOsC!T82pOXKAb4xfa_7TPACQOVTK& z2nRP-=Z(l1n}y?&eU1}!?MB+e^8L63KTUGI*_#HpJF`8A7crLJlp8a>}mqdt|wOmq;tB&WEIM zbhq$ykK3@Ah_^)Dx0_ika>y0+1T>cgcTpGuCp!{K;Y+2W_qKEJfA-7i#}Ab47DKA4 zeM~L6Q!KK#4O1zi3g+4`?sRbeY884~d3%k|fvJ1Ue64jJJk&Ci3w~9jZsxD3@E>Cgwj%r{Azy z4iDwv&n~_A3w-BmNpI2qBwT2C{Yl7ijAfPeP0jgt4`uJD*g@2Xl-s?IP~np?MD0sY zygp)v#A@c<87ctXe`-_WG$6;SWwtg8z;)}u#LKzubgO?kQ?@$W#`x=U?-@*-3JrOc z(D-)AFtx)>6|IbszeoF{a(-{gLyT~N(=R9bFebl6Nu4z@D6J6lqN45fkRfHAZ&Z%gLSV$Iv%^v z8ln^sdAm&uVGgNM@-$#zKr9PNqw`xG;je}Jki_@QA}Aj33dWLN6{xP582qU1d=1khL|Zw z30ZXcjw9C|DVl94#S3i&;>QkFoFLiJKyq8iKXi=>ek%2`^{tRNha53 z=A@P$92PtbONvw(8BAa*-sjc-a=Qg?1T`awS%DnQxGEck$}OzP;N^!=0byt`|4 z;F7B_5afYg?N>$RHrs6T#G=2`VB&guYfFeYXLW=2ip~UBJh}KThQUd+r;m#B_G2qC zGFHk(|*21v!e4-eLt9)Mto#-TA z-KaCP&U$A>6f#fE1{Naawz0s$lknRPSOr4*6rDTGksW02{OMU^(`4tKlf1Tq;vl{i za3jYZyNr{d{uhCf25}jn9tn%`he(CS-0~j~5MNIZ4x7?Ap{Vgo>W?$jRQ}Ko!_95@)+?@i>)~4~WLOxx~QYBaCEAjWGB^CyBG_7Dj)~`_VkXVg~@~ z()ZflYmy{ekIvuw3K5e}W+>uvCE4bSwUHyX^RfT(U({7QeRmri2eT{^c_51}{|3bU z&Bz7hI>)vRCHojPU*P_jU6k^;Eiv@5WO{uEkkolTd^K5b{}d2b>Y6~@r1~KY!B$O| zWko7BYNGs|I+y1|e;q)K;PO_cL6^%;nB)WPic+IS>ldI zKp+MMTqN*fI%pX21{0^R_HX`R%=>0oD4@!WTx1ncbX({>A8|IXRXoKFH(7@?+`owz zvPrjyX8lC;e}Ypu5pjhfOm4r5I9L{{`*zn7Lm90u?GzpD~8} zUDkW~dF4&GVQ!^MBDWVPDlt#I0dFaNug8WACrr4vk9BA?m~UdlzXcfN%0dO+oj778 zXleZDYrn!m0=eQx&S+UknryeiE-Fh#7^%Pn6he)F*!8fR+`RA%ZwePJ6{Mo@h&_ly z{-eA}wfLmwBvqE>t1J%ycLIM7EZDwH^JRBE5{gTqees%+1=-8C1RWL57Gr`B?Ryt* zjv0Kd8tj}MH2c7S;o1L`+@>kCPSpMB?4nd;4HCC=#J}ktKpSVOgcJyk*tE;#`=i-) zRGoo7T+21Rg3NXMK)*~-#9!U7Ji31BI~#d)CwgvaKM3pEAPQZgNU zQ~+C#BS*XJp%rXry@AY>4f{<#HIzE+8-e~)sPiGfgjl8TFugstRq!%mkF4Ko*}Qpw z;X%G{%!Ey+4OwO6sBZ~K=TCzWEHYD1+iB3s?v)T7`{J^17-(1?;9yql8y>SrTD|!+ z=o;b^(Wg$LmtvHMPk8ns6p^etV6IGXwB?Cm!Hu0Bq%A)XnpI0F^T3IKY z^n0qLueq=-@L=Frt|ae_w?yn9&`eO6GWP!#sxi0eMCvm#as%|mHBRQLx=qAb#ZJqN zFQ>6fvnFcDtIch}JEMo6#>|lB1)HXK(yIruGs$$f+F$`UB#5GJr7hp(yp&oLK3>g! zoinv0X{PF)5k>T4Md&9Eqwf=B4%We6)UU8pFyztky7q`5(J7mmQ~+CnGGPj z!cyw+EndKi#RVZQyLLSZ&SUyIPW3JW@cEfUgM9oX9{X&7h@{oS8Yy|h8bzufdX zx$q9rfEbb+QG?bl_OaW(Jr9g#6q|Lbv4;)4QIQ<|^ke1FGo;QW$uJ1S z4x%kx;x;I?t7DM+V(h}w*;+moKa1SKHsa>pn9T*?H396#K7b)cMj}$ehNywI{r%wX z+4%hz-=!t?eYM&Mf}1U}KNp}55F)}p%OyMqwR$tkYE%3omW5W%gsV`MQIZbL+m%Sy z#bmk!MVao=3RZK{nXaSVT$G;EY0qZnCjuGkJ2D!!$PKtGmI<8t#n`RHKR{<2u1zbt zVEF7UiEaspzO4BVQ+j$3TuC_SnTSz!eWWA*)hu~uw}$uVt=f6tYy^rB=wxgM3lj)0 zK#wzM;r7(6TA1q5<{IP+*q7xy-2$bkt~ymz%`ck*JH!M6I3W?%BhY+LH|+Ta^298Z z?*CP&c$w?(71Ilox!|y?v4M@HTv;914DK|xxc8te9T8EA^jD_5ql-7M!+rQ;&MOG@ z?hc-wLE3tZt&hKuYyzvQ)fHsgHMUn(nyP7-Ykl+XZ1%+zks_&*&~!+f^4Un1o;iU) z501j5W;)IzJq)SlDpovu>)^Zd{~O^7tqjT4$A(W3I>6n%MS3UkqT&c!ragIIse^Rf z@FK?t48=)h7qMNpw$mZ+j(E1x*cOh0bs34^>m*$7hF*q7gacnksm_nD>@s|d+wuga zzd;EDL}6Rb4+7>nG;f44{mYCj=Z=JsCTTpY<9!~dv?VnQOe;HM?_gI{#92Q z#4Ww%4q*W+RL#EWf_%tF_SD!Oqd_TOt#>EUy_w)}qW9Pyc8BlgKgM#?jjZI;*mEK6}oK8%O4j4i-yV zuQdPZFR>yoJ#0NjN{tQE1L@8f?3m1nFll$w`PdE`rK*>;|75~6OI%aX4%XX0nHsbX zde9kpF!80`5O$4;)RdZWYE7)-CsqTGPBF6i2rs_GW3zbY-%$gDW3@oy9(_^!DZ+Ow zOg7fcMVDwna%>KRfa1qdfI^ITdy3vmmkIvwlwp|64EJ%$U|y=1qas_}PED;)K=yN6 z8hc&G_3x4)ypUQu>V4+pVr6e|#trGr<|ljYqLZWm<@8C)_o6DEu`EnPxSunOEXsk; z*}KHT4!~|jtoVVG@gi@cDg&gUG^iO0R`P@Rnl?w{6=>SA7ul>yup zHVadxg+r2&-aA+=I?#_FNY-fUBcBL#1*P9!&`fz{J9)+G%$_D2oGToUzQ6hyBt|Gq z3UAlzc9%q1-in?;VwJ!9HqhJ=fyc$cr4w96| zHNunC1b#=(c=dlQ@I33-U|8anZDw} zO|?Q@U;msI*%;*+zSiLs?u}qYTdbVsY`rzHlUZ+ytlV6!q__{v8vjf-cpWBBG!wi{`ymdAj;>b4f11dLkR!hhvGT+O z7Tkj&m7evd`%iOFqr3V)8!}b!y>$tL0%@sw@3aX)D!J*$m-YlQz)xvg2{)*n0xYV>-rWnj#)Hm6!bLp6Q zcvD{vqtT)hK|M`PB$=#JPW1S5$9aqQTTUpnoMKu2!$Oa>k*cTr9b@Wf!?YmYHJ0j6 z>o8%uwE;CILbo&V>w_B&ottm9psd~`&IK!$mjM!&sdPI^L6}C^0CKl)66CfwpFn6K zM%JkEkv_rGkwt6^C8{plbJn5Bic~*sd%m6^q&je(x}Re4J;Nj=nfNO3YD`WmGwoTg z-~rJkyvolQO1hiDiCZ(g3T#7lCGLryzu3REB<$KzbkKnb+n<(7yw+YSeFBYp-^}Au z_9Tay_Z*=fSt%cq)>Z;ol+3!z>S=!NiaC))D3at^7bAl2iM=xN4q3mbZwv=@5Yd03 zx2w9$7m0{Br`akyi94y+se6kO1;gvRxV(0e;PTL%>q2ocCMw)rcfta*-auwGXbj-+ zN-F<6+9e<>3`!tFpI@l7{KixJcT&U#qv22CsrK6vpFvx4#LjaJS}zNYoCGXlqSRzy zcr;!@1~@#hWWnBtrraq=2}W{Ft@dhRG_eNA;FCNKM`|0EbO;DX_=1V5vAZziS@W7- z8A+v9x*n(EosC&8gQ$QMwTBG}0ZT1EIHiV4iioUVEs0{o+mN`8DGW_9LxZ^o#yQK( zL|1bG=epS8?Ro>1s=lU-*sbxABeI;Yc-&YA;X^3ksmW;?m9nu!w^Xyn**ZpUj>5a( zK?$LihZhHw$lCv;FQ4TOt$%%ynJkaCBT&b!w7sWr)`!@V#S@vJ<4#Di0t+Gfc z5xD3kyxjBQXi{5xn`*%Zm}D|Ehyt~|1w+CqsNiT5Qq4!35xgoa(CfS zHMJ@UkQDv+_k@y|_PS*7Y6AWQYne;cKM5andsQjwU6i0}84olpi+G|>jD&3r7z10j zS0IxGnKN!|-2RA=Z>5Ihp7O|I()rnBg`m*_Dd&l4t7PY67j%^o(c;h%lrSoE1acJG zROtlXqy@=9mA6T0bqVd*^t%|{+k;WE~?CGc_F?RFLW7S|lQ@ikButTzhS^c>2 zQML9zyg;EYb-MvRm2b#p>;QRx-fnI@fXvA+Pt*me|8=-?08Kb#N4Qlst7cTmPHsU9 zv{5A$mH0gZ#jX0PpWsZrQBG^w%<)g@|O!hYUBC5f_HGO#iSmf_2koRA$g!2TObnpv-UA6uC zW4^n zBSEQ&y@nbR^%kqmM zRm4|qDAnXBmc#e6gYUe|;+(|RRXdGa*!xjl*CxE)g=r0L)l>}(ksmy?7Yt(-&{Y7p z8FL{vOH$8458%^{ORl*u42=NkkepsRSl;7IZ|a5++GHuy9{CiVdoFSUn!7#SA4`uA zmI3_B9*6ZeWZ=W*z_cslVvkE>kgf_zbLe&j13#Ovf$hza;da4wd=16&IT34NYYDV| z=+8?<<69%hsN~HcM6SI0SdM48Om}h>4OQ&==1V<*P%hAVywd@B*}4GT=P-ugEEb)G z%!2U4y#yrRGk9NkCP4Fxrbs_qFrucH4F{d2f|7Ezw2#J9Xl z@rVI0MZW}*tY(}oHHI2-l;f&|#11kBUWLvC*+*CqkufqvYG3aB-T)(G*ANa4@Qh>D z*KRs*A(yYzq2P9~UpQ>_HlK#8jty;MGtSCIal*(AUvf$Oq(s&n?LiRRAC&-~v$3#z zi2-@OD$g3iH}Fk|cWU&OTt7o}N56q)r!DiS0)b;XH`G79S;dYz@6Pg$R4(?3G6l%U zGv?P@e!qhYby}~clS@gXAcmT!)_n4>MZ1$J2eaZ*g2D$0WEqK{m97%{P*7K^`n_Do zaW3$7{BXtKvdhEpdp|)2))qY)@_ZdMKl)h;S~K0kRM3E|Rpowsg$Utj-|+X->)T?5zqzR&#}Oa+km4c?5FloAI#4e&Fd}KG7d{ z`TxN@`~OO>XJ`Ds>Gd|sGIodmi$J614xh3KJmM-2q!Mg=CUjVDqf)t|OUSq*9-mKw z^Le+%EQA610^o_+huJsXJv~(Sb~C-avpX|rM#;N9uk$%M)412=bblZ3wsLa3`LNQl zxw3R|Pqh10yVR$nPI%6w!{Q_ix`)8dsoe+B2;p0?Pn2d zv@}an&zJRZuEB>K92ePD-rvkui=SERgLtVSc>yeLyPF#uc?>=m3-LGh}O#gRvt=4Xn{=vO$CeMcc z>}eqYjxgv&bNO~(>JzW~R#tY}&vyp<;_2%;c+^Z}va;57$V08ecg?qhAjOe(u~8em zw&rfuaB>}=%<{0p5z?<9VpX70D9!~2@S*{}-@ur%{y9M1BO3$89j6!)hYa&r0+bR= zar#nqc`BVwx=@1u#coZnWYQkg0tw2B_CJo+p?v`iq*g!lAn1O$ZM?tHp!%67^J$=L z4a;hCxLUr3X>dZ`(iEvb^e`AFso@oN2Gw$fU^w;sMHaAkNd}&yb^*KFxiiLo$7OJzMd79 z3LFPv_ajGVECaAKEAhTCXb<#qoa7?Rw>lF3B{}CvKpp~L7#E~PzXpZ`R=%3(!*Yf#JvJevXE`hS($b@zq=THdc?@+4vB??Ybq|u(CF$clea2RNnt#9{x{; z`~MG#ku$VZa<=*3?r^66KG6v1|3{y>ECDCm|0+2;ITLWObN*k%rWUQOMC>+1pEQS$0#Y$*S#;Cc%eGUh;C+o$+QEQGsn^{ zhfinV=fr4c-NpfM`jK~{byecPp@od`pK}?c5w>(~rdGpBd+Zpu6!JqUy?S(qG=z7; zr`m6SFU$LP`4~B#!uEWS>~aoGr;|4__kr98hD2an|K|zp2vD^We{^8)ykT)Vck@WmN`$D)^UVZfLvyjl2t^MMMuiW@ip+HP zvuzqcC1X27S{|h6PyaGAMyz+;_p%0Dg`&+_2~npmDr{PBv|W-8f3t%YWVvS!dWn7^ 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%0Al6nSTq{4$Y2n^#q_|>T;TQRhgXr! z{-Ro~wrVL<{oe9=44-)l7JJ*tkkSeAtQ!_HqDXe}@b?DK>}gY>&__|7EyH_px*=|a zTOuCXk#N{|Vmk{>GjALT7+Pe8=muCaJbO!0#oA!p`MT>sdN8|mTRQ15G~jb)F(JQOyNCu81vsA9@) zw`6#UlW#o`X_!VP92kNUevQaY^IMrdc$>E)Ji+Y#XM5kbvPp4QY zOV*meNt#=cU2~d$4Y~FFoahn@j2-VY(gqq1D^3sCr(`m;>;pCVBd(ZG@YH>Y0BH7^ zp$bvq74!9Fv2@FCM;9y!j-!R_EJM~3j-`UbSXON-oM3Q07lJ9s;qEnKlgk~=@tlzZ zL#^9pTh8{O*1IHcZ;~t(u{kMMH}|B)0@rl~RAg$bQ*NO*Ov@LFLKe$0I=19?<(W*J zjSmchbbzUUFFNO83v`Ty5@CsN%59x zy7P&^6t6VxiIcQ^1P>5F)eO8^&4s;DR%p;Ejk)p`9Y+lW~=A}9vDHCiZ@xX1KYmtOQ31V==W!63~NoEGIlGnIcZz@S* z7ldG>Kp!`pLtja90r~{wqP*Ytw7Ep+h>LkBY8Ad+Lf4pAeyD$DI0*E|xQqcWue((j z@hu4g=M-OuQgzfT^u843FpI60WkY6R8H*gyT)HG0D;dOSiD`1ugKke=+K+Y8YTLko zoQ4J`NgJUPXvPcC=w8d*r)#^8L1C&x?{lGU_`xvr0tfO!&uh}gLdtfP5gJRz{Z~-_ z`}jJFkC6k?b7ZYID%sf)VqIwoE5JI&@=I^fgD@1SH$i9eFiwh2YQf@(Dn{sMY8QG1 z`}YN^9N(l5bXt~poT&FlwMI5>9aJ&lQx&ugyB0ZgsGNM2;)bHnf`B<-QC};9v4=MR z=E5wgl_GCu=cD#{S`6*+2d(M8@f zgDs+a?`_vPpK=yl0Cgvh&W>l-`^oO-J`ovB{MU-(TUsTuK-H@6G}C#&a7j>-edwN3 zi2o&=Xla%n2akTPq8n_8ketCcSPCkwX18xB98*>bBi%J7nNN3J5C6e=GB){lZ`!Mt zBH-Mm+an5P0I^ALY62DNT}Z9-9vF+?NKbo)%*Yj`07o!&v`+ z?J!0*R<{3xh5cuTF|cqj|DWamWrs1cvi{$8SWN4GcGylUtCam)J|Gsvf0?DXw~GSA zFc?wtMaUKRlVaajbUBGa#B@}r>bHMPv6P{BE1=) zgQ1C@?gn54RYju%U}nZ9W@e@)0uA9BA3=Ms!%PrDK0k(O1b_O~2Q-osKu%-NYLA%G z&JN_oAh@!GHZTOPw|{K3e_&z;*2u{4_$8m;jX)=`Jp^L{r(ggwz8MfO6Mf$bn$YCz(Nh%?L+BV5?8d__Jzyi%!~qX5{+j+TQ@(Y`AZg z9L^Cav&W{3e2Jgj3b@q`-0KgTM!>)+sxOnl&Bb65AP7e{fa&lrv^xXgZ=EK94gk*7 z)RYbn4qzS;;F+Px=(DQ3vkds&j{HAItPRe)2lpBm0L@Moz()|RzYV>xttkQiOlj5BDzyK~n?Zlz7kL~wf9$)I7Y*P^f6lKLX7|{{ z7QXf68~OL`gQ+62%5q#{>1XM|&%3bj6%W7;jExNdm>QhfKP(5he`FT;{^yQrk}Tg( zec+p170lWYe*eR)!LI9>AKLZn?YrVH2NtW}Z%wJ$5BWbo>_`0Qa~fyb)Q+F#uP^1- zZSpUx|F81#ujJvchd@$Yd#i6}+3)KQ-xirWzUHhC&@R)(#bc>2@MjCf|Ie))?LIF< z6(BQ6=jOLfeRSm522P|uwe@d9EWU|k9N4@T#*wkD0GXT|SzhFnov^{t9-v!u zS8M_2{GlxrP$t^IE3FNsU)!q}0NRUuxKA!Q3Amr+G3^3>7}5agC#W4j#^`_GFv)ND zLqG<}Z*YeOfb`;D0yTi7XZ&F>gT#-Z-S^|)e0IJM{_`05|9G*Z|KY{nlYfKSGXP~K z{pPXrF7cm7%U;17fYX=%^4VQu{yV7q1n>E8?K5b1z2$$la{3nhY$&L|gd3_-q=xo;j+akA{h`uClru2f z51fe;S(amZJ81=dXuD+|uYI12;OMG9qNJvZ=8_bo9xQr$}o*s3SWRD zO(`E`nojS>4RkTW_bnLxyz*!C_NEO^Wx5l`N0$gc@y6zMjy7qOyX`y-|9D-T@G})&1Ie;7#QSp?yzh^e%S|_;y=(O1y;9jziAWk3uab z^h>;>k@2{cY9YFkcxh>NIG#ux9p)7qi0FH*bvH$Nfa^o==`~ zE!|$tF(hh*TS@eTZYy?p+D$z}m~Ge1c*h-G0yvZRi%=`wTBLeM~ zf{~!gUp=*^KYIB}$nEouc#BQO>c)-j7Du+%HbTG=Iv5zmaUXm}whfG85|(GiV2&qU z@5hd?sX`Vo5TEANcLx8_BS;ma?36PbQM`s??nq^5_PV_<4C%W++AaMnizJ8o zO`g+ANwfhgU{Xa^_X&Q>#!yx~n!PPXj#zY0mulvL8d@@rU-7Ul)L2;C`|^ca)IcE( zg7uy$;}Z|3TSM~K+wAAGj(E~oT=kAvpsU3fK?z#%-n$F-rkWUIrtw}2yqL)`5@J-e zB~dqN9wq~_15zfKO|z)C!C1nMr8ZB(uTs1swpUFzvwQY1m|2;+ibk<*fW>#A&SF1P z*4{sN$bJAPf?2imo|Hd~vBo?bP&sReZ;M9jEId3b7TL6w zQ(QQN?uBb1LG41fxF~n4djq%m%Il2Rd!LTghFu(3Sd{0bf6TYg_Ha!0Vft6}9%-23 zE7U$~B3pONh`j3FlUaF-wcET+w^me`cr5KwL0j~Ide{_%Z_60zH|VXTKH>D|+~hMA zGjs`3FlgwneMsEy+~RkuK}|E=y@FT<7i!4X>5b_IJ+s2>PEho{G@fSY=Xn@^Zj?b) zxHM@iiOqMctx6R8VRG>Z?334y>~-$dz9rn43;3tI`Ta{!BV*cu_@MC8%v8L2Vo))W zFs1s^k>8Yzo5ihB8cY=nli9o<5~q&2;Jr46jqv?nKw z1dnjpAW~&VJSHU4pz?q_UZb^Yz^DMv-Fh6&HdxDzQfr&)%`!~9wlsNKXg(%q{*~(M zCQI$L-eRWCiHP6(hdIJKP|RB$`b9 zdFnx0Mijh4Z%H#DrYq)%!A}#HcCt@V71;6|co+#?pPX0=k%v$O7p|M>@n0D=G#*bn z-5UHqH#b8=4Tk4~&k68F?CU6Wtgj{4lcY1B7{*B4(z_5$a)zI$ui=4SGJaLKXGA*`6-wmz) znpJY-Ya4;Vp4zF3DY#&j%!8`*XY)lCLWUP=`4@G=_@ej@}kz1I2BN8I%9pOLDJUYed?ERs9ryF=2= zr?8ifz{;=VYCD9jAMaJy=?~6;`ca&QOrRcYsgCrTj8}MyS z1{Wj;WGj_cQ*QH|0G0q42=#dasW9H;+`Eq6t76~GuKcvt?4|JxeGR7*m+cbVnxTfH z+{dIw1HWyB6i6ozK+tXah<-7^3+9G=@g6NiV1=C!VF_e>sF}eyNFdn~5#_s$k7lrW zUU@_JxIB|ttCNm~U!Cmo=-{y5+UY`lROt^@YVK08Jyt1gpX@57Mq+0w_y`Fk7Ou6w zvi%vuVg{5mjf^#M2Yb_)?j1w}n~hqIWd_5nEG04a8*6_Q@qh$G>@&r+N|Bb)%QWZE zZ;t@x3bdZ-j*CT0=tG|ZrBW6@X9af|27giwTGowbSNucD-8W7_>6+ey0cl#V!+lA5 zj#h8lIm<&m5fvzPSVMU>Oj;D@7~6=J6H&KECm6+(#2w>y$@oi!nJDwh5&EWWfcgJo>>iec(Sk&cmTlX%ZQHhOyZ*9m+qP}nwr$^Y zCq3#xzr>D=*emn12>jDa*-*ESp*AMF8!DU3`{cje4iN2;OuMyFzU<&<^=p(e6rA(H z!c5*ES9I!Lg_P2&)L?}Z>^u_Ak!m9ympS^Jv>dJ^$PbaGe7h)`I|f1(o?2JBs2~t2 zwQA{sW(OOzN2q84hS`xb1}Ao5_IGvT4wytdByxUJZLbuFnVr7frZPuMC1=a^Uc^}|IwE43CklhUXwi04 zknz)uAc|@Sp!p&c-;AwO@t80!iGAYZLeFT)k?g-Mg?RQP`V=_tr8-!$^~2vOKm|T6 z!%i@V?))qjda8cZ_@OyalpLA%>l*SO5LU-VI+t-+;OMV#x5qe3i~guLv}osrEn;c(@ zM-EMDTC4m8^Ao-1zSBe6X#XwU2o0)G)=cA&!VQjx|JErsu6#lD%wa-_TgW20jSqY1 zjp>jS=Kh)`m=H(#zflyz0xsEOj4dWg-o|Q1#@@J`yvImGXh)@n(Uj!MWqTOU8(iJuPD@NMDkf`mxHo>tMI%Qh&{QTfz7ijxavY++EjQ?)i;ehorsR+mNEP5Uf8$=vmHWkhv^dqEXAS58F z1np*HPxfSVaqXq2y`;N&0FNiCL4_T&ockUDa#Uin;Vf@|a<7yM70GF|G5!Pb0zgg< z-<{sfc0kg;m|t8!SLoBqWwXvkla}O06%|5rVT&QBI~-gFBxvEH4gy7a{HJ#EUY_E5S~> zmg1W``93CEQx*VcO?TRpC-xK?f)@Tx&!+80iMUln%@#@ET0XO57HifIdhIm#>`V1+IgQJ;>*bm8@m8?rngLD4leExVP6XE;5_ z1=O4?{pkAdPy3w*jhAjAe4ry#elsQCLKNXMB2y&(ODw-1YFhki%{4}u%4`n(57#k0 zmuCw@!}^E^mhS)FXpr5Ch= zDroYD11{4&HQ1au3B(d6SP2WFR^CF)#1ZBw~g zdoKgW6U*k3%{n$9c=_~prCEr|tibe8_Lod0Og`&WYz5 z3YZ11T*sPUns-CIi30MYrm@jf@eHl#9PZ8b7s&^<6Y@_^m#R;%uVFpGxlu0Q9d3kV z9Rfm14RSn$?IIDkU^GUJTNW9+<>hy+-u&oleI69_X> zVYORLu^KlB%HtFjox}YH zRo8esCH4Ln*LnO#D0W?bjX|oWt12?8cyxt#+l0T%sK78DrB7cZ4FavjBI$XYEIST| zm5MNvZa^Y5-Ppbc{;ktU7$P-tx?B16_wNNq1)vUptk(p-tkL8-lh8{neEQDNE?gcX z^bp*YZ3*t@PwTIEoCQ1Fymzk^D!kEW%9F6iI@Pk@?|?s)Bh8){OTI z=C)|&-ys@}>uUER0_Y!!tH18`DlANqIOZH z=ceeVr`-JrYfskw9G+xS4-soUO&D|81zX~(`PGr9918l}!>+kOwpPmhLP1{`&b|An z?h)xugSf3pZ3d&Jv|jty*E1i|o}5nTiGz<0d@YupYuIn0-@FI-)z9KF{t&8ta*O2o ztObU<;H8u2h`zhH_4dIz={N5_%?!5zd;l!$&6ocOx3h|48-<&MT@sD1WhXspS!xVo zY2ahdH5vyhDH*FDR~aXzMVkk#f>C4J*D0D~gc+`)I`C-@$nWGYmvNhq)&hX#Fd7ds zB0;JmXY6GMHmS&Bomec_O89J^c7kgSv{l0n-N4TL0 zhhY565!_^UxC4BYChy6>?(8V72>xIt?lU`wO2mfbXG-1oGIks7y`%a zX6s~;$*T<8(<0HP=Cbg2$e>=wyoXY4$n!%gE=Qt^C~OM&r{@(GpyMd+;p;1mE15iv zvytQ+7=1t?7IR!XPU;rXDY~Ge!~ zNP6@=2OT{NpdhnE6;Xx?p=YJZ_hMma4-6I zH=#-V3jP|cTys;`s&~z*;%O^(7N?Td#ECKY(w+wBu>9^gGzHQx&6M^1_&TMqJP%W~ zE+nd+{-=lIxaHf67hbV0v|Xp1ZWloW4LA&&jjlB4Q9YGllb}ptC0d z9jd#&XRj)u7g*jL;$P?Wz(FP}+jm;`A>Sx2MT}D^xd_Q|c2x{rcxLq^xNi?(wtYn& zD{e$e{;e1|Yz#-{)MbQc8iLUryFDC|ML{}*c9ZT}1|m6PO+8Ym#U_l~|h`>|saQlxI}K2iz<+@7IINh40fUG>t-l~OY(WO-WA{tK`VN~36$Az^Sc8#nA0 z<-qqY&};$AI3d}J1#lC3J=U>un9WWX<5?v02KG14XyL{%h-agNWt6!>AF8mCG!i8t z|K*CwxkiV*?71X13pV;{yL}vIy3*2Jdr~uq^s@E+BgX|?HK zlknjn)O&rfRUU1n9Rtd>3)B^;rAB69ds-~St^#-{81$idQUf@RYOLJZz6K(lEaU~1 z@Qqj`O;bDNVQGtAVIqYPF5J%q8lN_-O_0$&*mi8<83${TFK@TK%=oz)JDi7}5PZKB z3uDmEG&2>LK)1q=MnO^eSz zLlI1NrMUO9BfM|2zME4vQ`XcK06mG*vAFRBK+d{s@w%(Q`W{hwHNXluWM$gQI5r6& zIhb%VmmUe^{>CQ4XZz_(g4R7IgY6ns0p_xHqWrY0FDB}SfRZ?WF7EKqf@ID$F;18) zwr?-d$9pNw<$INU_Ss)7W?Q7`XWdp+!i)0KwZXTty_mHH)~Wy1mSXVf##{@GB0Kx~ z#rYS!MV9rQ$Ef)&d43i!PsZj*5#>^#0yKT}+Y`dcP0i>D?@$yBAXhyd@8PcNC>uek zZn`5L*!w_{>c0ID`Pp_b{BGOFp}t3}7Y>Uuu`jSMLLG||OSNZ+Xjz~OQ$bwUMJkwL zn|ct{M*HW(GRrtpM)xk|Q!0je&u0Qd`SgN{_jn!EpJZ(X*y3Eri2TRB)4k^d_AN5r z=h9}yO*|~KnoZlo&q#}8Y+%jGOUm!c~Q4 ztvFK(V+<9i1k=gISb`U;q*H49KIp4#ecbP^0KK+k_ZO)eVfFg=+zwd(dtYM7*FGEgVHoHN1#FR?DB?M$kzT=rc7qzmd8 zr#K}aJ#s9pC=#rX*nYpriLnD`1o&vt4a?dYXajR~0 zI*7PaOq|aG7D>y<^Nu^u4KxPShcE=BPh^TLli06uVjG9_R(tTDi9nD%u65S4rs|8dprEXd=Po8pl1Jej^Xp@#~ z{#od_+iwS#7M4*rr(IrpXa+nw*+My}P7Q)6hhf|&Z&itRA*!~1MqG^(@zpY_8&qMD zci2CO{=^uQwInrx&&M`8dp z!i-N}OZKDAmZM*QkRoUZLC?b&juwW{n~Js@1)5a{22;^!!K(XcWE}n>Y7v-+vaome zdLp4x!=mn@E_vbj;I^dUpF1ig#}&WLe)9I=VLQkLpw0YOetrJe;CrYpAAnto!A{OG zdCTBOh!69>%{&6wS_ z*n-s=vmZ@GFiC;?p+)m!M*VN;cte)|)gI%m}@v%DpwRhgkn4HGY%i;L&py zJ6#FwN)>7}CE*AP1U)nVHCRiL1P+_mFMZ$d?G0YCX}1d6$ectl!%N>bqv%(6qqNhw z`PMaX#|Vb2gwMsPgsFKk9y{84+>YCo!?{>Db4;w><|b2&*KOL?MGUxjg~=t6%Op?F zwavswp7O!q)acnyN3;nEyQU)5gN@TF8@{=$VH(6i4- zp{rf9$=HE_B6j}C8khXPvfJUWN39sXoKG1VXhyOpMORXiBxH5u-U$^~^wuilI=NXH zy*~+6Sk?%7{$)eJq$N6;JM~XJf@`ajlaMNldlpvH0+m2D%lIRa#|QLBEcKxwbwKwD zGHP9sy&WK_9lF(8{Z)XmjD5rl>7e}#5(-qUahfJTPUHmm4}rDz0{f#|atNjce!Xi3 zT#MWKY~4^tQ(BRWI?8egp!+9qG$3sDpD6o>8hxh3p765`8&cGiF5nuhL6Vx9XzQJV zMd;i|ja8k}2esn+)WssiDgIph4Z7Je^~#}T(x^7Jw#rigkr`~{|| zP1OF{dN`XZ38UdHiPcBQwxBCMPl?&pw_yhzMZdo!U9avRDYgwV@qghVBip#_K zpF;w0XbM%d8#I$ok<{b&5myaAr9p`+h{CJc?RZ4)V%_f}=>0XvTUkHKqs_-}+YtR% z0s&)Q*mosfr0!Vy(j(9j@ABK>n>F+eiLVR3W^ajzJdB}*^5ZcnRbU+TyyH5Zz@w3D z%U3Mh?si{!FS8W^qs8F{rJ!>#ErqNGcNY<$y~g{kF5r#iuaBa59LE1DJr7{ZeS! zbj5C4I}r3W)pQP?F^l~Eh+`rDpNeLzCWi>~C_wo2u;Vx(zu%`F_9O;&WB7FHEQIuv zIo};BLipNW&jAc%ix`~I>-vKZ@?~NSDr2UPpwLz@Wbj`qy(B~@p*2FuX704a2-CCUO9RS$F(NAvqM?diCBN!~a?$S^ehV23dXf<%pWo_J}OLjbhHMgTnRH?zAr0 z;juS?2yL1Hn1uO`L9M_iubsH!;L;TJ`40MB7q(qqYY1<>g%qqI0&Ip%Ec&G4DTuY^ zA*|)%bQ_No%s#n<|Q zxF}^$Xvl1PQzB6Yr>-k*n_Y6+xD-zNddM`j7DeQAt)CTx$Q$ldQ2)(-cootO#6-Ju zti-~#Lk16D4$D@BVN?;Ruc6>X!OxrB-Ay$DiF#CZPQ+BN^V;q1i|`b{-el*uUtk;} zzQ!u#zK~%!>1HFeU^b**SkzIY3D}vk7b!PwoW0SxlJpFAOMM|lC4w|-nV+IL2?gVCR; zNXqels~>QWWs|Ny77k(U-H?*u>+Ds)$<^x9!a!8Ie96tPW~^b26BO4VQB$ILK3Hsc zK})2YZ->q{p@xw90y@+b)dxJ&??&jMft@EP&@*tjTXI4PMT8{* zio%L=XErj{*Vstr0hq};{I)R(*BYGKyyvg!>X6KE^O*|?QwGaKn{m?rz}Cxfpf%U@ zkt8Wf+iCj_efrf4Y)c}qJYYOXl`wDP9(ZRiJvQl?i~nBrO!p19i`Ls0u}%h|8h=g; zzt>`^Vxx6MPeZ9v%LzGUthaTUACq|Fk;8O}8DAV$zPfzAfgirqjP%qOnU`9M5VpwE zL$LVPB+ms@tZKjFzgD}+FNP}*LoPY^JT8g~S{1(%Gt@Na>sErsjj_8~k53jqXOIBA>Z6UFR76`EG-_J^hEgOyGj zK4TS$A1+e|m0%o(!@3pPDsDP%)I81ai zD!9aR-Dw~wk!*|DWJVJ3fYO(leg_pjjuOmTBCUagfLwW}Q}V!_^&8g(887ezH@=H8 zI>3-rImkaZA2};vIBkj=MhS2LHSd*p5Z8REPb_2rI%Ge~gV|h1uRNlAVggbvPtruh*^K4K{!14x^jHbL zP^m({AxF+WZ|*;)oAp5aWJaNS**GGara-OP)Ywcdd)DaVWb#SGOo383yuftT%EHAn z)U%5XY75oJV6b%$i9{|%@BuC#Enq`O27=l~@{Tqvv?*_%gONR3obSktR+hJywgk`3 z9p^T2a|`hf()1NVa`M2`(Cpmp?_hkQjJQdJL&CJD+24&Jh(_icU$BOI zn?A|6b^As?iuAG#Nt8%v-kf|l!S<&)m#_xVb~rWjEowca&!z?6V>6Hi2jezn-Tc7n zI3?4_(@q>N~JeZh>sY$uLQIPFKH3Nvvy} zP2g}g`nyZLHHz>aF>gL)V4@2;;aJYqPmuYy!*+iJ{S8gDm?~}<_E6M@gjo_J=<<#1 zGiaH6{ocl#49)~~5=yN;1y`Bod!bC^d9!gW0D>Glg{R<^xRWIpZ1pK4Fz2a$&qPyf z+kz#12Q9Yiqq-T(#j@flaxwXiGUKVByKM*v^hvAvQh51f$O5yCRdQj)#iv807|a&? zl1K$eRgoa{g4j2Exx(0^lNSgQ0vRRNgI>-Qup)@j&sszXHv^G9=vP?rFeQ=1Wo`>_ zqbB>huqN40o5$X$c2%rbI{SkpoJL-{^PPXaah7P+q=tw!O(WN4H?Xq4JUjv!u=K*@ zgWnBu4Rw-Kf86%(VjiC_BzRffVM~~tM>({{?1_}8{as>Ci$>cqz3Qgw8#x<3gnHHY zurpmTYSOq#ZY{bfbr<1br@TMHIzhM#Ywe+NLX&J1*d+lBap<1yVC z$@Q7D^XP?JIsB4nIa}kvBGNZD7tsk@jGSEIbYf|&~ zQ+TRPRbV;*RL833;lDGp0>v3D<)^etH;mt>^dj_bjGUA;G8)OPH=>}#7ElXA=#GJ} zLu0Na&O~$13r{2o9z!*|-|X=vE#(HTHt8J>L`Zpmt&8BWEvjKEq`DqlK2u z{G0+I2zt*41VM`$O4rJt6NqaMMd1_Gga=Ub{-@ra5CyA8$vbZ_B@P4_lS z=gq3f_^v*Oy@o4Uq@P}L-^w`3`A4)do|vd!yj#x+16SqlP3p%z4 z>8KIWkS!9uWGIYhJU=?zTwC{WukSDVeyCQhz(WHyj<;OpPle@xiJy_tR@`_2)LEB} zY>zPzwj;`xutue-U+sBK*6cGaW+lR@s5f=zdpYezKm)VD0|qxH!1Q?*D~w{(gz$-F z6Xsv&(vkYGP;AE!sckwkSz0ryG1mE5<)$~Y@HvWgnYE#Mcj0`FaiDyh-?YrOrifPb zM~ti+PavQi54{JLDMFCEN;U@HBKSpD63PwXxZ`k%R_!_qAV*GDSAjY4Zf-;G8C}r0 zOAn)#2RwTv!H}=)L=5@P`QZ5`*x-;TI6N~284l5T-e!c!<>s7C-V;GO4N=ilPnHt(cd1S}5fhuHcuF*zo2X=*w>SDROzaea6*vBW>^K28Hd< znwss}o9*8HRo&LqUiz)JHmz}5=iQc)sjnEIF}JaUN^S}3qzBO0{8wQnb=3pF#s-JR z#^#1%Z7FSm#&}Lc4bj3rKDM!iKln@2AA~eHe6&hparA^$ZVUrB)*S#K00$VKfj>Sl z|E~<()bQ{lpWlPbFR(Z~vx$>G3>4oM_Agtpob(!(C#RaWMn_NmBTpP42a^|I{J)^{ zvpJW*G~BU?tr-v?MMk?uz_p$_3o{@v%k@mPAYJaCYM|Wwe{v_Gy>FXOD z8G_tZ1nGYvtQa5)32G*e4-SSv=>pS#5G;V)TYaZl?HL+DvNHO>zc&AgY}!&V2G5f> ze79LMxz+zfHqGqnK0ij|ui~lee}eoJ>DA4RAUukB68}e1i#uRi&wVH9WzM)IWW7tc z`_HSjJ~UnXTX0}|B|sJ0=;j@o4P?@p!HvmpC6O^N?K=ci1nwudw%#dRUth!A(_Yr z`9c4#;gK6&fZb`FZ2&VjIyQj#m@wG>r_cSbJyjLi>c1t>E&dKC1ZZ!7J^h*9+r>YY z>({)cvadOVdEno!)W)AGBSC;pe~{X_(Gj!PPq1(Q)Q>#MKmW_$qRBte{l6}JOLc~K zdHNmv+rPNA;aRNf5B$F>JzZVBmO7I^F2MLd+)upcwRWn2=^EYt53*-Rj$Ofq2~zj_ z*cUc6H#dPzYOQXJ%wEz|ejBZS7!3@pAtY9IH$LN_LHl7$jKB1I*D9Ere0x~3^#Z`Oi~pto(`j)FqJp5$FL_UGRs) z_glTPA0GRN)**k%KjT+x&isJ}0I1FH#ecycpMO?H`UB~uwZ4P@22}r@_?8%a(7$)) zuJjS0|9jaRsLT27dbF-``xDr=HjeKjT%#5rzsmTY`rFL<;h)w^y7`;>*~}Q?zg;te zt81eHfoXL37=!wbd#NM**!q?l1iZfdt~09R$^He^_xwIO@v)u3v^o5yFBGr?xZ;1& zD~nwjnS^|ncdzp@a&>I`Qy;X3UGpDMXS@B|JYI8%^B-9A%KZzhlj-@rICWL-5s>p= z`K52j?BMEAa{YK>@>G5N+vo2?7a)L-$DBOO?#bvU&&rgqXLT$ z=t0lf)VW(gNV=$E;;-e_jUt8r?bp~yE$l+lCGvjcv#Jz^v6WM?_PqCGiB!+qwiVP& z@4v$Sb0SgOl8%%atfuTddpbTZ!nJ_j0@)#y&$&9Ej4I8H^S#<7K2qG$?&LvYYO88h zAE~)NZE%U?)S{N+ueS*0nq#p}{RcDi|7diWWKr)`P~_|%_*N$!JH%&_!0$`UIsQ( zem3aT$ksBGp>06_5oRSNpeChj98w3JDvqmMmYwATB0dLRetlHH1RU&~3|^3e+_wnU z$g-WM*{CgN0H|s5i^vt{p{lkr5LS#n!gBcZyI>Kc&8cO+#Cn(-=*jo-ZcQ<05No8aF!ki1yS1`^I zni4h^u55U=uN&DU1|Y(SJwD;XvSrz{zmWk+fx~H@hff-*Pj$ZnlF$2hElhiX)+12* z&_6;rqFpy~*dp{1+;whisWc|qSc@^we5W2=o z$2vN;s68!DkXOc#g0gD4w3JUZIR6?FHY99&+$aFLTmv#xI+}~Hn=y|j=v5LqyI&q} zD@cOT<=TF36p)aYcO;24Pwk^R9RSveWz509w^0G68SSJt$Fh`E`biaHUXBKLtKBHS z{4XGNfmnM{-5C7BqHpyPS3$YCp!X|R+>;#z^3w1y(Lr;n%7+3KFXtq1WHF+D(Uu%C zpQ~37*opM}FktuInn+-KZ6-93kWy0$kDpTHZ?GDbW`os|9B7D9&0Xg)0`1~GmZ7>Q z-?9or8{0Tr(KlgT|8#fXr8Jvm{-YxsJ2^=ZmHH8mD)1K&ms;A+B2$BtD}73Q&`ws z6G?CG^_+`pwNd|WnY5|u3+O8=m9RkKdt-jT7}Q(D`1RgCH|xq_5+Dwlw*2Rot?M+s zmD)I~&Mc_aRi*Yj2I8`WBWeI~Rf)ePlTpj;X_UbUBu={x%S;o7f8Ix07mhHZNuT)C z8SOXFi+y`%5pSJ;=~k42y~l?jLCAKG=|=-CsTSyflux~__?w1cJ#2 z6?~N4`qu&TU#O?kF>9CRyvXAFi>FIxu*B4p&BiVP`f-w`f`GY+2E#=u^ z@O+-fF$6OeCcq@()dxjoi`EZp12i~!C5L-$v61hyA-IEv-8wkL{7Y0&$L_^F5*y_mLYO!UU%2F=F&er~PwmB!r;$-5Rh^VfC%@YmCrJP*U%gs-AUVAN5OxqHHHi z$H^UT%jIB=HlkHMgYh|CVcO6SZ=h@elALQC z2zHqss5f^+V$wi`%laC@UZt=f5J`n21!Bd&{a0$~?lz%xbY1DM;?gx6lmXpzuKTXm_V&)GV(OPLZPF3 z*?O4NNI8H1G&!7&IV*qYoiti;(dx9m#{fw-5}+$<@4D?o2Jg>9?a!j^vC~AU@7Oxm z9zVSVJjHF?kYBfm0grI5wZ%AdyrV_qDHr{>_s)K6c~uLVYi?48|u(o7iER*7wV; z7JOOyC#!@84?`CG)ER3V2#yK(X6-CxcL7#)ImAvo=1v)co52bM4n#H--Sm~Dw;m>a zgxhVs)B)FZKkzc&D8m&m9l6MY-dKrDb2~RSBRfSI(ugx6>=U66Y*uPmHV?-L?n}=UK+RmEl8otee4#hB@%&i2@*CZsa z8_HK@J^SlLF3|eExQoJ#4dZ$}xgr8kx+3x?H0iI9!TaG*^E6^*t8rOuLfRNOI{l@4 zm4i&qJvEZcxBa^33y@SsPmAy3<+&@SP1hZ>`GsP9+Rr2$$krga8VxUw?v1R5$|%$LO= zs+Qm21t6b}qXY!`^tQ1jRnlfrh~<4WGCt?Q9(5wP7a#|_>L$$Y{8E(Y%VJPzlv>!j zctdgG;F0@L!18uRexQHsC!(y3I?m^- zN%0#S@DqK&{uLXGANz9O44n^a6b85$y$7t4%e~n7r7ikSMe{~+g!KG$jifDyO2`pC z}wm_T^a+;Y(jFgQ#!@R!BR!^2u>fx>gF zG|5Tz%H6oGlJQj*hN55W(+75h28&{M-mwT)o+9 z1TAg*bi{ZIBr>{4HMxmyt93?ZGcd^O3ZzE5pV`GglS{j<5GL95^J*dJ|{rOo-NI#Y})a*dQqkK> z3kyLBCqN(SZ<7wy#iN702#t!EjO+VJtD2@b##a`$*6aWUN~yv9sD+iD_CW8QnhhMD zU}IwRk7_2JvEODok&mhCZW8S^K*u>OsnNwtr2OlK!ij{7cq14BOLiXGANTncyS=Qp zQj-<1XRC$uCpI*M;dMjsDuHO-v`Cf!#-H|-a%;U`VY0jWOsoQO4NsQ}0=J&Gl*F0c z#2y}M+F~Ewwc+MRK5+k7>&QC?H zTTx{Hwt{vJY-j8w<^>DAu5tBJ&EkY8u?m=bAZ#bdd(gUlj3$cM0Tg^pi z(^`v=^wcDadoy2{%cM+rsu>-}CxNr)H#1itW;pH4i&fE&?d`T~H{)`2FX$Yv2w*in zW3b|kbsg?2VhW!}Sl|WOJFr@_vr@%%s(G_EXPP;8h^}Y_iEY9x++FY*E2F&w!g^6s zS*Fwor^dV@7=#jqyUGQ+!RSuC;M$801yx7 zxnE$0FXpSbCfMn|bUZ|PO%K#DXb&X=0}Lx4iJRvf_Oz%I0q{{bi1u$RXx?x6Q@q*~ zt`kZ6)D2VPbqM^<7`gAZPj)Nvn>cbCjVR$H%&XnvzOY#UtX%jS*((0sJiV<;T{s}m z+m$2wTcQ+0kl2te_DKLkdDkha{!@64AX4rXn#Vu~Y+l+#NgvNi{Hcl?3k|26D_O~4CZ@^D}b)oMGb`i3BHHV zphtOrgMyimbGB1mzKcW$o;cEW?AEMFd4m)8r#iXuu`B z?)ov4Q&TqH&$qqC!C>WO78EtfJ)Mmq^ff3Z#$j>w1A3hzdZk(acU%6sK06^~bK(Xm z1P+Cjua%eJeW`+(_GYj37jc;HMG}D27p|q3-5rrhQm!sk0Z20V`yUTP^;fee$}UK* zOU89GLKYHcn7Z&(z+$_Wsc5{J$62T{4T4Q5!HX*2J)sUwRhrLt*SaxY+>H!Za>3xQ zEU|6wlLWD~nq$!AEBDMYbqPnIk@=bJP=K4}6NhbNO9$!CbAFS-9nQ03pZOGkSom!Sq%47E!&|erHa}N3EU>U76+kSaU(8#+ zsb%%Kk|#EY7FdeL7SWV3&lJ7X3Iq45J7;?;T(eg_d42W7%Wj1`!(jvtGm?U6JQEMmljfe3L zGP-!#Lbe9eO1s>xd+i|M=M$PqkX)Jea_Bw|{5_)*byeB}ps%2ek*T*Jm|tjef*7{m znelODs7wmv82C9^IhYrC`6X0|;Qyitr6S1vR+hV(Urif`X?A@tA|l>)dz>V9oyPPx)D#k)_ve&4#{-spU}0X(vsqeV_wYA zfY%f>A-@}osuiq##zf8RX2p&t2Q;ME$PLjnyh^xZ*#7$?0=`DLV?Y}! zHUPJR6^m0MgGAk6@yVIe(C;8<*|B|Wd(aVfTvy6`gY+~>Eu1)vo@ZS_=DMQ zkK3{P8gjE(v`8-Z)EVZG>11QTX{BfzUMw{Xu}`JnPV1<*K5px7<}-W31R2>gwi-uD zW`ADZYw6o-BdP}NH9)EYm=+dt^P29Lpp02Qn5$8uUk|#m-Wc(K5a4fk@6j~t>%}aX zm>mu=q4VFe%+)Q>nYxaclEt+?cB43Tdsyepb_C>jjVvt`tIs7_Am9Yb*X$b&F*q$= zmJFpIUfBRr1U#0Rn`c$?Q}RThLP93|Igs{yey&Z4ZKSfP-~x8PxzWIlyUO{BTJsIG zBjnvVyzdVh698@QpAb^->@26mgLLNORHl$w$YB&p(0hO`3|h=DUP62 z6dL@c`KbFgtiy!obM2XnC6LDO4$6BVN6(K~ zl|@P7{Q&n`$W@j5p^tqBt-pu>%eAhl98iG>IKH*sS1#eMUBQS@vnvj9{8ngEn=9lY zhd5-j`ut;VMmzXyoUK#-L3!i<$eU9AclT${*q?$TCfJ;}GM-PQB!~`Q{h$fB6!<8v zvqiM}dZmMhKcc#{Bw$!3A+6-U%?Phisf zmADuYw?^3w5h8NZw-+@Kx602Mt;@yKe|hC0ph2a;o|Bk?O{lYLjdZ;#?4>KM)ArwA zP5`2IhLa}A zh%Q4MB?ilAd*@AVM%Jtq%6p2U_y>`Qx6DJnva;OqP`@5oK@}~#X5Lb$sbiC*5(QIk zRM9-{s61&wrFnw)T3)uF8V?y86FuqeymOv#FAVy0sVaZQBi;Kwj?32_K9(W5@ryuI z&f8iOH*{1k2krXkyn>*c`KV9?A!-!vC_G2PQOzk-;w0KYhlwip@3xIEV0JPs%XWl% zOSaEd3h~mMdJ(q978g?rl@>jg>ZYI%=|=Mf%c5ekxz`0(;`o~>6aJtqq!#KD`He-+X;* zPHn~g_(x`iV|f^%I0(Y@AnGt3RBKS|8YxEA9{e8==!%mr2}A0pRD3BujP|+;-aikKKx;51{M z{wKVIa__SW2=q*;D$K!gbfK#_(9wX#nVfwlR#BL9iU}fPX$|x@5T*}QaB zMpO}ENA5bQWC+i*SQs9g5S*me6Tryp+ES`|%I2MehG}l~;*-1hOiKOS8%lZc`Jv^o zbF17_syW_^SNRmN70Q{o<-Q-^BhJ>0@9`Qvs->?6`$zny&A5=1(~SxXz)J#Zj&9mz zj;vD!#jjL>)F=`jIOL5v>un|RTyhO}=f2q(0mFk51nUf;lZqGnt_FlR<3kqpS%uN7 z1wQE-q6&faZCH%uPT89Xo*bo~8zfaw8R3-|Y8vd1hRki#voQLu>jVF|=J@!bl3Av{ z9~H~U503U`OW|$0qpcD2n80_4^?H7a_-@DZSG%X5nbf)p9%YW)`kH{Rqd}h{#$}9b z<<~5@Q7#g@wO)fETg3-(W5Ya?ur`WYr%7{U@H-p_>Qv}bQ#M&D#BYj@0GjoGNDpwG=m3FRtBZi>gz`|H=iFP+@em>jpf zEqLmCSA!ebK9Gw}b>IuYQ)F-GvSNcfO+05$TAbfLE zZ%#UkxR5E(vM>-2lXNn}&kxn#ppmjD{A`K*dL%-65X}(A=0M^QRR8tPjGZvRYL1Ly z=;o^?senQObkXquaqQxs{a%DR-GfM}w6Tr*<$md^8vNt>RtlHy#E)(M6kCbwI@t}a+3+-% z+jDeeelpe{@xP&{+Kj2VmGxgVxF&0yFxO;lLR^j)ZKFvIHkAKh0@vBtU4bp_8ki@uw*X) zZEUbEohLwK5Y)|zxd8lsI%WOYfRuG85MCaZSn0Fy<39VT(J`)8pEc;s(z+eavpH!1d!(@Ga=Jp(ZV@vOAI4eNH z{(D*~iu_iXKRV^!3T5kosk=W#jkE{N&h-gMHZ?1~Xy_34ARWHb87g-oXRuf|w-MJz z{~u%L6ypmM2iCRCySBZ1*Y;i8wr$(CZQJ;-ZQHhuer?j1rcL@hPm@e0lgaO#qj#4| zGykH%%wH@LCG8ULq%op++D8$QoL59zrY-^3&<}eK-7!y)l7za_uMFG!nHFypr)aymA3(7Pzq=N@L4+3v%OIOn0JohWbslPEcnG*h|&jE;j1sY zj`5iiyoWFYV%JT-6d@(6YVUs1*z9B!njdurVmL9s2?CU)py8^8hPZL4zB>AAK!Hrw z#etQOg{m;cvJRF3l=sa0em2t38-kGKbJDZ{NgDU(+ondjf%+1MWMrSC0!qAwd>Z<9 z2cM>|Y>aX*B6>GSaF}Qn0JBFkI0^3Dunksk&Sr=qL17K&b6-maCMC})E{n)ZGw+m_ zAEf@96Px_H2J_uD!9-twH{MivneSEe+&HY+^p_l0(MKY&cN^cg(Ay*g)&IZ{z1%yp zI#|~R+J&US10CrXyx@}a%LHd$SDGQ-9px3H0>1YvRHU3Ze&AHOP8%%p*t2*uH5t- zo$lhFe$uJ*g#VDy8Mh55c8Bn+JS8JzuZ^7WMbt329G2lrA;<*4X!FLeqD&NOxeP_nncvrF7;zIqW2gt<_XKJEOraYK!U69XtJy&}f ziubm(i8}pB{cG>^)PQXyM_cmVMkb3W=E91oQa+G5c(6$I=Nm#z-FXbq`P9xGoT$Nm zZ19VF6$d?P5+hp@=yW`&V0ZK}ZSduwFFx z)Nm*VTn^U7Z4JC^_}gGtt+C~^795{e-xl=u-K3CfrVTPPpE-xLY$cc>Ic@7CPRtdT)t;ryym!4WT|bs; z_>KPL%`EEEk>duHhw?@CUIO{2mFTdMAPWet&t>-~zGAY|L3e(~)(g#o@Y*G(5sM)G zQ?27h>aZR25i1Ueh`Y34r>7c=I9MnOp&-BHfP1Pl`no3KLn#%a@bVY(y~-Acuq`66 zAn0_*a8d%J-~-NE;;;nan80gi>V!xe$EgW+!qBk#5-g}QI@-tG-=U#%E3y=u7sZ|mkbmog(0s3;4h`B zg)tZ8bMJSI7i|sbjl8C?lX=Cp{W>2qy{x#iO# z7E|OQ<0OoeS7<@bW_rJs-Q`mX`wMFB^HVd6u_=Fd9I?wcO?!t9-T`i`|9H+!_K>+_ zxQ;~c;zuiqx#Dg+fKU#>YC^Jg4#C(u7$Q4`!=&>k47 zm+Uo9_OVR{eI)7nw`hucg2Be~^Xv6rWVMxH7ZP&rpGo5kqf&0@3D;y`Wc$ zezlY_(gV@EV|M~b6kT0=^M=N6Jy{EKSKMfBICQpqCR%0|>x(G5jcIGdP+M%V)D4$N zk5x~Sq-|x0Y+qDbli5Sk_&NiC!|_O5uV_PJn;=FlRK*oJEiLMV(1y;XHMcw>C6J7@ zS@Y$a4uU51?_!i%KQchdmlVh;nC#Ufwh=S1t|p_<2#uSy?SI!`%~HGk1;u+<31dgP zo0kg-6L_H(-BK4Bwke^5+*R$W9Na?N7Pucsgc?mCM$vi8*?_^NWN1T(X3sHg<7X}W z&3HNniuXt60Np!cpv&Yqs%U`1EUp^j| zlJ%mbb1`P-M%z9UYVMM{u=Xx@#W$UCvw!omtz0s`dDy%Vbc<>LP1XxRV;&(Cjfg-Xwr?EG6jx!Od07^AL6j$((#s0FhRQVLz(>J3UG*tA?3 zaY9u81~Vp|_3Z*f@!&IQoIxhy7uI`g{e-|@X+9LONaTU7OK9nSF0k~QKrI!wU#KWN zS39>joVbPA-8cN%G6lh~8KGE0G`-BN#tn1;=+W_dLkaiG_Q~7g+A8cheaKol$PP+q zQ%UHKOyIR&{_q7l|0VPoRjLJx69LE74|d*?u=1y&7Xay0>O+A#To#(HB)uuBdb>8x zup0?M{%<76orYkle}mqCEJ#a@3`Z4m|IGJbj)oc$*JsdCtVDe$Od)NiUYU*zwqw>4 zgdBkb7P;fdF+|H75m#qLge0BCRB+kc?&FL9NM4gU)+TO=3-z3bTwQ2M)>|F!uxX=7 zLm6awLzlT-wvQ%p#x}5Z0c8JmmEpcVUI)`WOq*MOz&|n7*plpuT^fVvw{Li=KwSKx z`SU->lJ&7B8iP0ItJg&!M0f;$$62jLwf_XTDnE~5`=_^=vrQ)$5ge}9vt_^amOL5V z^mCiz%jS)jAiX*3(EzrF>P~m3XsT5JZ1twiFJV*FV>z`UQ?%+xd>=0s{Gcy%=+3FMwFnkxYZY~@hWDXELV={w7@rCO zTcdz4fx3NCssmH#Q`!Glk-$mR;%viVs#PgPN!*5Mq%^=fih>ezr>ts_a4PnEpxkl6UEXxGg*#eo6{i(!MU)TGuW*6lUtut%j5-~nSw@Pq=1SJ@Q0;od!!AR>}! zQh26oQ4>LTBkyNOGiW&{T$5qjh}gt0TZ%iPL4OlJZ3d8t;gJYv3==}tXh!B47I^9M z83;1D8RX(>shtHo#-UR_|tXvcwYO*k_btwj4Hm0Xl=1}|C0kg=G@I|3A=MH z>mj5+u+-r+NL5=zUIdVpXM4;@tP7bVqk*RgfD;gn^q*WCSh{B+ud7>&zuFcvB}<~u zq?UrhfSXm{7mvR+hMg_`g-Fjl0ny5FLX15|H3R-a?Y(gt z@+~yagSt}oNF$iDSWUk&&E_=S7mkMpzLl*r;yRvNAqIV|QEl^Hz_2);KG<)0BWe#V z0#B2M{vaVij%kaO^y){7uHn{9BBSbp9jJib9q0^G@HCDFA>%1!Ryb}{vuoE!guf19 znk^(#@L|~R_0o7uV za>9z$FDgIFUY?pse)x9LcxpE(@!h6A_~4x)dZeVJkzhat)}esbLff+J!GJnmKZ+fX zTQ!sY?>+()AFZQxOV(B?!?&ZkR9BeWL{(B2*34Xw!4O@w-N|7*-91DB{{;#&37)S4 z`FX@^{j&90S#1Qdz}OOnUFsRm101%BhPre`XFxMQ7KF z98c_-tw(~FPg5kF22FYj>N5hW0lgiez-iz5-4=)+%5Lq)YFiC$c?+^?K6NbqHr#k4 zCy#br1<>Cp7uZUX9g0#s;XsX~Dtlc-SeVzQD7a*Dm?}#R7<<rDf0t| zL62JSH*%K{ldJLWad~|G`p)o>M!Cw9SV<4#Hc%?@%65A4GgcEdtY{4+^TmOP`QSJ6 zf*zEz#Xk=z$MmJ4XoU-*S6qfb3cP@kentsYt}-DlE3#y5w?CMWD|_U35|D zqhu|{u{sL8_jryj$Ir15^rQ>78s(MpJT>nNnNMMgA2ys`7JECh$6#6^c&??z>u&qA z%|kTqEk}MyM2xW;;qttH4T3C&M(nl_k5U7p>YFTj9IFW=ezigdEsq)U4+DUc&ZOrSJo&1UpOS)Xw@yR9ShCsS2ZQgtiega^X#n?WFuJOqxcHG< z->O{HZz7z)n*t;Z$pu%UqSUr8#j%X-gugO65{mKY6MTHL$!K1-8A%E)QE=$kh+QV7S`r8zq zsL|bGRiJdB%@h%vW}g>661JKW>I08VgLaNPh&v`4e%A<6UDwVx^JJeGfRks-owu1y zZ-uB;&gn=_=)_%DmPm@^LuMb5hJfv*Hpg_P%RGLhY_Mc_X}@sZ7;#gTsI3(HadYt)BWzL~)o&2sZAWUj#ZrJ$ zc(RBHCbS-e*l;A8@#3(6(h3?Fd@X7{q`pW~jf0#Xo(3Q`@okos_}@9Xy(yFDkH08b z!bG4d%gx_4l)6q-$h!^Uv(#9xO)pB@zvEuy_M+O5o_tfjjB(K^Mh7a0<_}!czK{=o z_!!x9E6@Ko;|E)_9{vIF@mr$0s6vx+UAI6JV>`Z@Xz$jxCgKiRlD+Sr8_ThJFQ;Mj zDAgcs#Ux+5YaDOk{I5CkH#ET82JBo%FD84wUq>HmSIG5*J_{hw$W?p7;nco*dA|02_%Zu+s!^Bvrv@o@to+xBj3`va}) zq4Bi?lm4rP*!{ekR+>gqpS9Rr`^;>VVQWgV%BVuainG*L7X{(a#K#CD5k9LbVU0oW z?d=&J?(K;blq?6fuLt}Zi5DybceM-Q;(`6vK~Z5cj$JR4!#jGxdtaUb$vd}!0(Afh z=n4|%5kf-xCj|-b@dw1x2Lf5dLk@x5rNZZ*odLOu7Nj^jKez^{YjpKIe4Uc`_h%ym zp&{)Vy>sIc8X&p`qzB;w*$LXN=zpq-ImP1%EY9PCxIX?6ko^g++1|xk2g#6{k#(|*|n8ZH#h!b9%UzkQc0)gnp zz9Kx)hg@AnbAyDfhuurT%dg0XlXn5({z9$(k^_R>+Z_Z3TKE5@d$oJf3n4`CqX?Rs z#=FiDK-fWor12*kLV%M`Q89ITbTk6?$EE#&0bB3j>OBeK5kTUOU$^SptqB5ZM7aQ( zyA1xFIkmh2ad31paSB=cW+nO5GtrIH80i<9nBT#_+B=DSQ1e?r!mNM4?C@&(_3CIv zh|NXl{S{0_f`pv}jMUq^8Lqneb94ov7yrh1uoiqZXasBn@!;a(dV_!f)w2Lynb=PM zUxUst}^xgAW7X_5}@g+#Y6ttJ2^mjdHwz`7J^y;6aWMp z-htBxXASNk@UHZ|4A=Sv3D^O^4#D2V9;)~X0FCPL|9%@kRWibgLvr8p@B8U7btUJ9 z7WaZY0!V&Wsi@A+!0$|s_rdEOAAo=b2q7u_!`ui7<3Gd{( z>Q0~XQh9%tfd&Dv15j^yEy}ohDX1>snqTB;e%EWj$~3|OkgAh&$k%fpka_?v?(gJl zr_o7kU0nEO74xrafS%f!-@*h(I=ALmi&b{rE1aVPut$-7H%w$w7~~$Tw~i!i{pzkJ zM12z{M`uqdkgoU>q∈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 kPYe8Mfj=$q|6dCL<53H^nHq)$ literal 0 HcmV?d00001 diff --git a/SPEX/Doc/SPEX_UserGuide.pdf b/SPEX/Doc/SPEX_UserGuide.pdf deleted file mode 100644 index fc41510903f608a0d9b3589fdd3078f12222bc9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386707 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�lb_u*K1Eh&k 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 d(D4_sY&Z-1H19v)1aLfDtZ build/amd_demo.out && ( command -v d2u && d2u ./build/amd_demo.out || true ) - - diff Demo/amd_demo.out build/amd_demo.out - ./build/amd_l_demo > build/amd_l_demo.out && ( command -v d2u && d2u ./build/amd_l_demo.out || true ) - - diff Demo/amd_l_demo.out build/amd_l_demo.out - ./build/amd_demo2 > build/amd_demo2.out && ( command -v d2u && d2u ./build/amd_demo2.out || true ) - - diff Demo/amd_demo2.out build/amd_demo2.out - ./build/amd_simple > build/amd_simple.out && ( command -v d2u && d2u ./build/amd_simple.out || true ) - - diff Demo/amd_simple.out build/amd_simple.out + ( cd build && cmake $(CMAKE_OPTIONS) -DDEMO=1 .. && cmake --build . -j${JOBS} ) + ./build/amd_demo > build/amd_demo.out + - diff --strip-trailing-cr Demo/amd_demo.out build/amd_demo.out + ./build/amd_l_demo > build/amd_l_demo.out + - diff --strip-trailing-cr Demo/amd_l_demo.out build/amd_l_demo.out + ./build/amd_demo2 > build/amd_demo2.out + - diff --strip-trailing-cr Demo/amd_demo2.out build/amd_demo2.out + ./build/amd_simple > build/amd_simple.out + - diff --strip-trailing-cr Demo/amd_simple.out build/amd_simple.out # Fortran demos will fail if no Fortran compiler is available - - ./build/amd_f77simple > build/amd_f77simple.out && ( command -v d2u && d2u ./build/amd_f77simple.out || true ) - - diff Demo/amd_f77simple.out build/amd_f77simple.out - - ./build/amd_f77demo > build/amd_f77demo.out && ( command -v d2u && d2u ./build/amd_f77demo.out || true ) - - diff Demo/amd_f77demo.out build/amd_f77demo.out + - ./build/amd_f77simple > build/amd_f77simple.out + - diff --strip-trailing-cr Demo/amd_f77simple.out build/amd_f77simple.out + - ./build/amd_f77demo > build/amd_f77demo.out + - diff --strip-trailing-cr Demo/amd_f77demo.out build/amd_f77demo.out # just compile after running cmake; do not run cmake again remake: diff --git a/AMD/Source/amd_order.c b/AMD/Source/amd_order.c index 9df32164..1dcc15a0 100644 --- a/AMD/Source/amd_order.c +++ b/AMD/Source/amd_order.c @@ -71,9 +71,9 @@ int AMD_order return (AMD_INVALID) ; } - /* check if n or nz will cause integer overflow */ - if (((size_t) n) >= Int_MAX / sizeof (Int) - || ((size_t) nz) >= Int_MAX / sizeof (Int)) + /* 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 */ @@ -89,9 +89,8 @@ int AMD_order } /* allocate two size-n integer workspaces */ - size_t nn = (size_t) n ; - Len = SuiteSparse_malloc (nn, sizeof (Int)) ; - Pinv = SuiteSparse_malloc (nn, sizeof (Int)) ; + Len = SuiteSparse_malloc (n, sizeof (Int)) ; + Pinv = SuiteSparse_malloc (n, sizeof (Int)) ; mem += n ; mem += n ; if (!Len || !Pinv) @@ -107,7 +106,7 @@ int AMD_order { /* sort the input matrix and remove duplicate entries */ AMD_DEBUG1 (("Matrix is jumbled\n")) ; - Rp = SuiteSparse_malloc (nn+1, sizeof (Int)) ; + Rp = SuiteSparse_malloc (n+1, sizeof (Int)) ; Ri = SuiteSparse_malloc (nz, sizeof (Int)) ; mem += (n+1) ; mem += MAX (nz,1) ; @@ -153,8 +152,8 @@ int AMD_order slen += nzaat/5 ; /* add elbow room */ for (i = 0 ; ok && i < 7 ; i++) { - ok = ((slen + nn) > slen) ; /* check for size_t overflow */ - slen += nn ; /* size-n elbow room, 6 size-n work */ + 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 */ diff --git a/AMD/Source/amd_version.c b/AMD/Source/amd_version.c deleted file mode 100644 index 7d045f35..00000000 --- a/AMD/Source/amd_version.c +++ /dev/null @@ -1,19 +0,0 @@ -//------------------------------------------------------------------------------ -// AMD/Source/amd_version: return AMD version -//------------------------------------------------------------------------------ - -// AMD, Copyright (c) 1996-2023, Timothy A. Davis, Patrick R. Amestoy, and -// Iain S. Duff. All Rights Reserved. -// SPDX-License-Identifier: BSD-3-clause - -//------------------------------------------------------------------------------ - -#include "amd_internal.h" - -void amd_version (int version [3]) -{ - version [0] = AMD_MAIN_VERSION ; - version [1] = AMD_SUB_VERSION ; - version [2] = AMD_SUBSUB_VERSION ; -} - diff --git a/AMD/cmake_modules/FindAMD.cmake b/AMD/cmake_modules/FindAMD.cmake new file mode 100644 index 00000000..1b135e05 --- /dev/null +++ b/AMD/cmake_modules/FindAMD.cmake @@ -0,0 +1,129 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/AMD/cmake_modules/FindAMD.cmake +#------------------------------------------------------------------------------- + +# The following copyright and license applies to just this file only, not to +# the library itself: +# FindAMD.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +#------------------------------------------------------------------------------- + +# Finds the AMD include file and compiled library and sets: + +# AMD_INCLUDE_DIR - where to find amd.h +# AMD_LIBRARY - dynamic AMD library +# AMD_STATIC - static AMD library +# AMD_LIBRARIES - libraries when using AMD +# AMD_FOUND - true if AMD found + +# set ``AMD_ROOT`` to an AMD installation root to +# tell this module where to look. + +# All the Find*.cmake files in SuiteSparse are installed by 'make install' into +# /usr/local/lib/cmake/SuiteSparse (where '/usr/local' is the +# ${CMAKE_INSTALL_PREFIX}). To access this file, place the following commands +# in your CMakeLists.txt file. See also SuiteSparse/Example/CMakeLists.txt: +# +# set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} +# ${CMAKE_INSTALL_PREFIX}/lib/cmake/SuiteSparse ) + +#------------------------------------------------------------------------------- + +# include files for AMD +find_path ( AMD_INCLUDE_DIR + NAMES amd.h + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/AMD + HINTS ${CMAKE_SOURCE_DIR}/../AMD + PATH_SUFFIXES include Include +) + +# dynamic AMD library (or static if no dynamic library was built) +find_library ( AMD_LIBRARY + NAMES amd amd_static + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/AMD + HINTS ${CMAKE_SOURCE_DIR}/../AMD + PATH_SUFFIXES lib build build/Release build/Debug +) + +if ( MSVC ) + set ( STATIC_NAME amd_static ) +else ( ) + set ( STATIC_NAME amd ) + set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) + set ( CMAKE_FIND_LIBRARY_SUFFIXES + ${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) +endif ( ) + +# static AMD library +find_library ( AMD_STATIC + NAMES ${STATIC_NAME} + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/AMD + HINTS ${CMAKE_SOURCE_DIR}/../AMD + PATH_SUFFIXES lib build build/Release build/Debug +) + +if ( NOT MSVC ) + # restore the CMAKE_FIND_LIBRARY_SUFFIXES variable + set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) +endif ( ) + +# get version of the library from the dynamic library name +get_filename_component ( AMD_LIBRARY ${AMD_LIBRARY} REALPATH ) +get_filename_component ( AMD_FILENAME ${AMD_LIBRARY} NAME ) +string ( + REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" + AMD_VERSION + ${AMD_FILENAME} +) + +# set ( AMD_VERSION "" ) +if ( EXISTS "${AMD_INCLUDE_DIR}" AND NOT AMD_VERSION ) + # if the version does not appear in the filename, read the include file + file ( STRINGS ${AMD_INCLUDE_DIR}/amd.h AMD_MAJOR_STR + REGEX "define AMD_MAIN_VERSION" ) + file ( STRINGS ${AMD_INCLUDE_DIR}/amd.h AMD_MINOR_STR + REGEX "define AMD_SUB_VERSION" ) + file ( STRINGS ${AMD_INCLUDE_DIR}/amd.h AMD_PATCH_STR + REGEX "define AMD_SUBSUB_VERSION" ) + message ( STATUS "major: ${AMD_MAJOR_STR}" ) + message ( STATUS "minor: ${AMD_MINOR_STR}" ) + message ( STATUS "patch: ${AMD_PATCH_STR}" ) + string ( REGEX MATCH "[0-9]+" AMD_MAJOR ${AMD_MAJOR_STR} ) + string ( REGEX MATCH "[0-9]+" AMD_MINOR ${AMD_MINOR_STR} ) + string ( REGEX MATCH "[0-9]+" AMD_PATCH ${AMD_PATCH_STR} ) + set (AMD_VERSION "${AMD_MAJOR}.${AMD_MINOR}.${AMD_PATCH}") +endif ( ) + +set ( AMD_LIBRARIES ${AMD_LIBRARY} ) + +include (FindPackageHandleStandardArgs) + +find_package_handle_standard_args ( AMD + REQUIRED_VARS AMD_LIBRARY AMD_INCLUDE_DIR + VERSION_VAR AMD_VERSION +) + +mark_as_advanced ( + AMD_INCLUDE_DIR + AMD_LIBRARY + AMD_STATIC + AMD_LIBRARIES +) + +if ( AMD_FOUND ) + message ( STATUS "AMD version: ${AMD_VERSION}" ) + message ( STATUS "AMD include: ${AMD_INCLUDE_DIR}") + message ( STATUS "AMD library: ${AMD_LIBRARY}") + message ( STATUS "AMD static: ${AMD_STATIC}") +else ( ) + message ( STATUS "AMD not found" ) + set ( AMD_INCLUDE_DIR "" ) + set ( AMD_LIBRARIES "" ) + set ( AMD_LIBRARY "" ) + set ( AMD_STATIC "" ) +endif ( ) + diff --git a/CITATION.bib b/CITATION.bib deleted file mode 100644 index 54df4255..00000000 --- a/CITATION.bib +++ /dev/null @@ -1,91 +0,0 @@ - -@article{10.1145/1024074.1024081, -author = {Amestoy, Patrick R. and Davis, Timothy A. and Duff, Iain S.}, -title = {Algorithm 837: AMD, an Approximate Minimum Degree Ordering Algorithm}, -year = {2004}, -issue_date = {September 2004}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {30}, -number = {3}, -issn = {0098-3500}, -url = {https://doi.org/10.1145/1024074.1024081}, -doi = {10.1145/1024074.1024081}, -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.}, -journal = {ACM Trans. Math. Softw.}, -month = {sep}, -pages = {381–388}, -numpages = {8}, -keywords = {sparse matrices, Linear equations, ordering methods, minimum degree} -} - -@article{doi:10.1137/S0895479894278952, -author = {Amestoy, Patrick R. and Davis, Timothy A. and Duff, Iain S.}, -title = {An Approximate Minimum Degree Ordering Algorithm}, -journal = {SIAM Journal on Matrix Analysis and Applications}, -volume = {17}, -number = {4}, -pages = {886-905}, -year = {1996}, -doi = {10.1137/S0895479894278952}, -URL = { https://doi.org/10.1137/S0895479894278952 }, -eprint = { https://doi.org/10.1137/S0895479894278952 } , - abstract = { Abstract. An approximate minimum degree (AMD), ordering algorithm for preordering a symmetric sparse matrix prior to numerical factorization is presented. We use techniques based on the quotient graph for matrix factorization that allow us to obtain computationally cheap bounds for the minimum degree. We show that these bounds are often equal to the actual degree. The resulting algorithm is typically much faster than previous minimum degree ordering algorithms and produces results that are comparable in quality with the best orderings from other minimum degree algorithms. } -} - - -@article{10.1145/1024074.1024080, -author = {Davis, Timothy A. and Gilbert, John R. and Larimore, Stefan I. and Ng, Esmond G.}, -title = {Algorithm 836: COLAMD, a Column Approximate Minimum Degree Ordering Algorithm}, -year = {2004}, -issue_date = {September 2004}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {30}, -number = {3}, -issn = {0098-3500}, -url = {https://doi.org/10.1145/1024074.1024080}, -doi = {10.1145/1024074.1024080}, -abstract = {Two codes are discussed, COLAMD and SYMAMD, that compute approximate minimum degree orderings for sparse matrices in two contexts: (1) sparse partial pivoting, which requires a sparsity preserving column pre-ordering prior to numerical factorization, and (2) sparse Cholesky factorization, which requires a symmetric permutation of both the rows and columns of the matrix being factorized. These orderings are computed by COLAMD and SYMAMD, respectively. The ordering from COLAMD is also suitable for sparse QR factorization, and the factorization of matrices of the form ATA and AAT, such as those that arise in least-squares problems and interior point methods for linear programming problems. The two routines are available both in MATLAB and C-callable forms. They appear as built-in routines in MATLAB Version 6.0.}, -journal = {ACM Trans. Math. Softw.}, -month = {sep}, -pages = {377–380}, -numpages = {4}, -keywords = {sparse nonsymmetric matrices, ordering methods, Linear equations} -} - -@article{10.1145/1024074.1024079, -author = {Davis, Timothy A. and Gilbert, John R. and Larimore, Stefan I. and Ng, Esmond G.}, -title = {A Column Approximate Minimum Degree Ordering Algorithm}, -year = {2004}, -issue_date = {September 2004}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -volume = {30}, -number = {3}, -issn = {0098-3500}, -url = {https://doi.org/10.1145/1024074.1024079}, -doi = {10.1145/1024074.1024079}, -abstract = {Sparse Gaussian elimination with partial pivoting computes the factorization PAQ = LU of a sparse matrix A, where the row ordering P is selected during factorization using standard partial pivoting with row interchanges. The goal is to select a column preordering, Q, based solely on the nonzero pattern of A, that limits the worst-case number of nonzeros in the factorization. The fill-in also depends on P, but Q is selected to reduce an upper bound on the fill-in for any subsequent choice of P. The choice of Q can have a dramatic impact on the number of nonzeros in L and U. One scheme for determining a good column ordering for A is to compute a symmetric ordering that reduces fill-in in the Cholesky factorization of ATA. A conventional minimum degree ordering algorithm would require the sparsity structure of ATA to be computed, which can be expensive both in terms of space and time since ATA may be much denser than A. An alternative is to compute Q directly from the sparsity structure of A; this strategy is used by MATLAB's COLMMD preordering algorithm. A new ordering algorithm, COLAMD, is presented. It is based on the same strategy but uses a better ordering heuristic. COLAMD is faster and computes better orderings, with fewer nonzeros in the factors of the matrix.}, -journal = {ACM Trans. Math. Softw.}, -month = {sep}, -pages = {353–376}, -numpages = {24}, -keywords = {linear equations, Sparse nonsymmetric matrices, ordering methods} -} - -@article{10.1145/3519024, -author = {Lourenco, Christopher and Chen, Jinhao and Moreno-Centeno, Erick and Davis, Timothy A.}, -title = {Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via a Sparse Left-Looking Integer-Preserving LU Factorization}, -year = {2022}, -publisher = {Association for Computing Machinery}, -address = {New York, NY, USA}, -issn = {0098-3500}, -url = {https://doi.org/10.1145/3519024}, -doi = {10.1145/3519024}, -abstract = {SPEX Left LU is a software package for exactly solving unsymmetric sparse linear systems. As a component of the sparse exact (SPEX) software package, SPEX Left LU can be applied to any input matrix, A, whose entries are integral, rational, or decimal, and provides a solution to the system Ax = b which is either exact or accurate to user-specified precision. SPEX Left LU preorders the matrix A with a user-specified fill-reducing ordering and computes a left-looking LU factorization with the special property that each operation used to compute the L and U matrices is integral. Notable additional applications of this package include benchmarking the stability and accuracy of state-of-the-art linear solvers, and determining whether singular-to-double-precision matrices are indeed singular. Computationally, this paper evaluates the impact of several novel pivoting schemes in exact arithmetic, benchmarks the exact iterative solvers within Linbox, and benchmarks the accuracy of MATLAB sparse backslash. Most importantly, it is shown that SPEX Left LU outperforms the exact iterative solvers in run time on easy instances and in stability as the iterative solver fails on a sizeable subset of the tested (both easy and hard) instances. The SPEX Left LU package is written in ANSI C, comes with a MATLAB interface, and is distributed via GitHub, as a component of the SPEX software package, and as a component of SuiteSparse.}, -journal = {ACM Trans. Math. Softw.}, -month = {jun}, -keywords = {exact matrix factorization, sparse linear systems, sparse matrix algorithms, exactly solving linear systems, roundoff errors} -} - diff --git a/COLAMD/CMakeLists.txt b/COLAMD/CMakeLists.txt index 4d4b17cf..0f9603c9 100644 --- a/COLAMD/CMakeLists.txt +++ b/COLAMD/CMakeLists.txt @@ -2,53 +2,48 @@ # SuiteSparse/COLAMD/CMakeLists.txt: cmake for COLAMD #------------------------------------------------------------------------------- -# Copyright (c) 1998-2024, Timothy A. Davis. All Rights Reserved. +# Copyright (c) 1998-2023, Timothy A. Davis. All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- # get the version #------------------------------------------------------------------------------- -cmake_minimum_required ( VERSION 3.22 ) +cmake_minimum_required ( VERSION 3.19 ) -set ( COLAMD_DATE "Mar 22, 2024" ) -set ( COLAMD_VERSION_MAJOR 3 CACHE STRING "" FORCE ) -set ( COLAMD_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( COLAMD_VERSION_SUB 3 CACHE STRING "" FORCE ) +set ( COLAMD_DATE "Jan 17, 2023" ) +set ( COLAMD_VERSION_MAJOR 3 ) +set ( COLAMD_VERSION_MINOR 0 ) +set ( COLAMD_VERSION_SUB 3 ) message ( STATUS "Building COLAMD version: v" ${COLAMD_VERSION_MAJOR}. ${COLAMD_VERSION_MINOR}. ${COLAMD_VERSION_SUB} " (" ${COLAMD_DATE} ")" ) -#------------------------------------------------------------------------------- -# define the project -#------------------------------------------------------------------------------- - -project ( COLAMD - VERSION "${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB}" - LANGUAGES C ) - #------------------------------------------------------------------------------- # SuiteSparse policies #------------------------------------------------------------------------------- set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${PROJECT_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) + ${CMAKE_SOURCE_DIR}/cmake_modules + ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) include ( SuiteSparsePolicy ) +#------------------------------------------------------------------------------- +# define the project +#------------------------------------------------------------------------------- + +project ( colamd + VERSION "${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB}" + LANGUAGES C ) + #------------------------------------------------------------------------------- # find library dependencies #------------------------------------------------------------------------------- -if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.7.0 - PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - find_package ( SuiteSparse_config 7.7.0 REQUIRED ) - endif ( ) -endif ( ) +find_package ( SuiteSparse_config 7.0.0 REQUIRED ) #------------------------------------------------------------------------------- # configure files @@ -62,7 +57,7 @@ configure_file ( "Config/colamd.h.in" # include directories #------------------------------------------------------------------------------- -include_directories ( Source Include ) +include_directories ( Source Include ${SUITESPARSE_CONFIG_INCLUDE_DIR} ) #------------------------------------------------------------------------------- # dynamic colamd library properties @@ -70,79 +65,48 @@ include_directories ( Source Include ) file ( GLOB COLAMD_SOURCES "Source/*.c" ) -if ( BUILD_SHARED_LIBS ) - add_library ( COLAMD SHARED ${COLAMD_SOURCES} ) - - set_target_properties ( COLAMD PROPERTIES - VERSION ${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB} - C_STANDARD 11 - C_STANDARD_REQUIRED ON - OUTPUT_NAME colamd - SOVERSION ${COLAMD_VERSION_MAJOR} - PUBLIC_HEADER "Include/colamd.h" - WINDOWS_EXPORT_ALL_SYMBOLS ON ) - - if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) - set_target_properties ( COLAMD PROPERTIES EXPORT_NO_SYSTEM ON ) - endif ( ) +add_library ( colamd SHARED ${COLAMD_SOURCES} ) - target_include_directories ( COLAMD - INTERFACE $ - $ ) -endif ( ) +set_target_properties ( colamd PROPERTIES + VERSION ${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB} + C_STANDARD_REQUIRED 11 + SOVERSION ${COLAMD_VERSION_MAJOR} + PUBLIC_HEADER "Include/colamd.h" + WINDOWS_EXPORT_ALL_SYMBOLS ON ) #------------------------------------------------------------------------------- # static colamd library properties #------------------------------------------------------------------------------- -if ( BUILD_STATIC_LIBS ) - add_library ( COLAMD_static STATIC ${COLAMD_SOURCES} ) +if ( NOT NSTATIC ) + add_library ( colamd_static STATIC ${COLAMD_SOURCES} ) - set_target_properties ( COLAMD_static PROPERTIES + set_target_properties ( colamd_static PROPERTIES + VERSION ${COLAMD_VERSION_MAJOR}.${COLAMD_VERSION_MINOR}.${COLAMD_VERSION_SUB} OUTPUT_NAME colamd - C_STANDARD 11 - C_STANDARD_REQUIRED ON - PUBLIC_HEADER "Include/colamd.h" ) + C_STANDARD_REQUIRED 11 + SOVERSION ${COLAMD_VERSION_MAJOR} ) - if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) - set_target_properties ( COLAMD_static PROPERTIES + if ( MSVC ) + set_target_properties ( colamd_static PROPERTIES OUTPUT_NAME colamd_static ) endif ( ) - - if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) - set_target_properties ( COLAMD_static PROPERTIES EXPORT_NO_SYSTEM ON ) - endif ( ) - - target_include_directories ( COLAMD_static - INTERFACE $ - $ ) endif ( ) #------------------------------------------------------------------------------- # add the library dependencies #------------------------------------------------------------------------------- -if ( BUILD_SHARED_LIBS ) - target_link_libraries ( COLAMD PRIVATE SuiteSparse::SuiteSparseConfig ) - target_include_directories ( COLAMD PUBLIC - "$" ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - if ( TARGET SuiteSparse::SuiteSparseConfig_static ) - target_link_libraries ( COLAMD_static PUBLIC SuiteSparse::SuiteSparseConfig_static ) - else ( ) - target_link_libraries ( COLAMD_static PUBLIC SuiteSparse::SuiteSparseConfig ) - endif ( ) +target_link_libraries ( colamd PUBLIC ${SUITESPARSE_CONFIG_LIBRARY} ) +if ( NOT NSTATIC ) + target_link_libraries ( colamd_static PUBLIC ${SUITESPARSE_CONFIG_STATIC} ) endif ( ) # libm: if ( NOT WIN32 ) - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( COLAMD PRIVATE m ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - set ( COLAMD_STATIC_LIBS "${COLAMD_STATIC_LIBS} -lm" ) - target_link_libraries ( COLAMD_static PUBLIC m ) + target_link_libraries ( colamd PUBLIC m ) + if ( NOT NSTATIC ) + target_link_libraries ( colamd_static PUBLIC m ) endif ( ) endif ( ) @@ -150,99 +114,25 @@ endif ( ) # COLAMD installation location #------------------------------------------------------------------------------- -include ( CMakePackageConfigHelpers ) - -if ( BUILD_SHARED_LIBS ) - install ( TARGETS COLAMD - EXPORT COLAMDTargets - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - install ( TARGETS COLAMD_static - EXPORT COLAMDTargets - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) - -# create (temporary) export target file during build -export ( EXPORT COLAMDTargets - NAMESPACE SuiteSparse:: - FILE ${CMAKE_CURRENT_BINARY_DIR}/COLAMDTargets.cmake ) - -# install export target, config and version files for find_package -install ( EXPORT COLAMDTargets - NAMESPACE SuiteSparse:: - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/COLAMD ) - -# generate config file to be used in common build tree -set ( SUITESPARSE_IN_BUILD_TREE ON ) -configure_package_config_file ( - Config/COLAMDConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/COLAMDConfig.cmake - INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/COLAMDConfig.cmake ) - -# generate config file to be installed -set ( SUITESPARSE_IN_BUILD_TREE OFF ) -configure_package_config_file ( - Config/COLAMDConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/target/COLAMDConfig.cmake - INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/COLAMD ) - -write_basic_package_version_file ( - ${CMAKE_CURRENT_BINARY_DIR}/COLAMDConfigVersion.cmake - COMPATIBILITY SameMajorVersion ) - -install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/target/COLAMDConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/COLAMDConfigVersion.cmake - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/COLAMD ) - -#------------------------------------------------------------------------------- -# create pkg-config file -#------------------------------------------------------------------------------- - -if ( NOT MSVC ) - set ( prefix "${CMAKE_INSTALL_PREFIX}" ) - set ( exec_prefix "\${prefix}" ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) - if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) - set ( libdir "${SUITESPARSE_LIBDIR}") - else ( ) - set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") - endif ( ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) - if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) - set ( includedir "${SUITESPARSE_INCLUDEDIR}") - else ( ) - set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") - endif ( ) - if ( BUILD_SHARED_LIBS ) - set ( SUITESPARSE_LIB_BASE_NAME $ ) - else ( ) - set ( SUITESPARSE_LIB_BASE_NAME $ ) - endif ( ) - configure_file ( - Config/COLAMD.pc.in - COLAMD.pc.out - @ONLY - NEWLINE_STYLE LF ) - file ( GENERATE - OUTPUT COLAMD.pc - INPUT ${CMAKE_CURRENT_BINARY_DIR}/COLAMD.pc.out - NEWLINE_STYLE LF ) - install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/COLAMD.pc - DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) +install ( TARGETS colamd + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +install ( FILES ${CMAKE_SOURCE_DIR}/cmake_modules/FindCOLAMD.cmake + DESTINATION ${SUITESPARSE_LIBDIR}/cmake/SuiteSparse + COMPONENT Development ) +if ( NOT NSTATIC ) + install ( TARGETS colamd_static + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} ) endif ( ) #------------------------------------------------------------------------------- # Demo library and programs #------------------------------------------------------------------------------- -if ( SUITESPARSE_DEMOS ) +option ( DEMO "ON: Build the demo programs. OFF (default): do not build the demo programs." off ) +if ( DEMO ) #--------------------------------------------------------------------------- # demo library @@ -258,13 +148,8 @@ if ( SUITESPARSE_DEMOS ) add_executable ( colamd_l_example "Demo/colamd_l_example.c" ) # Libraries required for Demo programs - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( colamd_example PUBLIC COLAMD ) - target_link_libraries ( colamd_l_example PUBLIC COLAMD ) - else ( ) - target_link_libraries ( colamd_example PUBLIC COLAMD_static ) - target_link_libraries ( colamd_l_example PUBLIC COLAMD_static ) - endif ( ) + target_link_libraries ( colamd_example PUBLIC colamd ) + target_link_libraries ( colamd_l_example PUBLIC colamd ) else ( ) @@ -277,3 +162,4 @@ endif ( ) #------------------------------------------------------------------------------- include ( SuiteSparseReport ) + diff --git a/COLAMD/Config/COLAMD.pc.in b/COLAMD/Config/COLAMD.pc.in deleted file mode 100644 index 5444c608..00000000 --- a/COLAMD/Config/COLAMD.pc.in +++ /dev/null @@ -1,17 +0,0 @@ -# COLAMD, Copyright (c) 1998-2023, Timothy A. Davis. -# All Rights Reserved. -# SPDX-License-Identifier: BSD-3-Clause - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: COLAMD -URL: https://github.com/DrTimothyAldenDavis/SuiteSparse -Description: Routines for column approximate minimum degree ordering algorithm in SuiteSparse -Version: @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@.@COLAMD_VERSION_SUB@ -Requires.private: SuiteSparse_config -Libs: -L${libdir} -l@SUITESPARSE_LIB_BASE_NAME@ -Libs.private: @COLAMD_STATIC_LIBS@ -Cflags: -I${includedir} diff --git a/COLAMD/Config/COLAMDConfig.cmake.in b/COLAMD/Config/COLAMDConfig.cmake.in deleted file mode 100644 index 7bb4701f..00000000 --- a/COLAMD/Config/COLAMDConfig.cmake.in +++ /dev/null @@ -1,152 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/COLAMD/cmake_modules/COLAMDConfig.cmake -#------------------------------------------------------------------------------- - -# The following copyright and license applies to just this file only, not to -# the library itself: -# COLAMDConfig.cmake, Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# Finds the COLAMD include file and compiled library. -# The following targets are defined: -# SuiteSparse::COLAMD - for the shared library (if available) -# SuiteSparse::COLAMD_static - for the static library (if available) - -# For backward compatibility the following variables are set: - -# COLAMD_INCLUDE_DIR - where to find colamd.h -# COLAMD_LIBRARY - dynamic COLAMD library -# COLAMD_STATIC - static COLAMD library -# COLAMD_LIBRARIES - libraries when using COLAMD -# COLAMD_FOUND - true if COLAMD found - -# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is -# installed. - -#------------------------------------------------------------------------------- - -@PACKAGE_INIT@ - -set ( COLAMD_DATE "@COLAMD_DATE@" ) -set ( COLAMD_VERSION_MAJOR @COLAMD_VERSION_MAJOR@ ) -set ( COLAMD_VERSION_MINOR @COLAMD_VERSION_MINOR@ ) -set ( COLAMD_VERSION_PATCH @COLAMD_VERSION_SUB@ ) -set ( COLAMD_VERSION "@COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@.@COLAMD_VERSION_SUB@" ) - -# Check for dependent targets -include ( CMakeFindDependencyMacro ) - -# Look for SuiteSparse_config target -if ( @SUITESPARSE_IN_BUILD_TREE@ ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - # First check in a common build tree - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ - PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) - # Then, check in the currently active CMAKE_MODULE_PATH - if ( NOT SuiteSparse_config_FOUND ) - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) - endif ( ) - endif ( ) -else ( ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) - endif ( ) -endif ( ) -if ( NOT SuiteSparse_config_FOUND ) - set ( COLAMD_FOUND OFF ) - return ( ) -endif ( ) - - -# Import target -include ( ${CMAKE_CURRENT_LIST_DIR}/COLAMDTargets.cmake ) - -# The following is only for backward compatibility with FindCOLAMD. - -set ( _target_shared SuiteSparse::COLAMD ) -set ( _target_static SuiteSparse::COLAMD_static ) -set ( _var_prefix "COLAMD" ) - -if ( NOT @BUILD_SHARED_LIBS@ AND NOT TARGET ${_target_shared} ) - # make sure there is always an import target without suffix ) - add_library ( ${_target_shared} ALIAS ${_target_static} ) -endif ( ) - -get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) -if ( ${_var_prefix}_INCLUDE_DIR ) - # First item in SuiteSparse targets contains the "main" header directory. - list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) -endif ( ) -get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) -if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) -endif ( ) -if ( TARGET ${_target_static} ) - get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) -endif ( ) - -# Check for most common build types -set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) - -get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) -if ( _isMultiConfig ) - # For multi-configuration generators (e.g., Visual Studio), prefer those - # configurations. - list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) -else ( ) - # For single-configuration generators, prefer the current configuration. - list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) -endif ( ) - -list ( REMOVE_DUPLICATES _config_types ) - -foreach ( _config ${_config_types} ) - string ( TOUPPER ${_config} _uc_config ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_IMPLIB_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) - get_target_property ( _library_chk ${_target_static} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_STATIC ${_library_chk} ) - endif ( ) - endif ( ) -endforeach ( ) - -set ( COLAMD_LIBRARIES ${COLAMD_LIBRARY} ) - -macro ( suitesparse_check_exist _var _files ) - # ignore generator expressions - string ( GENEX_STRIP "${_files}" _files2 ) - - foreach ( _file ${_files2} ) - if ( NOT EXISTS "${_file}" ) - message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) - endif ( ) - endforeach () -endmacro ( ) - -suitesparse_check_exist ( COLAMD_INCLUDE_DIR ${COLAMD_INCLUDE_DIR} ) -suitesparse_check_exist ( COLAMD_LIBRARY ${COLAMD_LIBRARY} ) - -message ( STATUS "COLAMD version: ${COLAMD_VERSION}" ) -message ( STATUS "COLAMD include: ${COLAMD_INCLUDE_DIR}" ) -message ( STATUS "COLAMD library: ${COLAMD_LIBRARY}" ) -message ( STATUS "COLAMD static: ${COLAMD_STATIC}" ) diff --git a/COLAMD/Config/colamd.h.in b/COLAMD/Config/colamd.h.in index 915f81c5..fb0450ac 100644 --- a/COLAMD/Config/colamd.h.in +++ b/COLAMD/Config/colamd.h.in @@ -1,8 +1,8 @@ //------------------------------------------------------------------------------ -// COLAMD/Include/colamd.h: include file for COLAMD +// COLAMD/Source/colamd.h: include file for COLAMD //------------------------------------------------------------------------------ -// COLAMD, Copyright (c) 1998-2024, Timothy A. Davis and Stefan Larimore, +// COLAMD, Copyright (c) 1998-2022, Timothy A. Davis and Stefan Larimore, // All Rights Reserved. // SPDX-License-Identifier: BSD-3-clause @@ -37,6 +37,11 @@ #ifndef COLAMD_H #define COLAMD_H +/* make it easy for C++ programs to include COLAMD */ +#ifdef __cplusplus +extern "C" { +#endif + /* ========================================================================== */ /* === Include files ======================================================== */ /* ========================================================================== */ @@ -70,14 +75,9 @@ #define COLAMD_SUB_VERSION @COLAMD_VERSION_MINOR@ #define COLAMD_SUBSUB_VERSION @COLAMD_VERSION_SUB@ -#define COLAMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) -#define COLAMD_VERSION COLAMD_VERSION_CODE(@COLAMD_VERSION_MAJOR@,@COLAMD_VERSION_MINOR@) - -#define COLAMD__VERSION SUITESPARSE__VERCODE(@COLAMD_VERSION_MAJOR@,@COLAMD_VERSION_MINOR@,@COLAMD_VERSION_SUB@) -#if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) -#error "COLAMD @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@.@COLAMD_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" -#endif +#define COLAMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) +#define COLAMD_VERSION \ + COLAMD_VERSION_CODE(COLAMD_MAIN_VERSION,COLAMD_SUB_VERSION) /* ========================================================================== */ /* === Knob and statistics definitions ====================================== */ @@ -129,11 +129,6 @@ /* === Prototypes of user-callable routines ================================= */ /* ========================================================================== */ -/* make it easy for C++ programs to include COLAMD */ -#ifdef __cplusplus -extern "C" { -#endif - size_t colamd_recommended /* returns recommended value of Alen, */ /* or 0 if input arguments are erroneous */ ( @@ -234,8 +229,6 @@ void symamd_l_report int64_t stats [COLAMD_STATS] ) ; -void colamd_version (int version [3]) ; - #ifdef __cplusplus } #endif diff --git a/COLAMD/Demo/colamd_example.c b/COLAMD/Demo/colamd_example.c index b64ca33e..e478f7d2 100644 --- a/COLAMD/Demo/colamd_example.c +++ b/COLAMD/Demo/colamd_example.c @@ -98,21 +98,6 @@ int main (void) int row, col, pp, length, ok ; - //-------------------------------------------------------------------------- - // colamd version - //-------------------------------------------------------------------------- - - int version [3] ; - colamd_version (version) ; - printf ("COLAMD v%d.%d.%d\n", version [0], version [1], version [2]) ; - if ((version [0] != COLAMD_MAIN_VERSION) || - (version [1] != COLAMD_SUB_VERSION) || - (version [2] != COLAMD_SUBSUB_VERSION)) - { - fprintf (stderr, "version in header does not match library\n") ; - abort ( ) ; - } - /* ====================================================================== */ /* dump the input matrix A */ /* ====================================================================== */ diff --git a/COLAMD/Demo/colamd_example.out b/COLAMD/Demo/colamd_example.out index 1b6c81fc..56be3fb0 100644 --- a/COLAMD/Demo/colamd_example.out +++ b/COLAMD/Demo/colamd_example.out @@ -1,4 +1,3 @@ -COLAMD v3.3.3 colamd 5-by-4 input matrix: Column 0, with 3 entries: row 0 @@ -16,7 +15,7 @@ Column 3, with 2 entries: row 1 row 3 -colamd version 3.3.3, Mar 22, 2024: OK. +colamd version 3.0.3, Jan 17, 2023: 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 @@ -39,7 +38,7 @@ Column 3, with 1 entries: row 4 Column 4, with 0 entries: -symamd version 3.3.3, Mar 22, 2024: OK. +symamd version 3.0.3, Jan 17, 2023: 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 diff --git a/COLAMD/Demo/colamd_l_example.c b/COLAMD/Demo/colamd_l_example.c index 3bf4c18c..b48a55bf 100644 --- a/COLAMD/Demo/colamd_l_example.c +++ b/COLAMD/Demo/colamd_l_example.c @@ -99,21 +99,6 @@ int main (void) int64_t row, col, pp, length ; int ok ; - //-------------------------------------------------------------------------- - // colamd version - //-------------------------------------------------------------------------- - - int version [3] ; - colamd_version (version) ; - printf ("COLAMD v%d.%d.%d\n", version [0], version [1], version [2]) ; - if ((version [0] != COLAMD_MAIN_VERSION) || - (version [1] != COLAMD_SUB_VERSION) || - (version [2] != COLAMD_SUBSUB_VERSION)) - { - fprintf (stderr, "version in header does not match library\n") ; - abort ( ) ; - } - /* ====================================================================== */ /* dump the input matrix A */ /* ====================================================================== */ diff --git a/COLAMD/Demo/colamd_l_example.out b/COLAMD/Demo/colamd_l_example.out index 104688ee..c75474b9 100644 --- a/COLAMD/Demo/colamd_l_example.out +++ b/COLAMD/Demo/colamd_l_example.out @@ -1,4 +1,3 @@ -COLAMD v3.3.3 colamd 5-by-4 input matrix: Column 0, with 3 entries: row 0 @@ -16,7 +15,7 @@ Column 3, with 2 entries: row 1 row 3 -colamd version 3.3.3, Mar 22, 2024: OK. +colamd version 3.0.3, Jan 17, 2023: 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 @@ -39,7 +38,7 @@ Column 3, with 1 entries: row 4 Column 4, with 0 entries: -symamd version 3.3.3, Mar 22, 2024: OK. +symamd version 3.0.3, Jan 17, 2023: 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 diff --git a/COLAMD/Doc/ChangeLog b/COLAMD/Doc/ChangeLog index b9e700d9..f7a3dcf3 100644 --- a/COLAMD/Doc/ChangeLog +++ b/COLAMD/Doc/ChangeLog @@ -1,32 +1,3 @@ -Mar 22, 2024: version 3.3.3 - - * minor updates to build system - -Jan 20, 2024: version 3.3.2 - - * minor updates to build system - -Jan 10, 2024: version 3.3.1 - - * minor updates to build system - -Dec 30, 2023: version 3.3.0 - - * major change to build system: by Markus Mützel - * colamd_version: added to return version of COLAMD - -Sept 18, 2023: version 3.2.1 - - * cmake update: add "None" build type, from Antonio Rojas, for Arch Linux - -Sept 8, 2023: version 3.2.0 - - * cmake updates: SuiteSparse:: namespace by Markus Muetzel - -June 16, 2023: version 3.0.4 - - * cmake build system updates: update by Markus Muetzel - Jan 17, 2023: version 3.0.3 * SuiteSparse_config: now v7.0.0 diff --git a/COLAMD/Include/colamd.h b/COLAMD/Include/colamd.h index 7b2e77f1..f258ef68 100644 --- a/COLAMD/Include/colamd.h +++ b/COLAMD/Include/colamd.h @@ -1,8 +1,8 @@ //------------------------------------------------------------------------------ -// COLAMD/Include/colamd.h: include file for COLAMD +// COLAMD/Source/colamd.h: include file for COLAMD //------------------------------------------------------------------------------ -// COLAMD, Copyright (c) 1998-2024, Timothy A. Davis and Stefan Larimore, +// COLAMD, Copyright (c) 1998-2022, Timothy A. Davis and Stefan Larimore, // All Rights Reserved. // SPDX-License-Identifier: BSD-3-clause @@ -37,6 +37,11 @@ #ifndef COLAMD_H #define COLAMD_H +/* make it easy for C++ programs to include COLAMD */ +#ifdef __cplusplus +extern "C" { +#endif + /* ========================================================================== */ /* === Include files ======================================================== */ /* ========================================================================== */ @@ -65,19 +70,14 @@ * Versions 2.3 and earlier of COLAMD do not include a #define'd version number. */ -#define COLAMD_DATE "Mar 22, 2024" +#define COLAMD_DATE "Jan 17, 2023" #define COLAMD_MAIN_VERSION 3 -#define COLAMD_SUB_VERSION 3 +#define COLAMD_SUB_VERSION 0 #define COLAMD_SUBSUB_VERSION 3 -#define COLAMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) -#define COLAMD_VERSION COLAMD_VERSION_CODE(3,3) - -#define COLAMD__VERSION SUITESPARSE__VERCODE(3,3,3) -#if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) -#error "COLAMD 3.3.3 requires SuiteSparse_config 7.7.0 or later" -#endif +#define COLAMD_VERSION_CODE(main,sub) ((main) * 1000 + (sub)) +#define COLAMD_VERSION \ + COLAMD_VERSION_CODE(COLAMD_MAIN_VERSION,COLAMD_SUB_VERSION) /* ========================================================================== */ /* === Knob and statistics definitions ====================================== */ @@ -129,11 +129,6 @@ /* === Prototypes of user-callable routines ================================= */ /* ========================================================================== */ -/* make it easy for C++ programs to include COLAMD */ -#ifdef __cplusplus -extern "C" { -#endif - size_t colamd_recommended /* returns recommended value of Alen, */ /* or 0 if input arguments are erroneous */ ( @@ -234,8 +229,6 @@ void symamd_l_report int64_t stats [COLAMD_STATS] ) ; -void colamd_version (int version [3]) ; - #ifdef __cplusplus } #endif diff --git a/COLAMD/Makefile b/COLAMD/Makefile index 787ee26f..2c7de9ee 100644 --- a/COLAMD/Makefile +++ b/COLAMD/Makefile @@ -36,27 +36,27 @@ default: library # default is to install only in /usr/local library: - ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . -j${JOBS} ) # install only in SuiteSparse/lib and SuiteSparse/include local: - ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=1 .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=1 .. && cmake --build . -j${JOBS} ) # install only in /usr/local (default) global: - ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=0 .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=0 .. && cmake --build . -j${JOBS} ) debug: - ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . --config Debug -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . -j${JOBS} ) all: library demos: library - ( cd build && cmake $(CMAKE_OPTIONS) -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j${JOBS} ) - - ./build/colamd_example > ./build/colamd_example.out && ( command -v d2u && d2u ./build/colamd_example.out || true ) - - diff ./Demo/colamd_example.out ./build/colamd_example.out - - ./build/colamd_l_example > ./build/colamd_l_example.out && ( command -v d2u && d2u ./build/colamd_l_example.out || true ) - - diff ./Demo/colamd_l_example.out ./build/colamd_l_example.out + ( cd build && cmake $(CMAKE_OPTIONS) -DDEMO=1 .. && cmake --build . -j${JOBS} ) + - ./build/colamd_example > ./build/colamd_example.out + - diff --strip-trailing-cr ./Demo/colamd_example.out ./build/colamd_example.out + - ./build/colamd_l_example > ./build/colamd_l_example.out + - diff --strip-trailing-cr ./Demo/colamd_l_example.out ./build/colamd_l_example.out # just compile after running cmake; do not run cmake again remake: @@ -64,7 +64,7 @@ remake: # just run cmake to set things up setup: - ( cd build && cmake $(CMAKE_OPTIONS) .. ) + ( cd build ; cmake $(CMAKE_OPTIONS) .. ) install: ( cd build && cmake --install . ) diff --git a/COLAMD/Source/colamd.c b/COLAMD/Source/colamd.c index 968d90fc..af5b27f7 100644 --- a/COLAMD/Source/colamd.c +++ b/COLAMD/Source/colamd.c @@ -1046,6 +1046,7 @@ size_t COLAMD_recommended /* returns recommended value of Alen. */ return (ok ? s : 0) ; } + /* ========================================================================== */ /* === colamd_set_defaults ================================================== */ /* ========================================================================== */ diff --git a/COLAMD/Source/colamd_version.c b/COLAMD/Source/colamd_version.c deleted file mode 100644 index 9184817e..00000000 --- a/COLAMD/Source/colamd_version.c +++ /dev/null @@ -1,19 +0,0 @@ -//------------------------------------------------------------------------------ -// COLAMD/Source/colamd_version.c: return COLAMD version -//------------------------------------------------------------------------------ - -// COLAMD, Copyright (c) 1998-2022, Timothy A. Davis and Stefan Larimore, -// All Rights Reserved. -// SPDX-License-Identifier: BSD-3-clause - -//------------------------------------------------------------------------------ - -#include "colamd.h" - -void colamd_version (int version [3]) -{ - version [0] = COLAMD_MAIN_VERSION ; - version [1] = COLAMD_SUB_VERSION ; - version [2] = COLAMD_SUBSUB_VERSION ; -} - diff --git a/COLAMD/cmake_modules/FindCOLAMD.cmake b/COLAMD/cmake_modules/FindCOLAMD.cmake new file mode 100644 index 00000000..00e8a9ac --- /dev/null +++ b/COLAMD/cmake_modules/FindCOLAMD.cmake @@ -0,0 +1,129 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/COLAMD/cmake_modules/FindCOLAMD.cmake +#------------------------------------------------------------------------------- + +# The following copyright and license applies to just this file only, not to +# the library itself: +# FindCOLAMD.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +#------------------------------------------------------------------------------- + +# Finds the COLAMD include file and compiled library and sets: + +# COLAMD_INCLUDE_DIR - where to find colamd.h +# COLAMD_LIBRARY - dynamic COLAMD library +# COLAMD_STATIC - static COLAMD library +# COLAMD_LIBRARIES - libraries when using COLAMD +# COLAMD_FOUND - true if COLAMD found + +# set ``COLAMD_ROOT`` to a COLAMD installation root to +# tell this module where to look. + +# All the Find*.cmake files in SuiteSparse are installed by 'make install' into +# /usr/local/lib/cmake/SuiteSparse (where '/usr/local' is the +# ${CMAKE_INSTALL_PREFIX}). To access this file, place the following commands +# in your CMakeLists.txt file. See also SuiteSparse/Example/CMakeLists.txt: +# +# set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} +# ${CMAKE_INSTALL_PREFIX}/lib/cmake/SuiteSparse ) + +#------------------------------------------------------------------------------- + +# include files for COLAMD +find_path ( COLAMD_INCLUDE_DIR + NAMES colamd.h + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/COLAMD + HINTS ${CMAKE_SOURCE_DIR}/../COLAMD + PATH_SUFFIXES include Include +) + +# dynamic COLAMD library (or static if no dynamic library was built) +find_library ( COLAMD_LIBRARY + NAMES colamd colamd_static + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/COLAMD + HINTS ${CMAKE_SOURCE_DIR}/../COLAMD + PATH_SUFFIXES lib build build/Release build/Debug +) + +if ( MSVC ) + set ( STATIC_NAME colamd_static ) +else ( ) + set ( STATIC_NAME colamd ) + set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) + set ( CMAKE_FIND_LIBRARY_SUFFIXES + ${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) +endif ( ) + +# static COLAMD library +find_library ( COLAMD_STATIC + NAMES ${STATIC_NAME} + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/COLAMD + HINTS ${CMAKE_SOURCE_DIR}/../COLAMD + PATH_SUFFIXES lib build build/Release build/Debug +) + +if ( NOT MSVC ) + # restore the CMAKE_FIND_LIBRARY_SUFFIXES variable + set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) +endif ( ) + +# get version of the library from the dynamic library name +get_filename_component ( COLAMD_LIBRARY ${COLAMD_LIBRARY} REALPATH ) +get_filename_component ( COLAMD_FILENAME ${COLAMD_LIBRARY} NAME ) +string ( + REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" + COLAMD_VERSION + ${COLAMD_FILENAME} +) + +# set ( COLAMD_VERSION "" ) +if ( EXISTS "${COLAMD_INCLUDE_DIR}" AND NOT COLAMD_VERSION ) + # if the version does not appear in the filename, read the include file + file ( STRINGS ${COLAMD_INCLUDE_DIR}/colamd.h COLAMD_MAJOR_STR + REGEX "define COLAMD_MAIN_VERSION" ) + file ( STRINGS ${COLAMD_INCLUDE_DIR}/colamd.h COLAMD_MINOR_STR + REGEX "define COLAMD_SUB_VERSION" ) + file ( STRINGS ${COLAMD_INCLUDE_DIR}/colamd.h COLAMD_PATCH_STR + REGEX "define COLAMD_SUBSUB_VERSION" ) + message ( STATUS "major: ${COLAMD_MAJOR_STR}" ) + message ( STATUS "minor: ${COLAMD_MINOR_STR}" ) + message ( STATUS "patch: ${COLAMD_PATCH_STR}" ) + string ( REGEX MATCH "[0-9]+" COLAMD_MAJOR ${COLAMD_MAJOR_STR} ) + string ( REGEX MATCH "[0-9]+" COLAMD_MINOR ${COLAMD_MINOR_STR} ) + string ( REGEX MATCH "[0-9]+" COLAMD_PATCH ${COLAMD_PATCH_STR} ) + set (COLAMD_VERSION "${COLAMD_MAJOR}.${COLAMD_MINOR}.${COLAMD_PATCH}") +endif ( ) + +set (COLAMD_LIBRARIES ${COLAMD_LIBRARY}) + +include (FindPackageHandleStandardArgs) + +find_package_handle_standard_args ( COLAMD + REQUIRED_VARS COLAMD_LIBRARY COLAMD_INCLUDE_DIR + VERSION_VAR COLAMD_VERSION +) + +mark_as_advanced ( + COLAMD_INCLUDE_DIR + COLAMD_LIBRARY + COLAMD_STATIC + COLAMD_LIBRARIES +) + +if ( COLAMD_FOUND ) + message ( STATUS "COLAMD version: ${COLAMD_VERSION}" ) + message ( STATUS "COLAMD include: ${COLAMD_INCLUDE_DIR}" ) + message ( STATUS "COLAMD library: ${COLAMD_LIBRARY}" ) + message ( STATUS "COLAMD static: ${COLAMD_STATIC}" ) +else ( ) + message ( STATUS "COLAMD not found" ) + set ( COLAMD_INCLUDE_DIR "" ) + set ( COLAMD_LIBRARIES "" ) + set ( COLAMD_LIBRARY "" ) + set ( COLAMD_STATIC "" ) +endif ( ) + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index a81e104c..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing to SuiteSparse - -To add an issue for a bug report (gasp!) or a feature request, -you can use the issue tracker on github.com, at -[`https://github.com/DrTimothyAldenDavis/SuiteSparse/issues`] -(https://github.com/DrTimothyAldenDavis/SuiteSparse/issues). - -To contribute code, you can submit a pull request. To do so, -you must first agree to the Contributor License Agreement -[`CONTRIBUTOR-LICENSE.txt`](CONTRIBUTOR-LICENSE.txt). -Print a copy of the txt file (as a PDF), sign and date it, -and email it to me at DrTimothyAldenDavis@gmail.com. Pull -requests will only be included into SuiteSparse after I receive -your email with the signed PDF. - -Do not submit a pull request to the default branch. -Instead, use the dev or dev2 branches. - diff --git a/CONTRIBUTOR-LICENSE.txt b/CONTRIBUTOR-LICENSE.txt deleted file mode 100644 index 7cd19eec..00000000 --- a/CONTRIBUTOR-LICENSE.txt +++ /dev/null @@ -1,177 +0,0 @@ -SuiteSparse Individual Contributor License Agreement - -Thank you for your interest in contributing to SuiteSparse ("We" or "Us"). - -This contributor agreement ("Agreement") documents the rights granted by -contributors to Us. To make this document effective, please sign it and send it -to Us by electronic submission. This is a legally binding document, so please -read it carefully before agreeing to it. The Agreement may cover more than one -software project managed by Us. - -1. Definitions - - "You" means the individual who Submits a Contribution to Us. - - "Contribution" means any work of authorship that is Submitted by You to Us - in which You own or assert ownership of the Copyright. - - "Copyright" means all rights protecting works of authorship owned or - controlled by You, including copyright, moral and neighboring rights, as - appropriate, for the full term of their existence including any extensions - by You. - - "Material" means the work of authorship which is made available by Us to - third parties. When this Agreement covers more than one software project, - the Material means the work of authorship to which the Contribution was - Submitted. After You Submit the Contribution, it may be included in the - Material. - - "Submit" means any form of electronic, verbal, or written communication - sent to Us or our representatives, including but not limited to electronic - mailing lists, source code control systems, and issue tracking systems that - are managed by, or on behalf of, Us for the purpose of discussing and - improving the Material, but excluding communication that is conspicuously - marked or otherwise designated in writing by You as "Not a Contribution." - - "Submission Date" means the date on which You Submit a Contribution to Us. - - "Effective Date" means the date You execute this Agreement or the date You - first Submit a Contribution to Us, whichever is earlier. - -2. Grant of Rights - - 2.1 Copyright License - - (a) You retain ownership of the Copyright in Your Contribution and have - the same rights to use or license the Contribution which You would have - had without entering into the Agreement. - - (b) To the maximum extent permitted by the relevant law, You grant to - Us a perpetual, worldwide, non-exclusive, transferable, royalty-free, - irrevocable license under the Copyright covering the Contribution, with - the right to sublicense such rights through multiple tiers of - sublicensees, to reproduce, modify, display, perform and distribute the - Contribution as part of the Material; provided that this license is - conditioned upon compliance with Section 2.3. - - 2.2 Patent License - - For patent claims including, without limitation, method, process, and - apparatus claims which You own, control or have the right to grant, now - or in the future, You grant to Us a perpetual, worldwide, - non-exclusive, transferable, royalty-free, irrevocable patent license, - with the right to sublicense these rights to multiple tiers of - sublicensees, to make, have made, use, sell, offer for sale, import and - otherwise transfer the Contribution and the Contribution in combination - with the Material (and portions of such combination). This license is - granted only to the extent that the exercise of the licensed rights - infringes such patent claims; and provided that this license is - conditioned upon compliance with Section 2.3. - - 2.3 Outbound License - - Based on the grant of rights in Sections 2.1 and 2.2, if We include - Your Contribution in a Material, We may license the Contribution under - any license, including copyleft, permissive, commercial, or proprietary - licenses. - - 2.4 Moral Rights. - - If moral rights apply to the Contribution, to the maximum extent - permitted by law, You waive and agree not to assert such moral rights - against Us or our successors in interest, or any of our licensees, - either direct or indirect. - - 2.5 Our Rights. - - You acknowledge that We are not obligated to use Your Contribution as - part of the Material and may decide to include any Contribution We - consider appropriate. - - 2.6 Reservation of Rights. - - Any rights not expressly licensed under this section are expressly - reserved by You. - -3. Agreement - - You confirm that: - - (a) You have the legal authority to enter into this Agreement. - - (b) You own the Copyright and patent claims covering the Contribution which - are required to grant the rights under Section 2. - - (c) The grant of rights under Section 2 does not violate any grant of - rights which You have made to third parties, including Your employer. If - You are an employee, You have had Your employer approve this Agreement or - sign the Entity version of this document. If You are less than eighteen - years old, please have Your parents or guardian sign the Agreement. - -4. Disclaimer - - EXCEPT FOR THE EXPRESS WARRANTIES IN SECTION 3, THE CONTRIBUTION IS - PROVIDED "AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES - INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY - DISCLAIMED BY YOU TO US. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE - DISCLAIMED, SUCH WARRANTY IS LIMITED IN DURATION TO THE MINIMUM PERIOD - PERMITTED BY LAW. - -5. Consequential Damage Waiver - - TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU BE - LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA, - INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING - OUT OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY - (CONTRACT, TORT OR OTHERWISE) UPON WHICH THE CLAIM IS BASED. - -6. Miscellaneous - - 6.1 This Agreement will be governed by and construed in accordance with the - laws of the State of Texas excluding its conflicts of law provisions. Under - certain circumstances, the governing law in this section might be - superseded by the United Nations Convention on Contracts for the - International Sale of Goods ("UN Convention") and the parties intend to - avoid the application of the UN Convention to this Agreement and, thus, - exclude the application of the UN Convention in its entirety to this - Agreement. - - 6.2 This Agreement sets out the entire agreement between You and Us for - Your Contributions to Us and overrides all other agreements or - understandings. - - 6.3 If You or We assign the rights or obligations received through this - Agreement to a third party, as a condition of the assignment, that third - party must agree in writing to abide by all the rights and obligations in - the Agreement. - - 6.4 The failure of either party to require performance by the other party - of any provision of this Agreement in one situation shall not affect the - right of a party to require such performance at any time in the future. A - waiver of performance under a provision in one situation shall not be - considered a waiver of the performance of the provision in the future or a - waiver of the provision in its entirety. - - 6.5 If any provision of this Agreement is found void and unenforceable, - such provision will be replaced to the extent possible with a provision - that comes closest to the meaning of the original provision and which is - enforceable. The terms and conditions set forth in this Agreement shall - apply notwithstanding any failure of essential purpose of this Agreement or - any limited remedy to the maximum extent possible under law. - -Us -Timothy A. Davis, and all SuiteSparse co-authors (varies according to -the SuiteSparse package) - - -You: - - Your Name (printed): - - - Your Signature: - - - Date: - diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 2516bc71..00000000 --- a/LICENSE.txt +++ /dev/null @@ -1,113 +0,0 @@ -This file lists all licenses for all packages in SPEX, for your -convenience. Each package has its own separate license, which can be -found in the lists below. - -==> SPEX/LICENSE <== - - SPEX: a SParse EXact Factorization Framework for solving SLEs - - Copyright (c) 2019-2024, Christopher Lourenco, Jinhao Chen, - Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. - - Available at: - https://github.com/clouren/SPEX - http://suitesparse.com - - Contact Chris Lourenco, chrisjlourenco@gmail.com, or Tim Davis - (timdavis@aldenmath.com or DrTimothyAldenDavis@gmail.com) for a commercial - license. - - -------------------------------------------------------------------------------- - - SPEX is free software; you can redistribute it and/or modify - it under the terms of either: - - * the GNU Lesser General Public License as published by the Free - Software Foundation; either version 3 of the License, or (at your - option) any later version. - - or - - * 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. - - or both in parallel, as here. - - SPEX 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 copies of the GNU General Public License and the - GNU Lesser General Public License along with this software. If not, - see https://www.gnu.org/licenses/. - -==> AMD/Doc/License.txt <== - - AMD, Copyright (c), 1996-2015, Timothy A. Davis, - Patrick R. Amestoy, and Iain S. Duff. All Rights Reserved. - - Availability: - - http://www.suitesparse.com - - ------------------------------------------------------------------------------- - AMD License: BSD 3-clause: - ------------------------------------------------------------------------------- - - 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. - -==> COLAMD/Doc/License.txt <== - - COLAMD, Copyright 1998-2016, Timothy A. Davis. http://www.suitesparse.com - http://www.suitesparse.com - - COLAMD License: BSD 3-clause - - 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. - diff --git a/Makefile b/Makefile index af5b2aec..d733c223 100644 --- a/Makefile +++ b/Makefile @@ -2,10 +2,6 @@ # Makefile for SPEX and its dependent packages (AMD, COLAMD, SuiteSparse_config) #------------------------------------------------------------------------------- -# Just this particular file is under the Apache-2.0 license; each package has -# its own license. -# SPDX-License-Identifier: Apache-2.0 - # edit this variable to pass options to cmake: export CMAKE_OPTIONS ?= @@ -19,7 +15,8 @@ export SUITESPARSE = $(CURDIR) # Compile the default rules for each package. -# default: compile and install in SPEX/lib and SPEX/include +# default: "make install" will install all libraries in /usr/local/lib +# and include files in /usr/local/include. Not installed in SuiteSparse/lib. default: local install # compile; "sudo make install" will install only in /usr/local @@ -30,7 +27,7 @@ library: ( cd COLAMD && $(MAKE) ) ( cd SPEX && $(MAKE) ) -# compile; "make install" only in SPEX/lib and SPEX/include +# compile; "make install" only in SuiteSparse/lib and SuiteSparse/include local: ( cd SuiteSparse_config && $(MAKE) local ) ( cd AMD && $(MAKE) local ) @@ -67,8 +64,8 @@ purge: - ( cd SuiteSparse_config && $(MAKE) purge ) - ( cd AMD && $(MAKE) purge ) - ( cd COLAMD && $(MAKE) purge ) - - ( cd SPEX && $(MAKE) purge ) - $(RM) -r include/* bin/* lib/* + - ( cd SPEX && $(MAKE) purge ) clean: purge @@ -88,9 +85,3 @@ docs: cov: local install ( cd SPEX && $(MAKE) cov ) -debug: - ( cd SuiteSparse_config && $(MAKE) debug ) - ( cd AMD && $(MAKE) debug ) - ( cd COLAMD && $(MAKE) debug ) - ( cd SPEX && $(MAKE) debug ) - diff --git a/README.md b/README.md index 225ef135..ad1d4e85 100644 --- a/README.md +++ b/README.md @@ -83,162 +83,42 @@ is provided. All it does is use cmake to build each of the packages. keeps compiled libraries and demoes, ./lib and ./include. -You can also use cmake or ccmake directly. For example, try: - - cd AMD/build - ccmake .. - make - ------------------------------------------------------------------------------ -How to cite the SPEX meta-package and its component packages: ------------------------------------------------------------------------------ - -* for AMD: - - P. Amestoy, T. A. Davis, and I. S. Duff, Algorithm 837: An approximate - minimum degree ordering algorithm, ACM Trans. on Mathematical Software, - 30(3), 2004, pp. 381--388. - https://dl.acm.org/doi/abs/10.1145/1024074.1024081 - - P. Amestoy, T. A. Davis, and I. S. Duff, An approximate minimum degree - ordering algorithm, SIAM J. Matrix Analysis and Applications, 17(4), 1996, - pp. 886--905. https://doi.org/10.1137/S0895479894278952 - -* for COLAMD: - - T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD, an - approximate column minimum degree ordering algorithm, ACM Trans. on - Mathematical Software, 30(3), 2004, pp. 377--380. - https://doi.org/10.1145/1024074.1024080 - - T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, A column approximate minimum - degree ordering algorithm, ACM Trans. on Mathematical Software, 30(3), 2004, - pp. 353--376. https://doi.org/10.1145/1024074.1024079 - -* for SPEX: - - Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and T. A. Davis. - 2022. Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via - a Sparse Left-Looking Integer-Preserving LU Factorization. ACM Trans. Math. - Softw. June 2022. https://doi.org/10.1145/3519024 - ------------------------------------------------------------------------------ -Compilation options ------------------------------------------------------------------------------ - You can set specific options for CMake with the command (for example): -``` - cmake -DBUILD_STATIC_LIBS=OFF -DCMAKE_BUILD_TYPE=Debug .. -``` - -That command will compile SPEX, AMD, COLAMD, and `SuiteSparse_config`. -Debug mode will be used (the build type). The static libraries will not be -built (since `-DBUILD_STATIC_LIBS=OFF` is set). - -* `SUITESPARSE_ENABLE_PROJECTS`: - - Semicolon separated list of projects to be built or `all`. - Default: `all` in which case the following projects are built: - - `suitesparse_config;amd;colamd;spex` -* `CMAKE_BUILD_TYPE`: + CMAKE_OPTIONS="-DNSTATIC=1 -DCMAKE_BUILD_TYPE=Debug" make - Default: `Release`, use `Debug` for debugging. +That command will compile all of SPEX and it dependencies. +Debug mode will be used. The static libraries will not be built +(NSTATIC is true). -* `SUITESPARSE_USE_STRICT`: + CMAKE_BUILD_TYPE: Default: "Release", use "Debug" for debugging. - SuiteSparse has many user-definable settings of the form `SUITESPARSE_USE_*` - or `(package)_USE_*` for some particular package. In general, these settings - are not strict. For example, if `SUITESPARSE_USE_OPENMP` is `ON` then OpenMP - is preferred, but SuiteSparse can be used without OpenMP so no error is - generated if OpenMP is not found. However, if `SUITESPARSE_USE_STRICT` is - `ON` then all `*_USE_*` settings are treated strictly and an error occurs - if any are set to `ON` but the corresponding package or setting is not - available. The `*_USE_SYSTEM_*` settings are always treated as strict. - Default: `OFF`. + GLOBAL_INSTALL: if true, "make install" will install + into /usr/local/lib and /usr/local/include. + Default: true -* `CMAKE_INSTALL_PREFIX`: + LOCAL_INSTALL: if true, "make install" will install + into SuiteSparse/lib and SuiteSparse/include. + Default: false - Defines the install location (default on Linux is `/usr/local`). For example, - this command while in a folder `build` in the top level SuiteSparse folder - will set the install directory to `/stuff`, used by the subsequent - `sudo cmake --install .`: -``` - cmake -DCMAKE_INSTALL_PREFIX=/stuff .. - sudo cmake --install . -``` + NSTATIC: if true, static libraries are not built. + Default: false, except for GraphBLAS, which + takes a long time to compile so the default for + GraphBLAS is true. For Mongoose, the NSTATIC setting + is treated as if it always false, since the mongoose + program is built with the static library. -* `SUITESPARSE_PKGFILEDIR`: + NOPENMP if true: OpenMP is not used. Default: false. + Only used by SuiteSparse_config. - Directory where CMake Config and pkg-config files will be installed. By - default, CMake Config files will be installed in the subfolder `cmake` of the - directory where the (static) libraries will be installed (e.g., `lib`). The - `.pc` files for pkg-config will be installed in the subfolder `pkgconfig` of - the directory where the (static) libraries will be installed. + DEMO if true: build the demo programs for each package. + Default: false. - This option allows to install them at a location different from the (static) - libraries. This allows to install multiple configurations of the SuiteSparse - libraries at the same time (e.g., by also setting a different - `CMAKE_RELEASE_POSTFIX` and `CMAKE_INSTALL_LIBDIR` for each of them). To pick - up the respective configuration in downstream projects, set, e.g., - `CMAKE_PREFIX_PATH` (for CMake) or `PKG_CONFIG_PATH` (for build systems using - pkg-config) to the path containing the respective CMake Config files or - pkg-config files. - -* `SUITESPARSE_INCLUDEDIR_POSTFIX`: - - Postfix for installation target of header from SuiteSparse. Default: - suitesparse, so the default include directory is: - `CMAKE_INSTALL_PREFIX/include/suitesparse` - -* `BUILD_SHARED_LIBS`: - - If `ON`, shared libraries are built. - Default: `ON`. - -* `BUILD_STATIC_LIBS`: - - If `ON`, static libraries are built. - Default: `ON`, except for GraphBLAS, which takes a long time to compile so - the default for GraphBLAS is `OFF` unless `BUILD_SHARED_LIBS` is `OFF`. - -* `SUITESPARSE_USE_OPENMP`: - - If `ON`, OpenMP is used by default if it is available. Default: `ON`. - SPEX relies on OpenMP for its thread safety. - -* `SUITESPARSE_CONFIG_USE_OPENMP`: - - If `ON`, `SuiteSparse_config` uses OpenMP if it is available. - Default: `SUITESPARSE_USE_OPENMP`. - It is not essential and only used to let `SuiteSparse_time` call - `omp_get_wtime`. - -* `SPEX_USE_OPENMP`: - - If `ON`, OpenMP is used in SPEX if it is available. - Default: `SUITESPARSE_USE_OPENMP`. - -* `SUITESPARSE_DEMOS`: - - If `ON`, build the demo programs for each package. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_AMD`: - - If `ON`, use AMD libraries installed on the build system. If `OFF`, - automatically build AMD as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_COLAMD`: - - If `ON`, use COLAMD libraries installed on the build system. If `OFF`, - automatically build COLAMD as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_SUITESPARSE_CONFIG`: +You can also use cmake or ccmake directly. For example, try: - If `ON`, use `SuiteSparse_config` libraries installed on the build system. If - `OFF`, automatically build `SuiteSparse_config` as dependency if needed. - Default: `OFF`. + cd AMD/build + ccmake .. + make ----------------------------------------------------------------------------- Acknowledgements @@ -253,9 +133,9 @@ to contact us if there's anything we can do to make your life easier. See also the various Acknowledgements within each package. -Primary Author of SPEX: Chris Lourenco +Primary Author: Chris Lourenco -SPEX Coauthors (alphabetical order): +Coauthors (alphabetical order): Jinhao Chen Timothy A Davis diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index b9a3929b..976a040c 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -2,110 +2,73 @@ # SuiteSparse/SPEX/CMakeLists.txt: cmake for SPEX #------------------------------------------------------------------------------- -# SPEX: (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis, Texas A&M. +# Copyright (c) 2022-2023, Timothy A. Davis. # All Rights Reserved. -# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later +# SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- # get the version #------------------------------------------------------------------------------- -cmake_minimum_required ( VERSION 3.22 ) +cmake_minimum_required ( VERSION 3.19 ) -set ( SPEX_DATE "Mar 22, 2024" ) -set ( SPEX_VERSION_MAJOR 3 CACHE STRING "" FORCE ) -set ( SPEX_VERSION_MINOR 1 CACHE STRING "" FORCE ) -set ( SPEX_VERSION_SUB 0 CACHE STRING "" FORCE ) +set ( SPEX_DATE "Jul 26, 2023" ) +set ( SPEX_VERSION_MAJOR 3 ) +set ( SPEX_VERSION_MINOR 0 ) +set ( SPEX_VERSION_SUB 0 ) message ( STATUS "Building SPEX version: v" ${SPEX_VERSION_MAJOR}. ${SPEX_VERSION_MINOR}. ${SPEX_VERSION_SUB} " (" ${SPEX_DATE} ")" ) -#------------------------------------------------------------------------------- -# define the project -#------------------------------------------------------------------------------- - -project ( SPEX - VERSION "${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB}" - LANGUAGES C ) - #------------------------------------------------------------------------------- # SuiteSparse policies #------------------------------------------------------------------------------- set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${PROJECT_SOURCE_DIR}/cmake_modules - ${PROJECT_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) + ${CMAKE_SOURCE_DIR}/cmake_modules + ${CMAKE_SOURCE_DIR}/../COLAMD/cmake_modules + ${CMAKE_SOURCE_DIR}/../AMD/cmake_modules + ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/cmake_modules ) include ( SuiteSparsePolicy ) #------------------------------------------------------------------------------- -# find OpenMP +# define the project #------------------------------------------------------------------------------- -option ( SPEX_USE_OPENMP "ON: Use OpenMP in SPEX if available. OFF: Do not use OpenMP. (Default: SUITESPARSE_USE_OPENMP)" ${SUITESPARSE_USE_OPENMP} ) -if ( SPEX_USE_OPENMP ) - if ( CMAKE_VERSION VERSION_LESS 3.24 ) - find_package ( OpenMP COMPONENTS C ) - else ( ) - find_package ( OpenMP COMPONENTS C GLOBAL ) - endif ( ) -else ( ) - # OpenMP has been disabled - set ( OpenMP_C_FOUND OFF ) -endif ( ) - -if ( SPEX_USE_OPENMP AND OpenMP_C_FOUND ) - set ( SPEX_HAS_OPENMP ON ) -else ( ) - set ( SPEX_HAS_OPENMP OFF ) -endif ( ) -message ( STATUS "SPEX has OpenMP: ${SPEX_HAS_OPENMP}" ) - -# check for strict usage -if ( SUITESPARSE_USE_STRICT AND SPEX_USE_OPENMP AND NOT SPEX_HAS_OPENMP ) - message ( FATAL_ERROR "OpenMP required for SPEX but not found" ) -endif ( ) +project ( spex + VERSION "${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB}" + LANGUAGES C ) #------------------------------------------------------------------------------- # find library dependencies #------------------------------------------------------------------------------- -if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.7.0 - PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - find_package ( SuiteSparse_config 7.7.0 REQUIRED ) - endif ( ) - - find_package ( AMD 3.3.2 - PATHS ${CMAKE_SOURCE_DIR}/../AMD/build NO_DEFAULT_PATH ) - if ( NOT TARGET SuiteSparse::AMD ) - find_package ( AMD 3.3.2 REQUIRED ) - endif ( ) +find_package ( SuiteSparse_config 6.0.2 REQUIRED ) +find_package ( COLAMD 3.0.2 REQUIRED ) +find_package ( AMD 3.0.2 REQUIRED ) +find_package ( GMP 6.1.2 REQUIRED ) # from SPEX/cmake_modules +find_package ( MPFR 4.0.2 REQUIRED ) # from SPEX/cmake_modules - find_package ( COLAMD 3.3.3 - PATHS ${CMAKE_SOURCE_DIR}/../COLAMD/build NO_DEFAULT_PATH ) - if ( NOT TARGET SuiteSparse::COLAMD ) - find_package ( COLAMD 3.3.3 REQUIRED ) - endif ( ) +option ( NOPENMP "ON (default): do not use OpenMP. OFF: use OpenMP" on ) +if ( NOPENMP ) + set ( OPENMP_FOUND false ) +else ( ) + find_package ( OpenMP ) endif ( ) -find_package ( GMP 6.1.2 REQUIRED ) # from SPEX/cmake_modules -find_package ( MPFR 4.0.2 REQUIRED ) # from SPEX/cmake_modules +include ( SuiteSparse__thread ) #------------------------------------------------------------------------------- # configure files #------------------------------------------------------------------------------- configure_file ( "Config/SPEX.h.in" - "${PROJECT_SOURCE_DIR}/Include/SPEX.h" - NEWLINE_STYLE LF ) + "${PROJECT_SOURCE_DIR}/Include/SPEX.h") configure_file ( "Config/SPEX_version.tex.in" - "${PROJECT_SOURCE_DIR}/Doc/SPEX_version.tex" - NEWLINE_STYLE LF ) + "${PROJECT_SOURCE_DIR}/Doc/SPEX_version.tex") #------------------------------------------------------------------------------- # include directories @@ -119,153 +82,95 @@ include_directories ( Include ${AMD_INCLUDE_DIR} ${COLAMD_INCLUDE_DIR} ) #------------------------------------------------------------------------------- -# dynamic spex library properties +# compiler flags #------------------------------------------------------------------------------- -file ( GLOB SPEX_SOURCES "SPEX*/Source/*.c" ) +# (for example): +# if ( "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" ) +# set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2" ) +# endif ( ) -if ( BUILD_SHARED_LIBS ) - add_library ( SPEX SHARED ${SPEX_SOURCES} ) +#------------------------------------------------------------------------------- +# dynamic spex library properties +#------------------------------------------------------------------------------- - set_target_properties ( SPEX PROPERTIES - VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} - C_STANDARD 11 - C_STANDARD_REQUIRED ON - OUTPUT_NAME spex - SOVERSION ${SPEX_VERSION_MAJOR} - PUBLIC_HEADER "Include/SPEX.h" - WINDOWS_EXPORT_ALL_SYMBOLS ON ) +file ( GLOB SPEX_SOURCES "SPEX*/Source/*.c" ) - if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) - set_target_properties ( SPEX PROPERTIES EXPORT_NO_SYSTEM ON ) - endif ( ) +add_library ( spex SHARED ${SPEX_SOURCES} ) - target_include_directories ( SPEX - INTERFACE $ - $ ) -endif ( ) +set_target_properties ( spex PROPERTIES + VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} + C_STANDARD_REQUIRED 11 + SOVERSION ${SPEX_VERSION_MAJOR} + PUBLIC_HEADER "Include/SPEX.h" ) #------------------------------------------------------------------------------- # static spex library properties #------------------------------------------------------------------------------- -if ( BUILD_STATIC_LIBS ) - add_library ( SPEX_static STATIC ${SPEX_SOURCES} ) +if ( NOT NSTATIC ) +add_library ( spex_static STATIC ${SPEX_SOURCES} ) - set_target_properties ( SPEX_static PROPERTIES - C_STANDARD 11 - C_STANDARD_REQUIRED ON - OUTPUT_NAME spex - PUBLIC_HEADER "Include/SPEX.h" ) - - if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) - set_target_properties ( SPEX_static PROPERTIES - OUTPUT_NAME spex_static ) - endif ( ) - - if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) - set_target_properties ( SPEX_static PROPERTIES EXPORT_NO_SYSTEM ON ) - endif ( ) - - target_include_directories ( SPEX_static - INTERFACE $ - $ ) +set_target_properties ( spex_static PROPERTIES + VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} + C_STANDARD_REQUIRED 11 + OUTPUT_NAME spex + SOVERSION ${SPEX_VERSION_MAJOR} ) endif ( ) #------------------------------------------------------------------------------- # add the library dependencies #------------------------------------------------------------------------------- -# SuiteSparseConfig: -if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SPEX PRIVATE SuiteSparse::SuiteSparseConfig ) - target_include_directories ( SPEX PUBLIC - "$" ) +# suitesparseconfig: +target_link_libraries ( spex PUBLIC ${SUITESPARSE_CONFIG_LIBRARIES} ) +if ( NOT NSTATIC ) + target_link_libraries ( spex_static PUBLIC ${SUITESPARSE_CONFIG_LIBRARIES} ) endif ( ) -if ( BUILD_STATIC_LIBS ) - if ( TARGET SuiteSparse::SuiteSparseConfig_static ) - target_link_libraries ( SPEX_static PUBLIC SuiteSparse::SuiteSparseConfig_static ) - else ( ) - target_link_libraries ( SPEX_static PUBLIC SuiteSparse::SuiteSparseConfig ) + +# OpenMP: +if ( OPENMP_FOUND ) + message ( STATUS "OpenMP C libraries: ${OpenMP_C_LIBRARIES} ") + message ( STATUS "OpenMP C include: ${OpenMP_C_INCLUDE_DIRS} ") + message ( STATUS "OpenMP C flags: ${OpenMP_C_FLAGS} ") + target_link_libraries ( spex PUBLIC ${OpenMP_C_LIBRARIES} ) + if ( NOT NSTATIC ) + target_link_libraries ( spex_static PUBLIC ${OpenMP_C_LIBRARIES} ) endif ( ) + set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS} " ) + include_directories ( ${OpenMP_C_INCLUDE_DIRS} ) endif ( ) # AMD: -if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SPEX PRIVATE SuiteSparse::AMD ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - if ( TARGET SuiteSparse::AMD_static ) - target_link_libraries ( SPEX_static PRIVATE SuiteSparse::AMD_static ) - else ( ) - target_link_libraries ( SPEX_static PRIVATE SuiteSparse::AMD ) - endif ( ) +target_link_libraries ( spex PUBLIC ${AMD_LIBRARIES} ) +if ( NOT NSTATIC ) + target_link_libraries ( spex_static PUBLIC ${AMD_STATIC} ) endif ( ) # COLAMD: -if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SPEX PRIVATE SuiteSparse::COLAMD ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - if ( TARGET SuiteSparse::COLAMD_static ) - target_link_libraries ( SPEX_static PRIVATE SuiteSparse::COLAMD_static ) - else ( ) - target_link_libraries ( SPEX_static PRIVATE SuiteSparse::COLAMD ) - endif ( ) +target_link_libraries ( spex PUBLIC ${COLAMD_LIBRARIES} ) +if ( NOT NSTATIC ) + target_link_libraries ( spex_static PUBLIC ${COLAMD_STATIC} ) endif ( ) # MPFR: -if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SPEX PRIVATE ${MPFR_LIBRARIES} ) - target_include_directories ( SPEX SYSTEM AFTER PUBLIC ${MPFR_INCLUDE_DIR} ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - list ( APPEND SPEX_STATIC_LIBS ${MPFR_STATIC} ) - target_link_libraries ( SPEX_static PUBLIC ${MPFR_STATIC} ) - target_include_directories ( SPEX_static SYSTEM AFTER PUBLIC ${MPFR_INCLUDE_DIR} ) +target_link_libraries ( spex PUBLIC ${MPFR_LIBRARIES} ) +if ( NOT NSTATIC ) + target_link_libraries ( spex_static PUBLIC ${MPFR_STATIC} ) endif ( ) # GMP: # must occur after MPFR -if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SPEX PRIVATE ${GMP_LIBRARIES} ) - target_include_directories ( SPEX SYSTEM AFTER PUBLIC ${GMP_INCLUDE_DIR} ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - list ( APPEND SPEX_STATIC_LIBS ${GMP_STATIC} ) - target_link_libraries ( SPEX_static PUBLIC ${GMP_STATIC} ) - target_include_directories ( SPEX_static SYSTEM AFTER PUBLIC ${GMP_INCLUDE_DIR} ) -endif ( ) - -# OpenMP: -if ( SPEX_HAS_OPENMP ) - message ( STATUS "OpenMP C libraries: ${OpenMP_C_LIBRARIES}" ) - message ( STATUS "OpenMP C include: ${OpenMP_C_INCLUDE_DIRS}" ) - message ( STATUS "OpenMP C flags: ${OpenMP_C_FLAGS}" ) - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SPEX PRIVATE OpenMP::OpenMP_C ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - target_link_libraries ( SPEX_static PRIVATE OpenMP::OpenMP_C ) - list ( APPEND SPEX_STATIC_LIBS ${OpenMP_C_LIBRARIES} ) - endif ( ) -else ( ) - # use threadprivate variables for SPEX instead of globals, so multiple user - # threads can call SPEX in parallel on different matrices. Otherwise, SPEX - # is not thread-safe (see SPEX_Utilities/Source/SPEX_gmp.c). - include ( SuiteSparse__thread ) +target_link_libraries ( spex PUBLIC ${GMP_LIBRARIES} ) +if ( NOT NSTATIC ) + target_link_libraries ( spex_static PUBLIC ${GMP_STATIC} ) endif ( ) # libm: -include ( CheckSymbolExists ) -check_symbol_exists ( fmax "math.h" NO_LIBM ) -if ( NOT NO_LIBM ) - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SPEX PRIVATE m ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - list ( APPEND SPEX_STATIC_LIBS "m" ) - target_link_libraries ( SPEX_static PUBLIC m ) +if ( NOT WIN32 ) + target_link_libraries ( spex PUBLIC m ) + if ( NOT NSTATIC ) + target_link_libraries ( spex_static PUBLIC m ) endif ( ) endif ( ) @@ -273,179 +178,54 @@ endif ( ) # SPEX installation location #------------------------------------------------------------------------------- -include ( CMakePackageConfigHelpers ) - -if ( BUILD_SHARED_LIBS ) - install ( TARGETS SPEX - EXPORT SPEXTargets - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - install ( TARGETS SPEX_static - EXPORT SPEXTargets - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) - -# create (temporary) export target file during build -export ( EXPORT SPEXTargets - NAMESPACE SuiteSparse:: - FILE ${CMAKE_CURRENT_BINARY_DIR}/SPEXTargets.cmake ) - -# install export target, config and version files for find_package -install ( EXPORT SPEXTargets - NAMESPACE SuiteSparse:: - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SPEX ) - -# generate config file to be used in common build tree -set ( SUITESPARSE_IN_BUILD_TREE ON ) -configure_package_config_file ( - Config/SPEXConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/SPEXConfig.cmake - INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/SPEXConfig.cmake ) - -# generate config file to be installed -set ( SUITESPARSE_IN_BUILD_TREE OFF ) -configure_package_config_file ( - Config/SPEXConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/target/SPEXConfig.cmake - INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SPEX ) - -write_basic_package_version_file ( - ${CMAKE_CURRENT_BINARY_DIR}/SPEXConfigVersion.cmake - COMPATIBILITY SameMajorVersion ) - -install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/target/SPEXConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/SPEXConfigVersion.cmake - ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/FindGMP.cmake - ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/FindMPFR.cmake - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SPEX ) - -#------------------------------------------------------------------------------- -# configure MATLAB -#------------------------------------------------------------------------------- - -cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) -if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) - set ( matlab_libdir "${SUITESPARSE_LIBDIR}") -else ( ) - set ( matlab_libdir "${CMAKE_INSTALL_PREFIX}/${SUITESPARSE_LIBDIR}") -endif ( ) -cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) -if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) - set ( matlab_includedir "${SUITESPARSE_INCLUDEDIR}") -else ( ) - set ( matlab_includedir "${CMAKE_INSTALL_PREFIX}/${SUITESPARSE_INCLUDEDIR}") -endif ( ) - -#------------------------------------------------------------------------------- -# create pkg-config file -#------------------------------------------------------------------------------- - -if ( NOT MSVC ) - # This might be something like: - # /usr/lib/libgomp.so;/usr/lib/libpthread.a;m - # convert to -l flags for pkg-config, i.e.: "-lgomp -lpthread -lm" - set ( SPEX_STATIC_LIBS_LIST ${SPEX_STATIC_LIBS} ) - set ( SPEX_STATIC_LIBS "" ) - foreach ( _lib ${SPEX_STATIC_LIBS_LIST} ) - string ( FIND ${_lib} "." _pos REVERSE ) - if ( ${_pos} EQUAL "-1" ) - set ( SPEX_STATIC_LIBS "${SPEX_STATIC_LIBS} -l${_lib}" ) - continue () - endif ( ) - set ( _kinds "SHARED" "STATIC" ) - if ( WIN32 ) - list ( PREPEND _kinds "IMPORT" ) - endif ( ) - foreach ( _kind IN LISTS _kinds ) - set ( _regex ".*\\/(lib)?([^\\.]*)(${CMAKE_${_kind}_LIBRARY_SUFFIX})" ) - if ( ${_lib} MATCHES ${_regex} ) - string ( REGEX REPLACE ${_regex} "\\2" _libname ${_lib} ) - if ( NOT "${_libname}" STREQUAL "" ) - set ( SPEX_STATIC_LIBS "${SPEX_STATIC_LIBS} -l${_libname}" ) - break () - endif ( ) - endif ( ) - endforeach ( ) - endforeach ( ) - - set ( prefix "${CMAKE_INSTALL_PREFIX}" ) - set ( exec_prefix "\${prefix}" ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) - if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) - set ( libdir "${SUITESPARSE_LIBDIR}") - else ( ) - set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") - endif ( ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) - if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) - set ( includedir "${SUITESPARSE_INCLUDEDIR}") - else ( ) - set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") - endif ( ) - if ( BUILD_SHARED_LIBS ) - set ( SUITESPARSE_LIB_BASE_NAME $ ) - else ( ) - set ( SUITESPARSE_LIB_BASE_NAME $ ) - endif ( ) - configure_file ( - Config/SPEX.pc.in - SPEX.pc.out - @ONLY - NEWLINE_STYLE LF ) - file ( GENERATE - OUTPUT SPEX.pc - INPUT ${CMAKE_CURRENT_BINARY_DIR}/SPEX.pc.out - NEWLINE_STYLE LF ) - install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/SPEX.pc - DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) +install ( TARGETS spex + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) +install ( FILES ${CMAKE_SOURCE_DIR}/cmake_modules/FindSPEX.cmake + DESTINATION ${SUITESPARSE_LIBDIR}/cmake/SuiteSparse + COMPONENT Development ) +if ( NOT NSTATIC ) + install ( TARGETS spex_static + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} ) endif ( ) #------------------------------------------------------------------------------- # python interface #------------------------------------------------------------------------------- -if ( BUILD_SHARED_LIBS ) +file ( GLOB SPEX_PYTHON_SOURCES "Python/SPEXpy/Source/*.c" ) - file ( GLOB SPEX_PYTHON_SOURCES "Python/SPEXpy/Source/*.c" ) - add_library ( spexpython SHARED ${SPEX_PYTHON_SOURCES} ) +add_library ( spexpython SHARED ${SPEX_PYTHON_SOURCES} ) - set_target_properties ( spexpython PROPERTIES - VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} - C_STANDARD 11 - C_STANDARD_REQUIRED ON - SOVERSION ${SPEX_VERSION_MAJOR} - PUBLIC_HEADER "Python/SPEXpy/Source/spex_python_connect.h" ) +set_target_properties ( spexpython PROPERTIES + VERSION ${SPEX_VERSION_MAJOR}.${SPEX_VERSION_MINOR}.${SPEX_VERSION_SUB} + C_STANDARD_REQUIRED 11 + SOVERSION ${SPEX_VERSION_MAJOR} + PUBLIC_HEADER "Python/SPEXpy/Source/spex_python_connect.h" ) - # MPFR: - target_link_libraries ( spexpython PRIVATE ${MPFR_LIBRARIES} ) +# MPFR: +target_link_libraries ( spexpython PUBLIC ${MPFR_LIBRARIES} ) - # GMP: - # must occur after MPFR - target_link_libraries ( spexpython PRIVATE ${GMP_LIBRARIES} ) +# GMP: +# must occur after MPFR +target_link_libraries ( spexpython PUBLIC ${GMP_LIBRARIES} ) - target_link_libraries ( spexpython PRIVATE SuiteSparse::COLAMD ) - target_link_libraries ( spexpython PRIVATE SuiteSparse::AMD ) - target_link_libraries ( spexpython PRIVATE SPEX ) +target_link_libraries ( spexpython PUBLIC spex ) - install ( TARGETS spexpython - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) +install ( TARGETS spexpython + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) #------------------------------------------------------------------------------- # Demo library and programs #------------------------------------------------------------------------------- -if ( SUITESPARSE_DEMOS ) +option ( DEMO "ON: Build the demo programs. OFF (default): do not build the demo programs." off ) +if ( DEMO ) #--------------------------------------------------------------------------- # demo library @@ -470,34 +250,14 @@ if ( SUITESPARSE_DEMOS ) add_executable ( spex_demo_threaded "Demo/spex_demo_threaded.c" ${SPEX_DEMO_SOURCES} ) # Libraries required for Demo programs - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( spex_demo_backslash PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) - target_link_libraries ( spex_demo_cholesky_extended PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) - target_link_libraries ( spex_demo_cholesky_simple PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) - target_link_libraries ( spex_demo_lu_doub PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) - target_link_libraries ( spex_demo_lu_extended PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) - target_link_libraries ( spex_demo_lu_simple1 PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) - target_link_libraries ( spex_demo_lu_simple2 PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) - target_link_libraries ( spex_demo_threaded PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} SuiteSparse::AMD SuiteSparse::COLAMD ) - else ( ) - target_link_libraries ( spex_demo_backslash PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) - target_link_libraries ( spex_demo_cholesky_extended PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) - target_link_libraries ( spex_demo_cholesky_simple PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) - target_link_libraries ( spex_demo_lu_doub PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) - target_link_libraries ( spex_demo_lu_extended PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) - target_link_libraries ( spex_demo_lu_simple1 PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) - target_link_libraries ( spex_demo_lu_simple2 PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) - target_link_libraries ( spex_demo_threaded PUBLIC SPEX_static SuiteSparse::AMD_static SuiteSparse::COLAMD_static ) - endif ( ) - - if ( SPEX_USE_OPENMP ) - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( spex_demo_threaded PUBLIC OpenMP::OpenMP_C ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - target_link_libraries ( spex_demo_threaded PUBLIC OpenMP::OpenMP_C ) - endif ( ) - endif ( ) + target_link_libraries ( spex_demo_backslash PUBLIC spex ) + target_link_libraries ( spex_demo_cholesky_extended PUBLIC spex ) + target_link_libraries ( spex_demo_cholesky_simple PUBLIC spex ) + target_link_libraries ( spex_demo_lu_doub PUBLIC spex ) + target_link_libraries ( spex_demo_lu_extended PUBLIC spex ) + target_link_libraries ( spex_demo_lu_simple1 PUBLIC spex ) + target_link_libraries ( spex_demo_lu_simple2 PUBLIC spex ) + target_link_libraries ( spex_demo_threaded PUBLIC spex ) else ( ) @@ -509,66 +269,50 @@ endif ( ) # configure MATLAB and Tcov #------------------------------------------------------------------------------- -if ( BUILD_SHARED_LIBS AND NOT SUITESPARSE_ROOT_CMAKELISTS ) - - # get paths to libraries - get_filename_component ( GMP_PATH ${GMP_LIBRARY} DIRECTORY ) - get_filename_component ( SUITESPARSE_CONFIG_PATH ${SUITESPARSE_CONFIG_LIBRARY} DIRECTORY ) - get_filename_component ( COLAMD_PATH ${COLAMD_LIBRARY} DIRECTORY ) - get_filename_component ( AMD_PATH ${AMD_LIBRARY} DIRECTORY ) - get_filename_component ( MPFR_PATH ${MPFR_LIBRARY} DIRECTORY ) - - # message ( STATUS "suitesparseconfig path ${SUITESPARSE_CONFIG_PATH}" ) - # message ( STATUS "colamd path ${COLAMD_PATH}" ) - # message ( STATUS "amd path ${AMD_PATH}" ) - # message ( STATUS "gmp path ${GMP_PATH}" ) - # message ( STATUS "mpfr path ${MPFR_PATH}" ) - - # construct the -I list - get_target_property ( INCS SPEX INCLUDE_DIRECTORIES ) - list ( TRANSFORM INCS PREPEND " -I" ) - set ( SPEX_INCS "" ) - foreach ( INC ${INCS} ) - # message ( STATUS "check inc: ${INC}" ) - if ( NOT ${INC} MATCHES "TARGET_PROPERTY" ) - # message ( STATUS "add inc: ${INC}" ) - string ( APPEND SPEX_INCS " " ${INC} ) - endif ( ) - endforeach ( ) - # message ( STATUS "Incs: ${SPEX_INCS}" ) - - # construct the library list for Tcov/Makefile - set ( SPEX_LIB_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}" ) - get_target_property ( LIBS SPEX LINK_LIBRARIES ) - string ( REPLACE "." "\\." LIBSUFFIX ${SPEX_LIB_SUFFIX} ) - set ( SPEX_LIBS "" ) - foreach ( LIB_NAME ${LIBS} ) - # message ( STATUS "Lib: ${LIB_NAME}" ) - if ( LIB_NAME MATCHES "::" ) - # do nothing - elseif ( LIB_NAME MATCHES ${LIBSUFFIX} ) - # message ( STATUS "has suffix" ) - string ( APPEND SPEX_LIBS " " ${LIB_NAME} ) - else ( ) - # message ( STATUS "no suffix" ) - string ( APPEND SPEX_LIBS " -l" ${LIB_NAME} ) - endif ( ) - endforeach ( ) - # message ( STATUS "Libs: ${SPEX_LIBS}" ) - - configure_file ( - "Config/spex_deps.m.in" - "${PROJECT_SOURCE_DIR}/MATLAB/spex_deps.m" - @ONLY - NEWLINE_STYLE LF ) - - configure_file ( - "Config/Tcov_Makefile.in" - "${PROJECT_SOURCE_DIR}/Tcov/Makefile" - @ONLY - NEWLINE_STYLE LF ) +# get paths to libraries +get_filename_component ( GMP_PATH ${GMP_LIBRARY} DIRECTORY ) +get_filename_component ( SUITESPARSE_CONFIG_PATH ${SUITESPARSE_CONFIG_LIBRARY} DIRECTORY ) +get_filename_component ( COLAMD_PATH ${COLAMD_LIBRARY} DIRECTORY ) +get_filename_component ( AMD_PATH ${AMD_LIBRARY} DIRECTORY ) +get_filename_component ( MPFR_PATH ${MPFR_LIBRARY} DIRECTORY ) + +# message ( STATUS "suitesparseconfig path ${SUITESPARSE_CONFIG_PATH}" ) +# message ( STATUS "colamd path ${COLAMD_PATH}" ) +# message ( STATUS "amd path ${AMD_PATH}" ) +# message ( STATUS "gmp path ${GMP_PATH}" ) +# message ( STATUS "mpfr path ${MPFR_PATH}" ) + +# construct the -I list +get_target_property ( INCS spex INCLUDE_DIRECTORIES ) +list ( TRANSFORM INCS PREPEND " -I" ) +set ( SPEX_INC "" ) +foreach ( INC ${INCS} ) + string ( APPEND SPEX_INC " " ${INC} ) +endforeach ( ) +# message ( STATUS "Incs: ${SPEX_INC}" ) + +# construct the library list +set ( SPEX_LIB_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}" ) +get_target_property ( LIBS spex LINK_LIBRARIES ) +string ( REPLACE "." "\\." LIBSUFFIX ${SPEX_LIB_SUFFIX} ) +set ( SPEX_LIBRARIES "" ) +foreach ( LIB_NAME ${LIBS} ) +# message ( STATUS "Lib: ${LIB_NAME}" ) + if ( LIB_NAME MATCHES ${LIBSUFFIX} ) +# message ( STATUS "has suffix" ) + string ( APPEND SPEX_LIBRARIES " " ${LIB_NAME} ) + else ( ) +# message ( STATUS "no suffix" ) + string ( APPEND SPEX_LIBRARIES " -l" ${LIB_NAME} ) + endif ( ) +endforeach ( ) +# message ( STATUS "Libs: ${SPEX_LIBRARIES}" ) + +configure_file ( "Config/spex_deps.m.in" + "${PROJECT_SOURCE_DIR}/MATLAB/spex_deps.m") -endif ( ) +configure_file ( "Config/Tcov_Makefile.in" + "${PROJECT_SOURCE_DIR}/Tcov/Makefile") #------------------------------------------------------------------------------- # report status diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index cbdb791f..2961797b 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -2,8 +2,8 @@ // SPEX/Include/SPEX.h: Include file for SPEX Library //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -27,7 +27,7 @@ //------------------------------------------------------------------------------ // Unless otherwise noted all functions are authored by: // -// Christopher Lourenco, Jinhao Chen, +// Christopher Lourenco, Jinhao Chen, // Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis // @@ -66,8 +66,8 @@ // // See license.txt for license info. // -// This software is copyright by Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// This software is copyright by Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. // All Rights Reserved. // @@ -95,40 +95,13 @@ #include #include #include -// #include -// #include -// #include -// #include +#include +#include +#include +#include #include "SuiteSparse_config.h" - -//------------------------------------------------------------------------------ -// SPEX Version -//------------------------------------------------------------------------------ - -// Current version of the code -#define SPEX_DATE "@SPEX_DATE@" -#define SPEX_VERSION_STRING "@SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@" -#define SPEX_VERSION_MAJOR @SPEX_VERSION_MAJOR@ -#define SPEX_VERSION_MINOR @SPEX_VERSION_MINOR@ -#define SPEX_VERSION_SUB @SPEX_VERSION_SUB@ - -#define SPEX_VERSION_NUMBER(major,minor,sub) \ - (((major)*1000ULL + (minor))*1000ULL + (sub)) -#define SPEX_VERSION \ - SPEX_VERSION_NUMBER (SPEX_VERSION_MAJOR, \ - SPEX_VERSION_MINOR, \ - SPEX_VERSION_SUB) - -#define SPEX__VERSION SUITESPARSE__VERCODE(@SPEX_VERSION_MAJOR@,@SPEX_VERSION_MINOR@,@SPEX_VERSION_SUB@) -#if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) -#error "SPEX @SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" -#endif - -#if defined ( __cplusplus ) -extern "C" -{ -#endif +#include "amd.h" +#include "colamd.h" //------------------------------------------------------------------------------ // Error codes @@ -155,9 +128,23 @@ typedef enum SPEX_info ; //------------------------------------------------------------------------------ -// SPEX Version, continued +// SPEX Version //------------------------------------------------------------------------------ +// Current version of the code +#define SPEX_DATE "@SPEX_DATE@" +#define SPEX_VERSION_STRING "@SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@" +#define SPEX_VERSION_MAJOR @SPEX_VERSION_MAJOR@ +#define SPEX_VERSION_MINOR @SPEX_VERSION_MINOR@ +#define SPEX_VERSION_SUB @SPEX_VERSION_SUB@ + +#define SPEX_VERSION_NUMBER(major,minor,sub) \ + (((major)*1000ULL + (minor))*1000ULL + (sub)) +#define SPEX_VERSION \ + SPEX_VERSION_NUMBER (SPEX_VERSION_MAJOR, \ + SPEX_VERSION_MINOR, \ + SPEX_VERSION_SUB) + SPEX_info SPEX_version ( int version [3], // SPEX major, minor, and sub version @@ -179,42 +166,6 @@ SPEX_info SPEX_version #error "MPFR v4.0.2 or later is required." #endif -//------------------------------------------------------------------------------ -// SPEX_TRY: try a SPEX method and check for errors -//------------------------------------------------------------------------------ - -// In a robust application, the return values from each call to SPEX should be -// checked, and corrective action should be taken if an error occurs. The -// SPEX_TRY macros assist in this effort. -// -// SPEX is written in C, and so it cannot rely on the try/catch mechanism of -// C++. To accomplish a similar goal, we provide our mechanism. The SPEX_TRY -// macro calls a single SPEX method and then takes corrected action based on a -// user-defined macro SPEX_CATCH. - -#define SPEX_TRY(method) \ -{ \ - SPEX_info info = (method) ; \ - if (info != SPEX_OK) \ - { \ - SPEX_CATCH (info) ; \ - } \ -} - -// A typical example user application might #define SPEX_CATCH as follows. -// Suppose the user function needs to free some workspace and return to the -// caller if an error occurs: - -/* - #define SPEX_CATCH(info) \ - { \ - SPEX_matrix_free (&A, NULL) ; \ - fprintf (stderr, "SPEX failed: info %d, line %d, file %s\n", \ - info, __LINE__, __FILE__) ; \ - return (info) ; \ - } \ -*/ - //------------------------------------------------------------------------------ // Pivot scheme codes //------------------------------------------------------------------------------ @@ -388,7 +339,7 @@ SPEX_type ; // A->x. For example, if A->p_shallow is true, then a non-NULL A->p is a // pointer to a read-only array, and the A->p array is not freed by // SPEX_matrix_free. If A->p is NULL (for a triplet or dense matrix), then -// A->p_shallow has no effect. +// A->p_shallow has no effect. typedef struct { @@ -454,20 +405,6 @@ typedef struct // A SPEX_matrix is a pointer to a SPEX_matrix_struct typedef SPEX_matrix_struct *SPEX_matrix ; -//------------------------------------------------------------------------------ -// SPEX_matrix macros -//------------------------------------------------------------------------------ - -// These macros simplify the access to entries in a SPEX_matrix. -// The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. - -// To access the kth entry in a SPEX_matrix using 1D linear addressing, -// in any matrix kind (CSC, triplet, or dense), in any type: -#define SPEX_1D(A,k,type) ((A)->x.type [k]) - -// To access the (i,j)th entry in a 2D dense SPEX_matrix, in any type: -#define SPEX_2D(A,i,j,type) SPEX_1D (A, (i)+(j)*((A)->m), type) - //------------------------------------------------------------------------------ // SPEX_matrix_allocate: allocate an m-by-n SPEX_matrix //------------------------------------------------------------------------------ @@ -550,7 +487,7 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code // SPEX_matrix_copy: make a copy of a SPEX_matrix, into another kind and type. // SPEX supports 16 matrix formats: 15 of them are all combinations of -// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). +// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). SPEX_info SPEX_matrix_copy ( @@ -855,6 +792,8 @@ SPEX_info SPEX_determine_symmetry const SPEX_options option // Command options ) ; +// ended HERE on Apr 10. + //------------------------------------------------------------------------------ //---------------------------SPEX GMP/MPFR Functions---------------------------- //------------------------------------------------------------------------------ @@ -976,8 +915,6 @@ SPEX_info SPEX_mpq_equal (int *r, const mpq_t x, const mpq_t y) ; SPEX_info SPEX_mpfr_init2(mpfr_t x, const uint64_t size) ; -SPEX_info SPEX_mpfr_set_prec(mpfr_t x, const uint64_t size) ; - SPEX_info SPEX_mpfr_set (mpfr_t x, const mpfr_t y, const mpfr_rnd_t rnd) ; SPEX_info SPEX_mpfr_set_d (mpfr_t x, const double y, const mpfr_rnd_t rnd) ; @@ -1014,13 +951,6 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; -SPEX_info SPEX_mpz_set_null (mpz_t x) ; -SPEX_info SPEX_mpq_set_null (mpq_t x) ; -SPEX_info SPEX_mpfr_set_null (mpfr_t x) ; -SPEX_info SPEX_mpz_clear (mpz_t x) ; -SPEX_info SPEX_mpq_clear (mpq_t x) ; -SPEX_info SPEX_mpfr_clear (mpfr_t x) ; - //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -1034,7 +964,7 @@ SPEX_info SPEX_mpfr_clear (mpfr_t x) ; // "Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via // a Sparse Left-looking Integer-preserving LU Factorization", -// C. Lourenco, J. Chen, E. Moreno-Centeno, T. Davis, +// C. Lourenco, J. Chen, E. Moreno-Centeno, T. Davis, // ACM Trans. Mathematical Software. pp 1-23, vol 48, no 2, 2022. // The theory associated with this software can be found in the paper @@ -1060,7 +990,7 @@ SPEX_info SPEX_mpfr_clear (mpfr_t x) ; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis +// Christopher Lourenco, Jinhao Chen, Timothy A. Davis, and Erick Moreno-Centeno //------------------------------------------------------------------------------ @@ -1211,7 +1141,7 @@ SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b //------------------------------------------------------------------------------ // Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. //------------------------------------------------------------------------------ @@ -1369,9 +1299,5 @@ SPEX_info SPEX_backslash SPEX_options option // Command options (NULL: means use defaults) ) ; -#if defined ( __cplusplus ) -} -#endif - #endif diff --git a/SPEX/Config/SPEX.pc.in b/SPEX/Config/SPEX.pc.in deleted file mode 100644 index 2f347cfa..00000000 --- a/SPEX/Config/SPEX.pc.in +++ /dev/null @@ -1,18 +0,0 @@ -# SPEX, Copyright (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis, Texas A&M. -# All Rights Reserved. -# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: SPEX -URL: https://github.com/DrTimothyAldenDavis/SuiteSparse -Description: Software package for SParse EXact algebra in SuiteSparse -Version: @SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@ -Requires.private: SuiteSparse_config AMD COLAMD -Libs: -L${libdir} -l@SUITESPARSE_LIB_BASE_NAME@ -Libs.private: @SPEX_STATIC_LIBS@ -Cflags: -I${includedir} diff --git a/SPEX/Config/SPEXConfig.cmake.in b/SPEX/Config/SPEXConfig.cmake.in deleted file mode 100644 index d61890d6..00000000 --- a/SPEX/Config/SPEXConfig.cmake.in +++ /dev/null @@ -1,190 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/SPEX/cmake_modules/SPEXConfig.cmake -#------------------------------------------------------------------------------- - -# SPEX, Copyright (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis, Texas A&M. -# All Rights Reserved. -# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -#------------------------------------------------------------------------------- - -# Finds the SPEX include file and compiled library. -# The following targets are defined: -# SuiteSparse::SPEX - for the shared library (if available) -# SuiteSparse::SPEX_static - for the static library (if available) - -# For backward compatibility the following variables are set: - -# SPEX_INCLUDE_DIR - where to find SPEX.h -# SPEX_LIBRARY - dynamic SPEX library -# SPEX_STATIC - static SPEX library -# SPEX_LIBRARIES - libraries when using SPEX -# SPEX_FOUND - true if SPEX found - -# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is -# installed. - -#------------------------------------------------------------------------------- - -@PACKAGE_INIT@ - -set ( SPEX_DATE "@SPEX_DATE@" ) -set ( SPEX_VERSION_MAJOR @SPEX_VERSION_MAJOR@ ) -set ( SPEX_VERSION_MINOR @SPEX_VERSION_MINOR@ ) -set ( SPEX_VERSION_PATCH @SPEX_VERSION_SUB@ ) -set ( SPEX_VERSION "@SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@" ) - -# Check for dependent targets -include ( CMakeFindDependencyMacro ) - -# Look for SuiteSparse_config, AMD and COLAMD targets -if ( @SUITESPARSE_IN_BUILD_TREE@ ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - # First check in a common build tree - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ - PATHS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config/build NO_DEFAULT_PATH ) - # Then, check in the currently active CMAKE_MODULE_PATH - if ( NOT SuiteSparse_config_FOUND ) - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) - endif ( ) - endif ( ) - - if ( NOT TARGET SuiteSparse::AMD ) - # First check in a common build tree - find_dependency ( AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@ - PATHS ${CMAKE_SOURCE_DIR}/../AMD/build NO_DEFAULT_PATH ) - # Then, check in the currently active CMAKE_MODULE_PATH - if ( NOT AMD_FOUND ) - find_dependency ( AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@ ) - endif ( ) - endif ( ) - - if ( NOT TARGET SuiteSparse::COLAMD ) - # First check in a common build tree - find_dependency ( COLAMD @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@ - PATHS ${CMAKE_SOURCE_DIR}/../COLAMD/build NO_DEFAULT_PATH ) - # Then, check in the currently active CMAKE_MODULE_PATH - if ( NOT COLAMD_FOUND ) - find_dependency ( COLAMD @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@ ) - endif ( ) - endif ( ) - -else ( ) - if ( NOT TARGET SuiteSparse::SuiteSparseConfig ) - find_dependency ( SuiteSparse_config @SUITESPARSE_CONFIG_VERSION_MAJOR@.@SUITESPARSE_CONFIG_VERSION_MINOR@ ) - endif ( ) - if ( NOT TARGET SuiteSparse::AMD ) - find_dependency ( AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@ ) - endif ( ) - if ( NOT TARGET SuiteSparse::COLAMD ) - find_dependency ( COLAMD @COLAMD_VERSION_MAJOR@.@COLAMD_VERSION_MINOR@ ) - endif ( ) -endif ( ) - -# Look for GMP and MPFR modules -list ( PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ) -if ( NOT GMP_FOUND ) - find_dependency ( GMP 6.1.2 ) -endif ( ) -if ( NOT MPFR_FOUND ) - find_dependency ( MPFR 4.0.2 ) -endif ( ) - -if ( NOT SuiteSparse_config_FOUND OR NOT AMD_FOUND OR NOT COLAMD_FOUND - OR NOT GMP_FOUND OR NOT MPFR_FOUND) - set ( SPEX_FOUND OFF ) - return ( ) -endif ( ) - - -# Import target -include ( ${CMAKE_CURRENT_LIST_DIR}/SPEXTargets.cmake ) - -# The following is only for backward compatibility with FindSPEX. - -set ( _target_shared SuiteSparse::SPEX ) -set ( _target_static SuiteSparse::SPEX_static ) -set ( _var_prefix "SPEX" ) - -if ( NOT @BUILD_SHARED_LIBS@ AND NOT TARGET ${_target_shared} ) - # make sure there is always an import target without suffix ) - add_library ( ${_target_shared} ALIAS ${_target_static} ) -endif ( ) - -get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) -if ( ${_var_prefix}_INCLUDE_DIR ) - # First item in SuiteSparse targets contains the "main" header directory. - list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) -endif ( ) -get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) -if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) -endif ( ) -if ( TARGET ${_target_static} ) - get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) -endif ( ) - -# Check for most common build types -set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) - -get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) -if ( _isMultiConfig ) - # For multi-configuration generators (e.g., Visual Studio), prefer those - # configurations. - list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) -else ( ) - # For single-configuration generators, prefer the current configuration. - list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) -endif ( ) - -list ( REMOVE_DUPLICATES _config_types ) - -foreach ( _config ${_config_types} ) - string ( TOUPPER ${_config} _uc_config ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_IMPLIB_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) - get_target_property ( _library_chk ${_target_static} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_STATIC ${_library_chk} ) - endif ( ) - endif ( ) -endforeach ( ) - -set ( SPEX_LIBRARIES ${SPEX_LIBRARY} ) - -macro ( suitesparse_check_exist _var _files ) - # ignore generator expressions - string ( GENEX_STRIP "${_files}" _files2 ) - - foreach ( _file ${_files2} ) - if ( NOT EXISTS "${_file}" ) - message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) - endif ( ) - endforeach () -endmacro ( ) - -suitesparse_check_exist ( SPEX_INCLUDE_DIR ${SPEX_INCLUDE_DIR} ) -suitesparse_check_exist ( SPEX_LIBRARY ${SPEX_LIBRARY} ) - -message ( STATUS "SPEX version: ${SPEX_VERSION}" ) -message ( STATUS "SPEX include: ${SPEX_INCLUDE_DIR}" ) -message ( STATUS "SPEX library: ${SPEX_LIBRARY}" ) -message ( STATUS "SPEX static: ${SPEX_STATIC}" ) diff --git a/SPEX/Config/Tcov_Makefile.in b/SPEX/Config/Tcov_Makefile.in index 450815fe..cd861fb2 100644 --- a/SPEX/Config/Tcov_Makefile.in +++ b/SPEX/Config/Tcov_Makefile.in @@ -2,8 +2,8 @@ # SPEX/Tcov/Makefile: compile and run SPEX test coverage #------------------------------------------------------------------------------- -# SPEX: (c) 2019-2024, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -16,11 +16,8 @@ SUITESPARSE ?= $(realpath $(CURDIR)/../..) ################################################################################ # configured by CMake: -INC = @SPEX_INCS@ -LIBS = ../../SuiteSparse_config/build/libsuitesparseconfig.so \ - ../../AMD/build/libamd.so \ - ../../COLAMD/build/libcolamd.so \ - @SPEX_LIBS@ +INC = @SPEX_INC@ +LIBS = @SPEX_LIBRARIES@ SUITESPARSE_CONFIG_PATH = @SUITESPARSE_CONFIG_PATH@ COLAMD_PATH = @COLAMD_PATH@ @@ -45,13 +42,10 @@ MPFR_PATH = @MPFR_PATH@ ################################################################################ -# select the thread-safety mechanism to test: none, openmp, etc -# none: +# select the thread-safety mechanism to test: none, openmp, or pthreads. # THREADS = -# opemp: # THREADS = -fopenmp -# __thread keyword (gcc and many compilers): - THREADS = -DHAVE_KEYWORD__THREAD + THREADS = -DSPEX_USE_PTHREADS -pthread # Linux test coverage (gcc is required for test coverage) CC = gcc @@ -66,8 +60,7 @@ CFLAGS = -g -fprofile-arcs -ftest-coverage \ cov: runtests ./covall -all: tcov_for_lu spex_demo_lu_extended tcov_for_cholesky tcov_for_lu2 \ - tcov_for_other +all: tcov_for_lu spex_demo_lu_extended tcov_for_cholesky tcov_for_lu2 #------------------------------------------------------------------------------- # compile .c file in this folder @@ -88,9 +81,6 @@ OBJ_Util = \ spex_create_mpfr_array.o \ spex_create_mpq_array.o \ spex_create_mpz_array.o \ - spex_free_mpfr_array.o \ - spex_free_mpq_array.o \ - spex_free_mpz_array.o \ spex_cumsum.o \ spex_expand_double_array.o \ spex_expand_mpfr_array.o \ @@ -116,7 +106,8 @@ OBJ_Util = \ SPEX_determine_symmetry.o \ SPEX_transpose.o \ spex_amd.o \ - spex_colamd.o + spex_colamd.o \ + spex_create_mpq.o $(OBJ_Util): ../Include/SPEX.h ../SPEX_Utilities/Source/spex_util_internal.h @@ -220,9 +211,6 @@ spex_demo_lu_extended: $(OBJ_Util) $(OBJ_LU) ../Demo/spex_demo_lu_extended.c $( tcov_for_cholesky: $(OBJ_Tcov) $(OBJ_Util) $(OBJ_Cholesky) tcov_for_cholesky.c simple_rand.c simple_rand.h $(DEMO_SRC) $(CC) $(LDFLAGS) $(CFLAGS) tcov_for_cholesky.c simple_rand.c $(DEMO_SRC) -o tcov_for_cholesky $(OBJ_Tcov) $(OBJ_Util) $(OBJ_Cholesky) $(LIBS) -tcov_for_other: $(OBJ_Tcov) $(OBJ_Util) $(OBJ_LU) tcov_for_other.c - $(CC) $(LDFLAGS) tcov_for_other.c $(CFLAGS) -o tcov_for_other $(OBJ_Tcov) $(OBJ_Util) $(OBJ_LU) $(LIBS) - #------------------------------------------------------------------------------- # run all statement coverage tests @@ -230,19 +218,18 @@ runtests: runtests4llu runtests4chol # only run test for SPEX_LU runtests4llu: all - ./tcov_for_other - ./spex_demo_lu_extended q 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu1.out - ./spex_demo_lu_extended q 2 o 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu2.out - ./spex_demo_lu_extended q 3 o 1 f ../ExampleMats/test.mat.txt ../ExampleMats/test.rhs.txt > lu3.out - ./spex_demo_lu_extended f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu4.out - ./tcov_for_lu > test_for_lu.out - ./tcov_for_lu 0 1 1 > lu5.out - ./tcov_for_lu2 ../ExampleMats/Trefethen_500.mat.txt ../ExampleMats/Trefethen_500.rhs.txt > test_for_lu2.out + - ./spex_demo_lu_extended p 2 q 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu1.out + - ./spex_demo_lu_extended p 3 q 2 o 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu2.out + - ./spex_demo_lu_extended p 4 q 3 o 1 f ../ExampleMats/test.mat.txt ../ExampleMats/test.rhs.txt > lu3.out + - ./spex_demo_lu_extended p 5 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu4.out + - ./tcov_for_lu > test_for_lu.out + - ./tcov_for_lu 0 1 1 > lu5.out + - ./tcov_for_lu2 ../ExampleMats/Trefethen_500.mat.txt ../ExampleMats/Trefethen_500.rhs.txt > test_for_lu2.out # only run test for SPEX_Cholesky runtests4chol: all - ./tcov_for_cholesky ../ExampleMats/mesh1e1.mat.txt ../ExampleMats/mesh1e1.rhs.txt > test_for_cholesky.out + - ./tcov_for_cholesky ../ExampleMats/mesh1e1.mat.txt ../ExampleMats/mesh1e1.rhs.txt > test_for_cholesky.out #------------------------------------------------------------------------------- @@ -255,28 +242,24 @@ vtests: vtests4llu vtests4chol # run test for SPEX_LU with valgrind vtests4llu: all - $(V) ./tcov_for_other - $(V) ./spex_demo_lu_extended q 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu1.out - $(V) ./spex_demo_lu_extended q 2 o 1 f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu2.out - $(V) ./spex_demo_lu_extended q 3 o 1 f ../ExampleMats/test.mat.txt ../ExampleMats/test.rhs.txt > lu3.out - $(V) ./spex_demo_lu_extended f ../ExampleMats/10teams.mat.txt ../ExampleMats/10teams.rhs.txt > lu4.out - $(V) ./tcov_for_lu > test_for_lu.out - $(V) ./tcov_for_lu 0 1 1 > lu5.out - $(V) ./tcov_for_lu2 ../ExampleMats/Trefethen_500.mat.txt ../ExampleMats/Trefethen_500.rhs.txt > test_for_lu2.out - -vtest2: all - $(V) ./tcov_for_lu2 ../ExampleMats/Trefethen_500.mat.txt ../ExampleMats/Trefethen_500.rhs.txt > test_for_lu2.out + - $(V) ./spex_demo_lu_extended p 2 q 0 f ../ExampleMats/10teams_mat.txt ../ExampleMats/10teams_v.txt > lu1.out + - $(V) ./spex_demo_lu_extended p 3 q 1 o 1 f ../ExampleMats/10teams_mat.txt ../ExampleMats/10teams_v.txt > lu2.out + - $(V) ./spex_demo_lu_extended p 4 q 2 o 1 f ../ExampleMats/test_mat.txt ../ExampleMats/test_rhs.txt > lu3.out + - $(V) ./spex_demo_lu_extended p 5 f ../ExampleMats/10teams_mat.txt ../ExampleMats/10teams_v.txt > lu4.out + - $(V) ./tcov_for_lu > test_for_lu.out + - $(V) ./tcov_for_lu 0 1 1 > lu5.out + # run test for SPEX_Cholesky with valgrind vtests4chol: all - $(V) ./tcov_for_cholesky ../ExampleMats/mesh1e1.mat.txt ../ExampleMats/mesh1e1.rhs.txt > test_for_cholesky.out + - $(V) ./tcov_for_cholesky ../ExampleMats/872.mat.txt > test_for_cholesky.out #------------------------------------------------------------------------------- # remove all files not in the original distribution, including symbolic links clean: - $(RM) *.o *.bbg *.da *.gcov *.gcda *gcno - - $(RM) tcov_for_lu spex_demo_lu_extended *.out *.a out tcov_for_lu2 tcov_for_other + - $(RM) tcov_for_lu spex_demo_lu_extended *.out *.a out tcov_for_lu2 - $(RM) -r SPEX_*.c spex_*.c *.dSYM - $(RM) -r tcov_for_cholesky diff --git a/SPEX/Config/spex_deps.m.in b/SPEX/Config/spex_deps.m.in index 73e347c8..f9953068 100644 --- a/SPEX/Config/spex_deps.m.in +++ b/SPEX/Config/spex_deps.m.in @@ -6,15 +6,15 @@ function [suitesparse_libdir, suitesparse_incdir, gmp_lib, gmp_include, mpfr_lib % On Linux you may need to add the following to your shell script (typically % .bashrc), start a new shell, and then start MATLAB again. % -% LD_LIBRARY_PATH=$LD_LIBRARY_PATH:@matlab_libdir@ +% LD_LIBRARY_PATH=$LD_LIBRARY_PATH:@SUITESPARSE_LIBDIR@ -% SPEX: (c) 2022-2024, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +% SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later -suitesparse_libdir = '@matlab_libdir@' ; -suitesparse_incdir = '@matlab_includedir@' ; +suitesparse_libdir = '@SUITESPARSE_LIBDIR@' ; +suitesparse_incdir = '@SUITESPARSE_INCLUDEDIR@' ; gmp_lib = '@GMP_LIBRARY@' ; gmp_include = '@GMP_INCLUDE_DIR@' ; mpfr_lib = '@MPFR_LIBRARY@' ; diff --git a/SPEX/Demo/Utilities/spex_demo_check_solution.c b/SPEX/Demo/Utilities/spex_demo_check_solution.c index adaf402b..9e2a8c8a 100644 --- a/SPEX/Demo/Utilities/spex_demo_check_solution.c +++ b/SPEX/Demo/Utilities/spex_demo_check_solution.c @@ -2,23 +2,25 @@ // Demo/spex_check_solution: checks whether a given vector exactly solves Ax=b //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ + #include "spex_demos.h" #undef FREE_WORKSPACE #define FREE_WORKSPACE \ { \ - SPEX_mpq_clear (temp) ; \ - SPEX_mpq_clear (scale) ; \ + SPEX_MPQ_CLEAR(temp); \ + SPEX_MPQ_CLEAR(scale); \ SPEX_matrix_free(&b2, NULL); \ } + SPEX_info spex_demo_check_solution ( const SPEX_matrix A, // Input matrix @@ -27,30 +29,34 @@ SPEX_info spex_demo_check_solution const SPEX_options option // Command options ) { + if (!SPEX_initialize ( )) return (SPEX_PANIC); //-------------------------------------------------------------------------- - // Declare vars + // check inputs. Input are also checked by the two callers //-------------------------------------------------------------------------- - mpq_t temp; - mpq_t scale; - int64_t p, j, i, nz; - SPEX_matrix b2 = NULL; // b2 stores the solution of A*x - int r; - SPEX_mpq_set_null (temp) ; - SPEX_mpq_set_null (scale) ; + SPEX_info info ; + /*SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ); + SPEX_REQUIRE (x, SPEX_DENSE, SPEX_MPQ); + SPEX_REQUIRE (b, SPEX_DENSE, SPEX_MPZ);*/ //-------------------------------------------------------------------------- - // initialize + // Declare vars //-------------------------------------------------------------------------- - SPEX_TRY (SPEX_mpq_init(temp)); - SPEX_TRY (SPEX_mpq_init(scale)); - SPEX_TRY (SPEX_matrix_allocate(&b2, SPEX_DENSE, SPEX_MPQ, b->m, b->n, + int64_t p, j, i, nz; + SPEX_matrix b2 = NULL; // b2 stores the solution of A*x + mpq_t temp; SPEX_MPQ_SET_NULL(temp); + mpq_t scale; SPEX_MPQ_SET_NULL(scale); + + SPEX_MPQ_INIT(temp); + SPEX_MPQ_INIT(scale); + SPEX_CHECK (SPEX_matrix_allocate(&b2, SPEX_DENSE, SPEX_MPQ, b->m, b->n, b->nzmax, false, true, option)); + //-------------------------------------------------------------------------- - // perform SPEX_mpq_add,mul in loops to compute b2 = A'*x, where A' is the + // perform SPEX_mpq_addmul in loops to compute b2 = A'*x, where A' is the // scaled matrix with all entries in integer //-------------------------------------------------------------------------- @@ -62,15 +68,15 @@ SPEX_info spex_demo_check_solution { // temp = A[p][i] (note this must be done seperately since A is // mpz and temp is mpq) - SPEX_TRY (SPEX_mpq_set_z(temp, A->x.mpz[p])); + SPEX_MPQ_SET_Z(temp, A->x.mpz[p]); // temp = temp*x[i] - SPEX_TRY (SPEX_mpq_mul(temp, temp, - SPEX_2D(x, i, j, mpq))); + SPEX_MPQ_MUL(temp, temp, + SPEX_2D(x, i, j, mpq)); // b2[p] = b2[p]-temp - SPEX_TRY (SPEX_mpq_add(SPEX_2D(b2, A->i[p], j, mpq), - SPEX_2D(b2, A->i[p], j, mpq),temp)); + SPEX_MPQ_ADD(SPEX_2D(b2, A->i[p], j, mpq), + SPEX_2D(b2, A->i[p], j, mpq),temp); } } } @@ -79,16 +85,17 @@ SPEX_info spex_demo_check_solution // Apply scales of A and b to b2 before comparing the b2 with scaled b' //-------------------------------------------------------------------------- - SPEX_TRY (SPEX_mpq_div(scale, b->scale, A->scale)); + SPEX_MPQ_DIV(scale, b->scale, A->scale); // Apply scaling factor, but ONLY if it is not 1 - SPEX_TRY (SPEX_mpq_cmp_ui(&r, scale, 1, 1)); + int r; + SPEX_MPQ_CMP_UI(&r, scale, 1, 1); if (r != 0) { nz = x->m * x->n; for (i = 0; i < nz; i++) { - SPEX_TRY (SPEX_mpq_mul(b2->x.mpq[i], b2->x.mpq[i], scale)); + SPEX_MPQ_MUL(b2->x.mpq[i], b2->x.mpq[i], scale); } } @@ -101,25 +108,40 @@ SPEX_info spex_demo_check_solution for (i = 0; i < b->m; i++) { // temp = b[i] (correct b) - SPEX_TRY (SPEX_mpq_set_z(temp, SPEX_2D(b, i, j, mpz))); + SPEX_MPQ_SET_Z(temp, SPEX_2D(b, i, j, mpz)); // set check false if b!=b2 - SPEX_TRY (SPEX_mpq_equal(&r, temp, SPEX_2D(b2, i, j, mpq))); + SPEX_MPQ_EQUAL(&r, temp, SPEX_2D(b2, i, j, mpq)); if (r == 0) { - // This can "never" happen. - fprintf (stderr, "ERROR! Solution is wrong. This is a bug;" - "please contact the authors of SPEX.\n"); - SPEX_TRY (SPEX_PANIC) ; + //printf("ERROR\n"); + info = SPEX_PANIC; + j = b->n; + break; } } } + //-------------------------------------------------------------------------- + // Print info + //-------------------------------------------------------------------------- + + int pr = SPEX_OPTION_PRINT_LEVEL (option); + if (info == SPEX_OK) + { + SPEX_PR1 ("Solution is verified to be exact.\n"); + } + else if (info == SPEX_PANIC) + { + // This can never happen. + SPEX_PR1 ("ERROR! Solution is wrong. This is a bug; please " + "contact the authors of SPEX.\n"); + } + //-------------------------------------------------------------------------- // Free memory //-------------------------------------------------------------------------- FREE_WORKSPACE ; - return SPEX_OK ; + return info; } - diff --git a/SPEX/Demo/Utilities/spex_demo_determine_error.c b/SPEX/Demo/Utilities/spex_demo_determine_error.c index d11d518c..3cc1d980 100644 --- a/SPEX/Demo/Utilities/spex_demo_determine_error.c +++ b/SPEX/Demo/Utilities/spex_demo_determine_error.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// Demo/spex_determine_error: auxiliary file for user demos +// Demo/spex_determine_error: auxiliary file for test coverage (tcov) //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -14,24 +14,22 @@ #include "spex_demos.h" + void spex_demo_determine_error ( - SPEX_info info, - int line, - char *file + SPEX_info ok ) { - if (info == SPEX_OUT_OF_MEMORY) + if (ok == SPEX_OUT_OF_MEMORY) { - printf("\nSPEX: Out of memory\n"); + printf("\nOut of memory\n"); } - else if (info == SPEX_SINGULAR) + else if (ok == SPEX_SINGULAR) { - printf("\nSPEX: Input matrix is singular OR no diagonal pivot. Please ensure input is SPD\n"); + printf("\nInput matrix is singular OR no diagonal pivot. Please ensure input is SPD\n"); } - else if (info == SPEX_INCORRECT_INPUT) + else if (ok == SPEX_INCORRECT_INPUT) { - printf("\nSPEX: Incorrect input for a SPEX_Chol Function\n"); + printf("\nIncorrect input for a SPEX_Chol Function\n"); } - printf ("line %d, file: %s\n", line, file) ; } diff --git a/SPEX/Demo/Utilities/spex_demo_process_command_line.c b/SPEX/Demo/Utilities/spex_demo_process_command_line.c index 84b8de43..c05bcf25 100644 --- a/SPEX/Demo/Utilities/spex_demo_process_command_line.c +++ b/SPEX/Demo/Utilities/spex_demo_process_command_line.c @@ -2,8 +2,8 @@ // Demo/spex_process_command_line: processes command line for user specified options //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Demo/Utilities/spex_demo_read_dense.c b/SPEX/Demo/Utilities/spex_demo_read_dense.c index 2bd6d59c..19faff8a 100644 --- a/SPEX/Demo/Utilities/spex_demo_read_dense.c +++ b/SPEX/Demo/Utilities/spex_demo_read_dense.c @@ -2,8 +2,8 @@ // Demo/spex_read_dense: reads an integral dense matrix //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Demo/Utilities/spex_demo_tripread.c b/SPEX/Demo/Utilities/spex_demo_tripread.c index 363937e0..eb8bd8cd 100644 --- a/SPEX/Demo/Utilities/spex_demo_tripread.c +++ b/SPEX/Demo/Utilities/spex_demo_tripread.c @@ -2,8 +2,8 @@ // Demo/spex_demo_tripread: reads a matrix stored in triplet format of a given type //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -27,16 +27,13 @@ SPEX_info spex_demo_tripread ( SPEX_matrix *A_handle, // Matrix to be populated FILE *file, // file to read from (must already be open) - SPEX_type C_type, // C->type: mpz_t or double + SPEX_type C_type, // C->type: mpz_t or double SPEX_options option ) { SPEX_info info ; - - if (A_handle == NULL || file == NULL) - { - return (SPEX_INCORRECT_INPUT) ; - } + ASSERT(A_handle!=NULL); + ASSERT(file!=NULL); (*A_handle) = NULL ; diff --git a/SPEX/Demo/spex_demo_backslash.c b/SPEX/Demo/spex_demo_backslash.c index 59e0ea70..50c3165b 100644 --- a/SPEX/Demo/spex_demo_backslash.c +++ b/SPEX/Demo/spex_demo_backslash.c @@ -2,29 +2,21 @@ // Demo/spex_demo_backslash: example of SPEX_Blackslash //------------------------------------------------------------------------------ -// SPEX: (c) 2021-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2021-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -// A demo of SPEX_Backslash in C + +/* A demo of SPEX_Backslash in C + */ # include "spex_demos.h" #define FREE_WORKSPACE \ { \ - if (mat_file != NULL) \ - { \ - fclose(mat_file); \ - } \ - mat_file = NULL ; \ - if (rhs_file != NULL) \ - { \ - fclose(rhs_file); \ - } \ - rhs_file = NULL ; \ SPEX_matrix_free(&A,NULL); \ SPEX_matrix_free(&b,NULL); \ SPEX_matrix_free(&x,NULL); \ @@ -33,32 +25,35 @@ SPEX_finalize(); \ } \ + int main( int argc, char *argv[] ) { - int64_t n = 0 ; - SPEX_matrix A = NULL; - SPEX_matrix b = NULL; - SPEX_matrix x = NULL; - SPEX_matrix x2 = NULL; - FILE *mat_file = NULL ; - FILE *rhs_file = NULL ; - SPEX_options option = NULL; - char *mat_name = NULL, *rhs_name = NULL; - int64_t rat = 1; - //-------------------------------------------------------------------------- // Prior to using SPEX, its environment must be initialized. This is done // by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- + SPEX_initialize(); - SPEX_TRY (SPEX_initialize ( )) ; + //-------------------------------------------------------------------------- + // Declare memory & Process Command Line + //-------------------------------------------------------------------------- + int64_t n = 0, ok; + + SPEX_matrix A = NULL; + SPEX_matrix b = NULL; + SPEX_matrix x = NULL; + SPEX_matrix x2 = NULL; // Set default options - SPEX_TRY (SPEX_create_default_options(&option)); + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); + + char *mat_name = NULL, *rhs_name = NULL; + int64_t rat = 1; // Process the command line - SPEX_TRY (spex_demo_process_command_line(argc, argv, option, + DEMO_OK(spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -66,33 +61,31 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- // Read in A - mat_file = fopen(mat_name,"r"); + FILE *mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } // Note, there are a few matrices in BasisLIB that dont fit in double // Need to use the other tripread for those. - SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); - mat_file = NULL ; n = A->n; // Read in b. The output of this demo function is b in dense format with // mpz_t entries - rhs_file = fopen(rhs_name,"r"); + FILE *rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); - rhs_file = NULL ; //-------------------------------------------------------------------------- // Solve Ax = b @@ -101,31 +94,30 @@ int main( int argc, char *argv[] ) printf("solving Ax=b ...\n"); fflush (stdout); fflush (stderr); - double start = SuiteSparse_time (); + clock_t start = clock(); option->print_level = 0; - SPEX_TRY ( SPEX_backslash(&x, SPEX_MPQ, A, b, option)); + DEMO_OK( SPEX_backslash(&x, SPEX_MPQ, A, b, option)); - double end = SuiteSparse_time (); + clock_t end = clock(); - double t_tot = (end - start) ; + double t_tot = (double) (end - start) / CLOCKS_PER_SEC; printf("\nSPEX Backslash Factor & Solve time: %lf\n", t_tot); option->print_level=1; - SPEX_TRY ( spex_demo_check_solution(A,x,b,option)); + DEMO_OK( spex_demo_check_solution(A,x,b,option)); // x2 is a copy of the solution. x2 is a dense matrix with double entries // Note: roundoff will have occured in converting the exact solution // to the double x. - SPEX_TRY ( SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option)); + DEMO_OK ( SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option)); //-------------------------------------------------------------------------- // Free Memory //-------------------------------------------------------------------------- FREE_WORKSPACE; - return (0) ; } diff --git a/SPEX/Demo/spex_demo_cholesky_extended.c b/SPEX/Demo/spex_demo_cholesky_extended.c index abe4595c..742d7ccb 100644 --- a/SPEX/Demo/spex_demo_cholesky_extended.c +++ b/SPEX/Demo/spex_demo_cholesky_extended.c @@ -2,27 +2,18 @@ // Demo/spex_demo_cholesky_extended: example of extended call of SPEX_Cholesky //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ + #include "spex_demos.h" #define FREE_WORKSPACE \ { \ - if (mat_file != NULL) \ - { \ - fclose(mat_file); \ - } \ - mat_file = NULL ; \ - if (rhs_file != NULL) \ - { \ - fclose(rhs_file); \ - } \ - rhs_file = NULL ; \ SPEX_matrix_free(&A,NULL); \ SPEX_matrix_free(&b,NULL); \ SPEX_matrix_free(&x,NULL); \ @@ -35,30 +26,33 @@ int main( int argc, char *argv[] ) { - int64_t n = 0 ; + //-------------------------------------------------------------------------- + // Prior to using SPEX-Chol, its environment must be initialized. This is + // done by calling the SPEX_initialize() function. + //-------------------------------------------------------------------------- + + SPEX_initialize(); + + //-------------------------------------------------------------------------- + // Declare memory & Process Command Line + //-------------------------------------------------------------------------- + int64_t n = 0, ok; + SPEX_symbolic_analysis S = NULL; SPEX_factorization F = NULL ; SPEX_matrix A = NULL; SPEX_matrix b = NULL; SPEX_matrix x = NULL; - FILE *mat_file = NULL ; - FILE *rhs_file = NULL; + char *mat_name, *rhs_name; int64_t rat = 1; - SPEX_options option = NULL; - - //-------------------------------------------------------------------------- - // Prior to using SPEX-Chol, its environment must be initialized. This is - // done by calling the SPEX_initialize() function. - //-------------------------------------------------------------------------- - - SPEX_TRY (SPEX_initialize ( )) ; // Default options. - SPEX_TRY (SPEX_create_default_options(&option)); + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); // Process the command line - SPEX_TRY (spex_demo_process_command_line(argc, argv, option, + DEMO_OK(spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -66,96 +60,93 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- // Read in A - mat_file = fopen(mat_name,"r"); + FILE *mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); fclose(mat_file); - mat_file = NULL ; n = A->n; // For this code, we utilize a vector of all ones as the RHS vector - SPEX_TRY (SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, - true, option)); + SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, true, + option); // Read in b. The output of this demo function is b in dense format with // mpz_t entries - rhs_file = fopen(rhs_name,"r"); + FILE *rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); - rhs_file = NULL ; //-------------------------------------------------------------------------- // Perform Analysis of A //-------------------------------------------------------------------------- - double start_col = SuiteSparse_time (); + clock_t start_col = clock(); // Symmetric ordering of A. Uncomment the desired one, AMD is recommended //option->order = SPEX_NO_ORDERING; // No ordering option->order = SPEX_AMD; // AMD //option->order = SPEX_COLAMD; // COLAMD - SPEX_TRY (SPEX_cholesky_analyze(&S, A, option)); + DEMO_OK(SPEX_cholesky_analyze(&S, A, option)); - double end_col = SuiteSparse_time (); + clock_t end_col = clock(); //-------------------------------------------------------------------------- // Factorize PAP //-------------------------------------------------------------------------- //option->algo=SPEX_CHOL_LEFT; - double start_factor = SuiteSparse_time (); + clock_t start_factor = clock(); - SPEX_TRY ( SPEX_cholesky_factorize(&F, A, S, option)); + DEMO_OK( SPEX_cholesky_factorize(&F, A, S, option)); - double end_factor = SuiteSparse_time (); + clock_t end_factor = clock(); option->print_level=3; - //SPEX_TRY (SPEX_matrix_check(F->L,option)); + //DEMO_OK(SPEX_matrix_check(F->L,option)); //-------------------------------------------------------------------------- // Solve linear system //-------------------------------------------------------------------------- - double start_solve = SuiteSparse_time (); + clock_t start_solve = clock(); - SPEX_TRY ( SPEX_cholesky_solve(&x, F, b, option)); + DEMO_OK( SPEX_cholesky_solve(&x, F, b, option)); - double end_solve = SuiteSparse_time (); + clock_t end_solve = clock(); //-------------------------------------------------------------------------- // Output & Timing Stats //-------------------------------------------------------------------------- - double t_col = (end_col-start_col) ; - double t_factor = (end_factor - start_factor) ; - double t_solve = (end_solve - start_solve) ; + double t_col = (double) (end_col-start_col)/CLOCKS_PER_SEC; + double t_factor = (double) (end_factor - start_factor) / CLOCKS_PER_SEC; + double t_solve = (double) (end_solve - start_solve) / CLOCKS_PER_SEC; - printf("\nNumber of L nonzeros: \t\t\t%g", - (double) (F->L->p[F->L->n]) ); + printf("\nNumber of L nonzeros: \t\t\t%ld", + (F->L->p[F->L->n]) ); printf("\nSymbolic Analysis Check time: \t\t%lf", t_col); printf("\nIP Chol Factorization time: \t\t%lf", t_factor); printf("\nFB Substitution time: \t\t\t%lf\n\n", t_solve); // Check solution option->print_level=1; - // SPEX_TRY ( SPEX_check_solution(A,x,b,option)); + //DEMO_OK ( SPEX_check_solution(A,x,b,option)); //-------------------------------------------------------------------------- // Free Memory //-------------------------------------------------------------------------- FREE_WORKSPACE; - return (0) ; } diff --git a/SPEX/Demo/spex_demo_cholesky_simple.c b/SPEX/Demo/spex_demo_cholesky_simple.c index 4652358e..5e35dc15 100644 --- a/SPEX/Demo/spex_demo_cholesky_simple.c +++ b/SPEX/Demo/spex_demo_cholesky_simple.c @@ -2,62 +2,47 @@ // Demo/spex_demo_cholesky_simple.c: example of simple call of SPEX_Cholesky //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -// This example shows how to use SPEX Chol with a given input matrix and a -// double output. The input is read from a file. +/* This example shows how to use SPEX Chol with a given input matrix and a + * double output. The input is read from a file */ + +// usage: +// example > out +// out is file for output calculated result #include "spex_demos.h" -#define FREE_WORKSPACE \ -{ \ - if (mat_file != NULL) \ - { \ - fclose(mat_file); \ - } \ - mat_file = NULL ; \ - if (rhs_file != NULL) \ - { \ - fclose(rhs_file); \ - } \ - rhs_file = NULL ; \ - SPEX_matrix_free(&A, option); \ - SPEX_matrix_free(&b, option); \ - SPEX_matrix_free(&x, option); \ - SPEX_matrix_free(&x2, option); \ - SPEX_FREE(option); \ - SPEX_finalize(); \ +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A, option); \ + SPEX_matrix_free(&b, option); \ + SPEX_matrix_free(&x, option); \ + SPEX_matrix_free(&x2, option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ } + int main (int argc, char **argv) { - - SPEX_matrix A = NULL ; // input matrix with mpz values - SPEX_matrix b = NULL ; // Right hand side vector - SPEX_matrix x = NULL ; // Solution vectors - SPEX_matrix x2 = NULL ; // copy of solution vectors - SPEX_options option = NULL; - FILE *mat_file = NULL; - FILE *rhs_file = NULL; - char *mat_name = NULL ; - char *rhs_name = NULL ; - //-------------------------------------------------------------------------- - // Prior to using SPEX, its environment must be initialized. This is + // Prior to using SPEX Chol, its environment must be initialized. This is // done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - - SPEX_TRY (SPEX_initialize ( )) ; + SPEX_initialize(); //-------------------------------------------------------------------------- // Get matrix file name //-------------------------------------------------------------------------- + char *mat_name; + char *rhs_name; //this is actually ignored and we're using a rhs of 1s int64_t rat = 1; if (argc > 2) { @@ -65,20 +50,25 @@ int main (int argc, char **argv) } //-------------------------------------------------------------------------- - // Get options and process the command line + // Declare our data structures //-------------------------------------------------------------------------- - - SPEX_TRY (SPEX_create_default_options(&option)); + SPEX_info ok; + SPEX_matrix A = NULL ; // input matrix with mpz values + SPEX_matrix b = NULL ; // Right hand side vector + SPEX_matrix x = NULL ; // Solution vectors + SPEX_matrix x2 = NULL ; // copy of solution vectors + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); if (option == NULL) { fprintf (stderr, "Error! OUT of MEMORY!\n"); FREE_WORKSPACE; - return (1) ; + return 0; } option->order = SPEX_AMD; //AMD is default for Cholesky - + // Process the command line - SPEX_TRY (spex_demo_process_command_line(argc, argv, option, + DEMO_OK(spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -87,34 +77,32 @@ int main (int argc, char **argv) // Read in A. The output of this demo function is A in CSC format with // double entries. - mat_file = fopen(mat_name,"r"); + FILE *mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - - SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); + + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); fclose(mat_file); - mat_file = NULL ; int64_t n = A->n; - SPEX_TRY (SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, - true, option) ); + SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, true, + option); // Read in b. The output of this demo function is b in dense format with // mpz_t entries - rhs_file = fopen(rhs_name,"r"); + FILE *rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); - rhs_file = NULL; // Check if the size of A matches b if (A->n != b->m) @@ -122,37 +110,36 @@ int main (int argc, char **argv) printf("%"PRId64" %"PRId64" \n", A->m,b->m); fprintf (stderr, "Error! Size of A and b do not match!\n"); FREE_WORKSPACE; - return (1) ; + return 0; } - //-------------------------------------------------------------------------- // solve //-------------------------------------------------------------------------- - - double start_s = SuiteSparse_time (); + clock_t start_s = clock(); option->algo=SPEX_CHOL_LEFT; - SPEX_TRY (SPEX_cholesky_backslash( &x, SPEX_MPQ, A, b, option)); + DEMO_OK(SPEX_cholesky_backslash( &x, SPEX_MPQ, A, b, option)); - double end_s = SuiteSparse_time (); + clock_t end_s = clock(); - double t_s = (end_s - start_s) ; + double t_s = (double) (end_s - start_s) / CLOCKS_PER_SEC; printf("\nSPEX Chol Factor & Solve time: %lf\n", t_s); // x2 is a copy of the solution. x2 is a dense matrix with mpfr entries - SPEX_TRY ( SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option)); + DEMO_OK ( SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option)); // check solution option->print_level=1; - SPEX_TRY ( spex_demo_check_solution(A,x,b,option)); + DEMO_OK ( spex_demo_check_solution(A,x,b,option)); //-------------------------------------------------------------------------- // Free memory //-------------------------------------------------------------------------- - FREE_WORKSPACE; + printf ("\n%s: all tests passed\n\n", __FILE__); - return (0) ; + + return 0; } diff --git a/SPEX/Demo/spex_demo_lu_doub.c b/SPEX/Demo/spex_demo_lu_doub.c index fbe973bd..84856671 100644 --- a/SPEX/Demo/spex_demo_lu_doub.c +++ b/SPEX/Demo/spex_demo_lu_doub.c @@ -2,26 +2,31 @@ // Demo/spex_demo_lu_doub.c: example of simple SPEX_LU call on a double matrix //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ +/* This program will exactly solve the sparse linear system Ax = b by + * performing the SPEX Left LU factorization. This is intended to be a + * demonstration of the "advanced interface" of SPEX Left LU. Refer to + * README.txt for information on how to properly use this code + */ + // usage: -// spex_lu_demo_doub Followed by the listed args: +// spex_lu_demo Followed by the listed args: // -// f (or file) Filename. e.g., spex_lu_demo_doub f MATRIX_NAME RHS_NAME, which -// indicates spex_lu_demo_doub will read matrix from MATRIX_NAME and right hand -// side from RHS_NAME. The matrix must be stored in Matrix Market format. -// Refer to http://math.nist.gov/MatrixMarket/formats.html for information on -// Matrix Market format. The right hand side vector must be stored as a dense -// vector. +// f (or file) Filename. e.g., spex_lu_demo f MATRIX_NAME RHS_NAME, which +// indicates spex_lu_demo will read matrix from MATRIX_NAME and right hand side +// from RHS_NAME. The matrix must be stored in Matrix Market format. Refer to +// http://math.nist.gov/MatrixMarket/formats.html for information on Matrix +// Market format. The right hand side vector must be stored as a dense vector. // -// p (or piv) Pivot_param. e.g., spex_lu_demo_doub p 0, which indicates SPEX_LU -// will use smallest pivot for pivot scheme. Other available options are listed -// as follows: +// p (or piv) Pivot_param. e.g., spex_lu_demo p 0, which indicates SPEX_LU will +// use smallest pivot for pivot scheme. Other available options are listed as +// follows: // // 0: Smallest pivot: Default and recommended // 1: Diagonal pivoting @@ -30,57 +35,91 @@ // 4: Diagonal pivoting with tolerance for largest pivot // 5: Largest pivot // -// q (or col) Column_order_param. e.g., spex_lu_demo_doub q 1, which indicates +// q (or col) Column_order_param. e.g., spex_lu_demo q 1, which indicates // SPEX_LU will use COLAMD for column ordering. Other available options are: // // 0: None: Not recommended for sparse matrices 1: COLAMD: Default 2: // AMD // -// t (or tol) tolerance_param. e.g., spex_lu_demo_doub t 1e-10, which indicates +// t (or tol) tolerance_param. e.g., spex_lu_demo t 1e-10, which indicates // SPEX_LU will use 1e-10 as the tolerance for pivot scheme 3 and 4 mentioned // above. Therefore, it is only necessary if pivot scheme 3 or 4 is used. // -// o (or out). e.g., spex_lu_demo_doub o 1, which indicates SPEX_LU will output -// the errors and warnings during the process. Other available options are: 0: +// o (or out). e.g., spex_lu_demo o 1, which indicates SPEX_LU will output the +// errors and warnings during the process. Other available options are: 0: // print nothing 1: just errors and warnings: Default 2: terse, with basic // stats from COLAMD/AMD and SPEX and solution +// +// If none of the above args is given, they are set to the following default: +// #include "spex_demos.h" -#define FREE_WORKSPACE \ -{ \ - if (mat_file != NULL) \ - { \ - fclose(mat_file); \ - } \ - mat_file = NULL ; \ - SPEX_matrix_free(&A, option); \ - SPEX_factorization_free(&F, option); \ - SPEX_symbolic_analysis_free(&S, option); \ - SPEX_FREE(option); \ - SPEX_finalize(); \ +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A, option); \ + SPEX_factorization_free(&F, option); \ + SPEX_symbolic_analysis_free(&S, option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ } int main (int argc, char *argv[]) { - SPEX_matrix A = NULL; - SPEX_symbolic_analysis S = NULL; - SPEX_factorization F = NULL; - FILE *mat_file = NULL; - SPEX_options option = NULL; - char *mat_name = NULL, *rhs_name = NULL; - int64_t rat = 1; - //-------------------------------------------------------------------------- // Prior to using SPEX Left LU, its environment must be initialized. This // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_TRY (SPEX_initialize ( )) ; + SPEX_initialize(); + + //-------------------------------------------------------------------------- + // We first initialize the default parameters. These parameters are modified + // either via command line arguments or when reading in data. The important + // initializations are in the block below. + // + // First, we initialize 6 SPEX_matrices. Note that these matrices must + // simply be declared, they will be created and allocated within their + // respective functions. These matrices are: + // + // A: User input matrix. Must be SPEX_CSC and SPEX_MPZ for routines + // + // L: Lower triangular matrix. Will be output as SPEX_CSC and SPEX_MPZ + // + // U: Upper triangular matrix. Will be output as SPEX_CSC and SPEX_MPZ + // + // x: Solution to the linear system. Will be output as SPEX_DENSE and + // SPEX_MPQ + // + // b: Set of right hand side vectors. Must be SPEX_DENSE and SPEX_MPZ + // + // Additionally, two other data structures are declared here: + // + // pinv: Inverse row permutation used for LDU factorization and + // permutation + // + // S: Symbolic analysis struct. + // + // Lastly, the following parameter is created: + // + // option: Command options for the factorization. In general, this can be + // set to default values and is almost always the last input + // argument for SPEX Left LU functions (except SPEX_malloc and + // such) + //-------------------------------------------------------------------------- + SPEX_matrix A = NULL; + SPEX_symbolic_analysis S = NULL; + SPEX_factorization F = NULL; + SPEX_info ok ; // Initialize option, command options for the factorization - SPEX_TRY (SPEX_create_default_options(&option)); + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); + + // Extra parameters used to obtain A, b, etc + char *mat_name, *rhs_name; + int64_t rat = 1; //-------------------------------------------------------------------------- // After initializing memory, we process the command line for this function. @@ -89,38 +128,67 @@ int main (int argc, char *argv[]) // option->order = SPEX_AMD. //-------------------------------------------------------------------------- - SPEX_TRY (spex_demo_process_command_line(argc, argv, option, + DEMO_OK(spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- - // Read in A + // In this demo file, we now read in the A and b matrices from external + // files. Refer to the example.c file or the user guide for other + // methods of creating the input matrix. In general, the user can create + // his/her matrix (say in double form) and then create a copy of it with + // SPEX_matrix_copy //-------------------------------------------------------------------------- - mat_file = fopen(mat_name,"r"); + // Read in A + FILE *mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); fclose(mat_file); - mat_file = NULL ; + +#if 0 + // Read in right hand side + FILE *rhs_file = fopen(rhs_name,"r"); + if( rhs_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + DEMO_OK(SPEX_read_dense(&b, rhs_file, option)); + fclose(rhs_file); + + // Check if the size of A matches b + if (A->n != b->m) + { + fprintf (stderr, "Error! Size of A and b do not match!\n"); + FREE_WORKSPACE; + return 0; + } +#endif //-------------------------------------------------------------------------- // We now perform symbolic analysis by getting the column preordering of // the matrix A. This is done via the SPEX_lu_analyze function. The output // of this function is a column permutation Q where we factor the matrix AQ // and an estimate of the number of nonzeros in L and U. + // + // Note that in the simple interface demostrated in the example*.c files, + // all of the following code is condensed into the single SPEX_backslash + // function. //-------------------------------------------------------------------------- - double start_col = SuiteSparse_time (); + clock_t start_col = clock(); // Column ordering using either AMD, COLAMD or nothing - SPEX_TRY (SPEX_lu_analyze(&S, A, option)); + DEMO_OK(SPEX_lu_analyze(&S, A, option)); - double end_col = SuiteSparse_time (); + clock_t end_col = clock(); //-------------------------------------------------------------------------- // Now we perform the SPEX Left LU factorization to obtain matrices L and U @@ -128,19 +196,27 @@ int main (int argc, char *argv[]) // never explicitly constructed or used. //-------------------------------------------------------------------------- - double start_factor = SuiteSparse_time (); + clock_t start_factor = clock(); - SPEX_TRY (SPEX_lu_factorize(&F, A, S, option)); + ok = SPEX_lu_factorize(&F, A, S, option); + if (ok != SPEX_OK) + { + if (ok == SPEX_SINGULAR) + { + printf("\nSingular"); + } + return 0; + } - double end_factor = SuiteSparse_time (); + clock_t end_factor = clock(); //-------------------------------------------------------------------------- - // print results + // We now solve the system Ax=b using the L and U factors computed above. //-------------------------------------------------------------------------- // Timing stats - double t_sym = (end_col-start_col) ; - double t_factor = (end_factor - start_factor) ; + double t_sym = (double) (end_col-start_col)/CLOCKS_PER_SEC; + double t_factor = (double) (end_factor - start_factor) / CLOCKS_PER_SEC; printf("\nNumber of L+U nonzeros: \t\t%"PRId64, (F->L->p[F->L->n]) + (F->U->p[F->U->n]) - (F->L->m)); @@ -153,6 +229,6 @@ int main (int argc, char *argv[]) FREE_WORKSPACE; printf ("\n%s: all tests passed\n\n", __FILE__); - return (0) ; + return 0; } diff --git a/SPEX/Demo/spex_demo_lu_extended.c b/SPEX/Demo/spex_demo_lu_extended.c index 7502b6c2..d8ebe587 100644 --- a/SPEX/Demo/spex_demo_lu_extended.c +++ b/SPEX/Demo/spex_demo_lu_extended.c @@ -1,32 +1,32 @@ //------------------------------------------------------------------------------ -// Demo/spex_demo_lu_extended.c: extended SPEX_LU example for a double matrix +// Demo/spex_demo_lu_extended.c: example of extended SPEX_LU call for a double matrix. //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -// This program will exactly solve the sparse linear system Ax = b by -// performing the SPEX Left LU factorization. This is intended to be a -// demonstration of the "advanced interface" of SPEX Left LU. Refer to -// README.txt for information on how to properly use this code +/* This program will exactly solve the sparse linear system Ax = b by + * performing the SPEX Left LU factorization. This is intended to be a + * demonstration of the "advanced interface" of SPEX Left LU. Refer to + * README.txt for information on how to properly use this code + */ // usage: -// spex_demo_lu_extended Followed by the listed args: +// spexlu_demo Followed by the listed args: // -// f (or file) Filename. e.g., spex_demo_lu_extended f MATRIX_NAME RHS_NAME, -// which indicates spex_demo_lu_extended will read matrix from MATRIX_NAME and -// right hand side from RHS_NAME. The matrix must be stored in Matrix Market -// format. Refer to http://math.nist.gov/MatrixMarket/formats.html for -// information on Matrix Market format. The right hand side vector must be -// stored as a dense vector. +// f (or file) Filename. e.g., spex_lu_demo f MATRIX_NAME RHS_NAME, which +// indicates spex_lu_demo will read matrix from MATRIX_NAME and right hand side +// from RHS_NAME. The matrix must be stored in Matrix Market format. Refer to +// http://math.nist.gov/MatrixMarket/formats.html for information on Matrix +// Market format. The right hand side vector must be stored as a dense vector. // -// p (or piv) Pivot_param. e.g., spex_demo_lu_extended p 0, which indicates -// SPEX_LU will use smallest pivot for pivot scheme. Other available options -// are listed as follows: +// p (or piv) Pivot_param. e.g., spex_lu_demo p 0, which indicates SPEX_LU will +// use smallest pivot for pivot scheme. Other available options are listed as +// follows: // // 0: Smallest pivot: Default and recommended // 1: Diagonal pivoting @@ -35,23 +35,20 @@ // 4: Diagonal pivoting with tolerance for largest pivot // 5: Largest pivot // -// q (or col) Column_order_param. e.g., spex_demo_lu_extended q 1, which -// indicates SPEX_LU will use COLAMD for column ordering. Other available -// options are: +// q (or col) Column_order_param. e.g., spex_lu_demo q 1, which indicates +// SPEX_LU will use COLAMD for column ordering. Other available options are: // // 0: Default: COLAMD // 1: None: Not recommended for sparse matrices // 2: COLAMD // 3: AMD // -// t (or tol) tolerance_param. e.g., spex_demo_lu_extended t 1e-10, which -// indicates SPEX_LU will use 1e-10 as the tolerance for pivot scheme 3 and 4 -// mentioned above. Therefore, it is only necessary if pivot scheme 3 or 4 is -// used. +// t (or tol) tolerance_param. e.g., spex_lu_demo t 1e-10, which indicates +// SPEX_LU will use 1e-10 as the tolerance for pivot scheme 3 and 4 mentioned +// above. Therefore, it is only necessary if pivot scheme 3 or 4 is used. // -// o (or out). e.g., spex_demo_lu_extended o 1, which indicates SPEX_LU will -// output the errors and warnings during the process. Other available options -// are: +// o (or out). e.g., spex_lu_demo o 1, which indicates SPEX_LU will output the +// errors and warnings during the process. Other available options are: // // 0: print nothing // 1: just errors and warnings: Default @@ -60,55 +57,33 @@ // // If none of the above args is given, they are set to the following default: // + // p = 0, i.e., using smallest pivot // q = 1, i.e., using COLAMD // t = 0.1, not being using since p != 3 or 4 #include "spex_demos.h" -#define FREE_WORKSPACE \ -{ \ - if (mat_file != NULL) \ - { \ - fclose(mat_file); \ - } \ - mat_file = NULL ; \ - if (rhs_file != NULL) \ - { \ - fclose(rhs_file); \ - } \ - rhs_file = NULL ; \ - SPEX_matrix_free(&A, option); \ - SPEX_symbolic_analysis_free(&S, option); \ - SPEX_factorization_free(&F, option); \ - SPEX_matrix_free(&x, option); \ - SPEX_matrix_free(&b, option); \ - SPEX_FREE(option); \ - SPEX_finalize(); \ +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A, option); \ + SPEX_symbolic_analysis_free(&S, option); \ + SPEX_factorization_free(&F, option); \ + SPEX_matrix_free(&x, option); \ + SPEX_matrix_free(&b, option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ } int main (int argc, char *argv[]) { - SPEX_matrix A = NULL; - SPEX_symbolic_analysis S = NULL; - SPEX_factorization F = NULL; - SPEX_matrix x = NULL; - SPEX_matrix b = NULL; - FILE *rhs_file = NULL; - FILE *mat_file = NULL ; - SPEX_options option = NULL; - - // Extra parameters used to obtain A, b, etc - char *mat_name = NULL, *rhs_name = NULL; - int64_t rat=1; - //-------------------------------------------------------------------------- // Prior to using SPEX Left LU, its environment must be initialized. This // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_TRY (SPEX_initialize ( )) ; + SPEX_initialize(); //-------------------------------------------------------------------------- // We first initialize the default parameters. These parameters are modified @@ -144,11 +119,23 @@ int main (int argc, char *argv[]) // argument for SPEX Left LU functions (except SPEX_malloc and // such) //-------------------------------------------------------------------------- + SPEX_matrix A = NULL; + SPEX_symbolic_analysis S = NULL; + SPEX_factorization F = NULL; + SPEX_matrix x = NULL; + SPEX_matrix b = NULL; + SPEX_info ok ; // Initialize option, command options for the factorization - SPEX_TRY (SPEX_create_default_options(&option)); + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); option->order=SPEX_NO_ORDERING; + // Extra parameters used to obtain A, b, etc + char *mat_name, *rhs_name; + int64_t rat=1; + + //-------------------------------------------------------------------------- // After initializing memory, we process the command line for this function. // Such a step is optional, a user can also manually set these parameters. @@ -156,7 +143,7 @@ int main (int argc, char *argv[]) // option->order = SPEX_AMD. //-------------------------------------------------------------------------- - SPEX_TRY (spex_demo_process_command_line(argc, argv, option, + DEMO_OK(spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -166,37 +153,34 @@ int main (int argc, char *argv[]) // his/her matrix (say in double form) and then create a copy of it with // SPEX_matrix_copy //-------------------------------------------------------------------------- - // Read in A - mat_file = fopen(mat_name,"r"); + FILE *mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); - mat_file = NULL ; // Read in right hand side - rhs_file = fopen(rhs_name,"r"); + FILE *rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); - rhs_file = NULL ; // Check if the size of A matches b if (A->n != b->m) { fprintf (stderr, "Error! Size of A and b do not match!\n"); FREE_WORKSPACE; - return (1) ; + return 0; } //-------------------------------------------------------------------------- @@ -210,12 +194,12 @@ int main (int argc, char *argv[]) // function. //-------------------------------------------------------------------------- - double start_col = SuiteSparse_time (); + clock_t start_col = clock(); // Column ordering using either AMD, COLAMD or nothing - SPEX_TRY (SPEX_lu_analyze(&S, A, option)); + DEMO_OK(SPEX_lu_analyze(&S, A, option)); - double end_col = SuiteSparse_time (); + clock_t end_col = clock(); //-------------------------------------------------------------------------- // Now we perform the SPEX Left LU factorization to obtain matrices L and U @@ -223,17 +207,17 @@ int main (int argc, char *argv[]) // never explicitly constructed or used. //-------------------------------------------------------------------------- - double start_factor = SuiteSparse_time (); + clock_t start_factor = clock(); - SPEX_TRY (SPEX_lu_factorize(&F, A, S, option)); + DEMO_OK(SPEX_lu_factorize(&F, A, S, option)); - double end_factor = SuiteSparse_time (); + clock_t end_factor = clock(); //-------------------------------------------------------------------------- // We now solve the system Ax=b using the L and U factors computed above. //-------------------------------------------------------------------------- - double start_solve = SuiteSparse_time (); + clock_t start_solve = clock(); // SPEX Left LU has an optional check step which can verify that the // solution vector x satisfies Ax=b in perfect precision intended for @@ -251,9 +235,9 @@ int main (int argc, char *argv[]) //option->check = true; // Solve LDU x = b - SPEX_TRY (SPEX_lu_solve(&x, F, b, option)); + DEMO_OK(SPEX_lu_solve(&x, F, b, option)); - double end_solve = SuiteSparse_time (); + clock_t end_solve = clock(); // Done, x now contains the exact solution of the linear system Ax=b in // dense rational form. There is an optional final step here where the user @@ -270,9 +254,9 @@ int main (int argc, char *argv[]) // SPEX_matrix_copy( &my_x, my_kind, my_type, x, option); // Timing stats - double t_sym = (end_col-start_col) ; - double t_factor = (end_factor - start_factor) ; - double t_solve = (end_solve - start_solve) ; + double t_sym = (double) (end_col-start_col)/CLOCKS_PER_SEC; + double t_factor = (double) (end_factor - start_factor) / CLOCKS_PER_SEC; + double t_solve = (double) (end_solve - start_solve) / CLOCKS_PER_SEC; printf("\nNumber of L+U nonzeros: \t\t%"PRId64, (F->L->p[F->L->n]) + (F->U->p[F->U->n]) - (F->L->m)); @@ -285,7 +269,8 @@ int main (int argc, char *argv[]) //-------------------------------------------------------------------------- FREE_WORKSPACE; - fprintf (stderr, "%s: all tests passed\n\n", __FILE__); - return (0) ; + printf ("\n%s: all tests passed\n\n", __FILE__); + //fprintf (stderr, "%s: all tests passed\n\n", __FILE__); + return 0; } diff --git a/SPEX/Demo/spex_demo_lu_simple1.c b/SPEX/Demo/spex_demo_lu_simple1.c index 7e8f654a..c294a442 100644 --- a/SPEX/Demo/spex_demo_lu_simple1.c +++ b/SPEX/Demo/spex_demo_lu_simple1.c @@ -1,16 +1,16 @@ //------------------------------------------------------------------------------ -// Demo/spex_demo_lu_simple1.c: simple SPEX_LU example with a random matrix +// Demo/example.c: example of simple SPEX_LU call using as input a random matrix //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -// This example shows how to use SPEX Left LU with a given input matrix and a -// double output. The input is a randomly generate dense matrix. +/* This example shows how to use SPEX Left LU with a given input matrix and a + * double output. The input is a randomly generate dense matrix */ // usage: // example > out @@ -18,40 +18,39 @@ #include "spex_demos.h" -#define FREE_WORKSPACE \ -{ \ - SPEX_matrix_free(&A,option); \ - SPEX_matrix_free(&x,option); \ - SPEX_matrix_free(&b,option); \ - SPEX_matrix_free(&Rb,option); \ - SPEX_matrix_free(&R,option); \ - SPEX_FREE(option); \ - SPEX_finalize(); \ +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A,option); \ + SPEX_matrix_free(&x,option); \ + SPEX_matrix_free(&b,option); \ + SPEX_matrix_free(&Rb,option); \ + SPEX_matrix_free(&R,option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ } int main (void) { - int64_t n = 50, nz = 2500, num=0; - SPEX_matrix A = NULL ; // input matrix - SPEX_matrix R = NULL ; // Random matrix to create A - SPEX_matrix Rb = NULL; // Random matrix to create b - SPEX_matrix b = NULL ; // Right hand side vector - SPEX_matrix x = NULL ; // Solution vectors - SPEX_options option = NULL; - //-------------------------------------------------------------------------- // Prior to using SPEX Left LU, its environment must be initialized. This // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_TRY (SPEX_initialize ( )) ; + SPEX_info ok = SPEX_initialize(); //-------------------------------------------------------------------------- // Declare and initialize essential variables //-------------------------------------------------------------------------- - SPEX_TRY (SPEX_create_default_options(&option)); + int64_t n = 50, nz = 2500, num=0; + SPEX_matrix A = NULL ; // input matrix + SPEX_matrix R = NULL ; // Random matrix to create A + SPEX_matrix Rb = NULL; // Random matrix to create b + SPEX_matrix b = NULL ; // Right hand side vector + SPEX_matrix x = NULL ; // Solution vectors + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); //-------------------------------------------------------------------------- // Generate a random dense 50*50 matrix @@ -62,12 +61,12 @@ int main (void) // A->j, and A->x are calloc'd. The second boolean parameter is meaningless // for FP64 matrices, but it tells SPEX Left LU to allocate the values of // A->x for the mpz_t, mpq_t, and mpfr_t entries - SPEX_TRY (SPEX_matrix_allocate(&R, SPEX_TRIPLET, SPEX_FP64, n, n, nz, - false, true, option)) ; + SPEX_matrix_allocate(&R, SPEX_TRIPLET, SPEX_FP64, n, n, nz, + false, true, option); // Rb is a n*1 dense matrix whose entries are FP64 - SPEX_TRY (SPEX_matrix_allocate(&Rb, SPEX_DENSE, SPEX_FP64, n, 1, n, - false, true, option)); + SPEX_matrix_allocate(&Rb, SPEX_DENSE, SPEX_FP64, n, 1, n, + false, true, option); // Randomly generate the input unsigned int seed = 10; @@ -91,22 +90,22 @@ int main (void) //-------------------------------------------------------------------------- // A is a copy of the R matrix. A is a CSC matrix with mpz_t entries - SPEX_TRY ( SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, R, option)); + DEMO_OK ( SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, R, option)); // b is a copy of the Rb matrix. b is dense with mpz_t entries. - SPEX_TRY ( SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, Rb, option)); + DEMO_OK ( SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, Rb, option)); //-------------------------------------------------------------------------- // Solve //-------------------------------------------------------------------------- - double start_s = SuiteSparse_time (); + clock_t start_s = clock(); // Solve the system and give double solution - SPEX_TRY (SPEX_lu_backslash( &x, SPEX_FP64, A, b, option)); + DEMO_OK(SPEX_lu_backslash( &x, SPEX_FP64, A, b, option)); - double end_s = SuiteSparse_time (); + clock_t end_s = clock(); - double t_s = (end_s - start_s) ; + double t_s = (double) (end_s - start_s) / CLOCKS_PER_SEC; printf("\nSPEX Left LU Factor & Solve time: %lf\n", t_s); @@ -116,6 +115,6 @@ int main (void) FREE_WORKSPACE; printf ("\n%s: all tests passed\n\n", __FILE__); - return (0) ; + return 0; } diff --git a/SPEX/Demo/spex_demo_lu_simple2.c b/SPEX/Demo/spex_demo_lu_simple2.c index 219316dc..0042d0e1 100644 --- a/SPEX/Demo/spex_demo_lu_simple2.c +++ b/SPEX/Demo/spex_demo_lu_simple2.c @@ -2,8 +2,8 @@ // Demo/spex_demo_lu_simple2.c: example of simple SPEX_LU call for triplet format //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -15,27 +15,17 @@ // mpq_t precision // usage: -// spex_demo_lu_simple2 f mat_file rhs_file > out +// SPEX_LU_demo2 mat_file rhs_file > out // mat_file is the Matrix Market file containing the A matrix // rhs_file is a list of entries for right hand side dense matrix // if input file names are not specified, they are defaulted to // ../ExampleMats/10teams.mat and ../ExampleMats/10teams.v, respectively. -// out is the file for the output with the calculated result +// out is file for output calculated result #include "spex_demos.h" #define FREE_WORKSPACE \ { \ - if (mat_file != NULL) \ - { \ - fclose(mat_file); \ - } \ - mat_file = NULL ; \ - if (rhs_file != NULL) \ - { \ - fclose(rhs_file); \ - } \ - rhs_file = NULL ; \ SPEX_symbolic_analysis_free(&S, option); \ SPEX_matrix_free(&A, option); \ SPEX_FREE(option); \ @@ -46,40 +36,37 @@ int main (int argc, char **argv) { - - SPEX_matrix A = NULL ; // input matrix - SPEX_matrix b = NULL ; // Right hand side vector - SPEX_matrix x = NULL ; // Solution vectors - SPEX_symbolic_analysis S = NULL ; // Column permutation - SPEX_options option = NULL; - FILE *mat_file = NULL; - FILE *rhs_file = NULL; - char *mat_name = NULL, *rhs_name = NULL; - //-------------------------------------------------------------------------- // Prior to using SPEX Left LU, its environment must be initialized. This is // done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - - SPEX_TRY (SPEX_initialize ( )) ; + SPEX_initialize(); //-------------------------------------------------------------------------- // Get matrix and right hand side file names //-------------------------------------------------------------------------- + char *mat_name = NULL, *rhs_name = NULL; if (argc < 3) { perror ("usage: spex_demo_lu_simple2 matfile rhsfile"); - return (1) ; + return 0 ; } + mat_name = argv[1]; rhs_name = argv[2]; + //-------------------------------------------------------------------------- - // Get default options + // Declare our data structures //-------------------------------------------------------------------------- - - SPEX_TRY (SPEX_create_default_options(&option)); + SPEX_info ok; + SPEX_matrix A = NULL ; // input matrix + SPEX_matrix b = NULL ; // Right hand side vector + SPEX_matrix x = NULL ; // Solution vectors + SPEX_symbolic_analysis S = NULL ; // Column permutation + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); //-------------------------------------------------------------------------- // Allocate memory, read in A and b @@ -87,29 +74,27 @@ int main (int argc, char **argv) // Read in A. The output of this demo function is A in CSC format with // mpz_t entries. - mat_file = fopen(mat_name,"r"); + FILE *mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); - mat_file = NULL ; // Read in b. The output of this demo function is b in dense format with // mpz_t entries - rhs_file = fopen(rhs_name,"r"); + FILE *rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); - rhs_file = NULL ; // Check if the size of A matches b if (A->n != b->m) @@ -117,25 +102,25 @@ int main (int argc, char **argv) printf("%"PRId64" %"PRId64" \n", A->m,b->m); fprintf (stderr, "Error! Size of A and b do not match!\n"); FREE_WORKSPACE; - return (1) ; + return 0; } //-------------------------------------------------------------------------- // solve //-------------------------------------------------------------------------- - double start_s = SuiteSparse_time (); + clock_t start_s = clock(); // SPEX Left LU has an optional check, to enable it, one can set the // following parameter to be true. // option->check = true; // Solve the system and give MPQ solution - SPEX_TRY (SPEX_lu_backslash( &x, SPEX_MPQ, A, b, option)); + DEMO_OK(SPEX_lu_backslash( &x, SPEX_MPQ, A, b, option)); - double end_s = SuiteSparse_time (); + clock_t end_s = clock(); - double t_s = (end_s - start_s) ; + double t_s = (double) (end_s - start_s) / CLOCKS_PER_SEC; printf("\nSPEX Left LU Factor & Solve time: %lf\n", t_s); @@ -144,7 +129,8 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- FREE_WORKSPACE; + printf ("\n%s: all tests passed\n\n", __FILE__); - return (0) ; + return 0; } diff --git a/SPEX/Demo/spex_demo_threaded.c b/SPEX/Demo/spex_demo_threaded.c index 05753f2c..64eefa86 100644 --- a/SPEX/Demo/spex_demo_threaded.c +++ b/SPEX/Demo/spex_demo_threaded.c @@ -2,30 +2,21 @@ // Demo/spex_demo_threaded: example of SPEX_backslash with multiple threads //------------------------------------------------------------------------------ -// SPEX: (c) 2021-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2021-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -// A demo of SPEX_backslash in C: solving the same system with many different -// user threads, just to test user multithreading. +/* A demo of SPEX_backslash in C: solving the same system with many different + * user threads, just to test user multithreading. + */ # include "spex_demos.h" #define FREE_WORKSPACE \ { \ - if (mat_file != NULL) \ - { \ - fclose(mat_file); \ - } \ - mat_file = NULL ; \ - if (rhs_file != NULL) \ - { \ - fclose(rhs_file); \ - } \ - rhs_file = NULL ; \ SPEX_matrix_free(&A,NULL); \ SPEX_matrix_free(&b,NULL); \ SPEX_FREE(option); \ @@ -39,37 +30,29 @@ int main( int argc, char *argv[] ) { - int64_t n = 0 ; - SPEX_matrix A = NULL; - SPEX_matrix b = NULL; - SPEX_options option = NULL; - FILE *mat_file = NULL ; - FILE *rhs_file = NULL; - char *mat_name = NULL, *rhs_name = NULL; - int64_t rat = 1; - //-------------------------------------------------------------------------- // Prior to using SPEX, its environment must be initialized. This is done // by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - - #ifdef _OPENMP - printf ("spex_demo_threaded: with OpenMP\n") ; - #else - printf ("spex_demo_threaded: without OpenMP\n") ; - #endif - - SPEX_TRY (SPEX_initialize ( )) ; + SPEX_initialize(); //-------------------------------------------------------------------------- // Declare memory & Process Command Line //-------------------------------------------------------------------------- + int64_t n = 0, ok ; + + SPEX_matrix A = NULL; + SPEX_matrix b = NULL; // Set default options - SPEX_TRY (SPEX_create_default_options(&option)); + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); + + char *mat_name = NULL, *rhs_name = NULL; + int64_t rat = 1; // Process the command line - SPEX_TRY (spex_demo_process_command_line(argc, argv, option, + DEMO_OK(spex_demo_process_command_line(argc, argv, option, &mat_name, &rhs_name, &rat)); //-------------------------------------------------------------------------- @@ -77,34 +60,31 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- // Read in A - mat_file = fopen(mat_name,"r"); + FILE *mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } // Note, there are a few matrices in BasisLIB that dont fit in double // Need to use the other tripread for those. - SPEX_TRY (spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); - mat_file = NULL ; - n = A->n; // Read in b. The output of this demo function is b in dense format with // mpz_t entries - rhs_file = fopen(rhs_name,"r"); + FILE *rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; - return (1) ; + return 0; } - SPEX_TRY (spex_demo_read_dense(&b, rhs_file, option)); + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); - rhs_file = NULL ; //-------------------------------------------------------------------------- // Solve Ax = b @@ -133,10 +113,9 @@ int main( int argc, char *argv[] ) bool test_pass = true ; - int id ; #pragma omp parallel for num_threads(nthreads) schedule(static,1) \ reduction(&&:test_pass) - for (id = 0 ; id < nthreads ; id++) + for (int id = 0 ; id < nthreads ; id++) { SPEX_info info = SPEX_thread_initialize ( ) ; if (info != SPEX_OK) @@ -200,6 +179,5 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- FREE_WORKSPACE; - return (test_pass ? 0 : 1) ; } diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h index 8c7fef40..8d8a8473 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -2,32 +2,37 @@ // Demo/spex_demos.h: #include file the demo programs //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -#ifndef SPEX_DEMOS_H -#define SPEX_DEMOS_H #include "SPEX.h" +#include "spex_util_internal.h" +#include "spex_gmp.h" -// used by SPEX_TRY if an error occurs: -#define SPEX_CATCH(info) \ -{ \ - spex_demo_determine_error (info, __LINE__, __FILE__) ; \ - FREE_WORKSPACE ; \ - return (info) ; \ +#define DEMO_OK(method) \ +{ \ + ok = method ; \ + if (ok != SPEX_OK) \ + { \ + spex_demo_determine_error (ok) ; \ + FREE_WORKSPACE ; \ + return 0 ; \ + } \ } +#define SPEX_MIN(a,b) (((a) < (b)) ? (a) : (b)) + /* Purpose: This processes the command line for user specified options */ SPEX_info spex_demo_process_command_line //processes the command line ( int64_t argc, // number of command line arguments char *argv[], // set of command line arguments - SPEX_options option, // struct containing the command options + SPEX_options option, // struct containing the command options char **mat_name, // Name of the matrix to be read in char **rhs_name, // Name of the RHS vector to be read in int64_t *rat // data type of output solution. @@ -39,8 +44,8 @@ SPEX_info spex_demo_process_command_line //processes the command line */ SPEX_info spex_demo_tripread ( - SPEX_matrix *A_handle, // Matrix to be constructed - FILE *file, // file to read from (must already be open) + SPEX_matrix *A_handle, // Matrix to be constructed + FILE *file, // file to read from (must already be open) SPEX_type C_type, // C->type: mpz_t, mpq_t, mpfr_t, int64_t, or double SPEX_options option ) ; @@ -50,8 +55,8 @@ SPEX_info spex_demo_tripread */ SPEX_info spex_demo_tripread_double ( - SPEX_matrix *A_handle, // Matrix to be constructed - FILE *file, // file to read from (must already be open) + SPEX_matrix *A_handle, // Matrix to be constructed + FILE *file, // file to read from (must already be open) SPEX_options option ) ; @@ -60,29 +65,27 @@ SPEX_info spex_demo_tripread_double */ SPEX_info spex_demo_tripread_mpz ( - SPEX_matrix *A_handle, // Matrix to be constructed - FILE *file, // file to read from (must already be open) + SPEX_matrix *A_handle, // Matrix to be constructed + FILE *file, // file to read from (must already be open) SPEX_options option ) ; -/* Purpose: read a dense matrix. */ +/* Purpose: SPEX_read_dense: read a dense matrix. */ SPEX_info spex_demo_read_dense ( - SPEX_matrix *b_handle, // Matrix to be constructed - FILE *file, // file to read from (must already be open) + SPEX_matrix *b_handle, // Matrix to be constructed + FILE *file, // file to read from (must already be open) SPEX_options option ) ; -/* Purpose: Determine why a SPEX function failed +/* Purpose: Determine why a SPEX_Chol function failed */ void spex_demo_determine_error ( - SPEX_info info, - int line, - char *file + SPEX_info ok ); -// Purpose: check if a solution is correct + SPEX_info spex_demo_check_solution ( const SPEX_matrix A, // Input matrix @@ -90,6 +93,3 @@ SPEX_info spex_demo_check_solution const SPEX_matrix b, // Right hand side vectors const SPEX_options option // Command options ); - -#endif - diff --git a/SPEX/Doc/ChangeLog b/SPEX/Doc/ChangeLog index ee528f91..5fd8ae1b 100644 --- a/SPEX/Doc/ChangeLog +++ b/SPEX/Doc/ChangeLog @@ -1,19 +1,3 @@ -Mar 22, 2024: version 3.1.0 - - * major update to build system - * Added new methods to SPEX.h, available to the end user: - SPEX_TRY - SPEX_CATCH - SPEX_1D - SPEX_2D - SPEX_mpz_set_null - SPEX_mpq_set_null - SPEX_mpfr_set_null - SPEX_mpz_clear - SPEX_mpq_clear - SPEX_mpfr_clear - SPEX_mpfr_set_proc - Jul 26, 2023: version 3.0.0 * major change to the API: new SPEX_factorization and SPEX_symbolic_analysis diff --git a/SPEX/Doc/Makefile b/SPEX/Doc/Makefile index a210f9ee..2d933eea 100644 --- a/SPEX/Doc/Makefile +++ b/SPEX/Doc/Makefile @@ -2,8 +2,8 @@ # SPEX/Doc/Makefile #------------------------------------------------------------------------------- -# SPEX: (c) 2019-2024, Chris Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Doc/SPEX-3.0_UserGuide.pdf b/SPEX/Doc/SPEX-3.0_UserGuide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4495367fb5084c56ae30f481df8a4599292dbf6e GIT binary patch literal 416827 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ℑ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ǚ_eRp!5AJ)HjIrX`wEzC0xU(Y1yX!I!z*bYmy_8YZ6vw zHn~1e_L%MZS|;l45HABUytrh6YeBP zp~uNmC&%d)d%yn5-&1RMbf!R7l_Y3Q(@z$2cYEIDoR4=?ZNJ}6?x!nr>3ljr?>1Kh z-cyPeg0OzUQOev+?K}po#M=1uba>sp2K1}dF^p3nFy#rLb!+ zs95^Eo?Q(~FL=Gb2Pp7*Z%{v1e#oQ`;FDk{;J2Mo5S`{g&!7-D=MSC?C!;8t^5bin z7s$BS`9{jdQw$X24(bq^1vz4ze|pwyS*gLj4kqgh12d1q@l9J>h9SJs8^!#wONHzW9uCDa(tjtc|6(AJinjz(DNk<>eE|u zrxc4jE90(hG;Zo$1J3vwf(*_-i}Y5TN|n!|;OJi8sjal_RV2NMct0O>H%w&7FOt9g zgTHZ~C5~F$Lu9?-7pScBT8r1CUCmnAJzXb9gAb!-2S5=gU+_1#uD=9<0ya@sQC=E| z!j`|^(x>%Z(ddpsP^1EcS**Wxux!ksK)DI~LK5^<2pvVSf3nMuo8mB4&UG&xRXhaB zA?`IIBTjiDreSXZ!z3nMcf!up%cOKF3Gc)6qg*moMXg5dLno+I*_|8;2-73bZGnTC zd=ZR71j-)!O%hwI8GG-9e;z|5CRaBi?{6f^A=SHbYo+%b z<3OH%nU*u%1(uf-N0Z+cOs)cyZey3Uxx3sR{{F6!cY_$TeVGW;Ec^jMs9i;<{HO7j zAlCpT*&8{?Z}AjXz89d z1mZd2G4y1dzmDbMgf#*@AM;?3{Y~7IWu3?FX_Jrl9k8c*a!98-iPJp82P~dNc#tw? z2d7~6Oh~u&Wt|Zt3{hL>VjAg#`eBIns4<*&hY3nQW6F;Ipt5Uf-n0PnXvYC>s2%zB zRQu_c+-^xB?MOedX#AS|D81lXm9`NTkY|qx`oX|fS`5nrnT^mgA4MPxn`9WVZQ7gb zjh$CVv9M-`MLV*4L}sy&rqcDa7_fh27Kz{u)wi5q^-}<@?f^C05p~=NK2b)?Cthd^ zcFCX-UMD{k%0hy*_E}X`=i3J5X?=f?f|?!#{U4mYQ*>@+qScktk||~ z+qP}nwryK0$(OC~oO93r?zY=~sE2x}QM1*YHD;fE^wEFpX`aHc#~Ml7UZIrsQqKxO ztmqzw`ON4&~n0Qjo7}}G~)p0 z=NJGh-zWXIr{OfjN)WWTOA+ZM%wbex;Pz2eW4t1EWF7S$ipIVmx?&kRJ`Wk`99{ML zv%_XS87_ZJIJC}e?Y`=$M0AAL*v-gI;s;MGzdWG=Ct++J7yBWZ5rb7O_TokiRrHju zgOD=14AV4_QaqFt*oBQc*l!>$o*Hw`3nx^jLQaNtNvtsoJS(>PY&oOGhqN{0R2a=M z@E7gxg*}+~3mzm5UpnS>{lWy z)4IAiyxk3%{F)5N>WWxIC|#2+oeeqwBDF~qgIj4-K1V3&FO1Ik_(2iFL@ioDr>~zL+&EZTa(0u zHQ!(l=4i&60CAGXN_l`XmJMfd?8Ir8chNwTGND7 zRxWQ9Z9YhX@2mIxWwP3tdT@$vIbV9iH^~qO~B0Y;c_I!43{sCMB5$b( z7R9LU*Xk+NM9YkFL*h1FywuOK4LY&rBSm|aEmdYKHK&XV*(pV$0=$}i6pelb43QKJ zeNbf#{)kdiAb^zko(g=k)gxBF96>VBuqgXt=JAOzE+wPeoAY7_nC_tDvDk0G5>Z}G zm3dSnk&02I+emmFTk7bja7o_40ChvWDYwy3%3eY%k<`LRtC`?0MCq26wO`ZDfjXuO z-TF1K%O}4dg>iHn%~l^uCbdnZ2D6e+UoMFewS>c8=91E%S$nVg7Y8F&vDXf}1Y=Nj zsg*ItAR;wQjH&g7!sv@m42+VaTFKjntJ>2=<#xpGh!=>sNiM9eNI{ARljCaI+0_Bl z^0};XGa)BKF!VJ5t;jLqVZ$0GOZpwzm^|=dBM&-DI)Qf=b7@b?t=_~IBj)IAmU^~g zX5~W^9J_>&?I>>^HS$%$uM!TGgG{J4Ha0<9*`1G5|AYJGojq^oEf;=rbS3mr)@ zK18ozA7xD*nAs>nKc*mNCKFbiYtwq$(sU8L3@a|Hf+RN5^LZ2H$Mbwp{;4UZv-+Z` zGh4A%m)*y95Fw}7jss6-*csrW7p>D^+<{u_M zDpcC8Dx;nYHxMaWTbG`fy)5+shmAfaHf;_WO(J(}U2Fmxt6XmF9NQsL_FaiJd2_;k zmsPGxxXimK%gkN3UpX&+X}*Ac91n6@0S^j+q9N5|ZD9PIggK{3m+_9*!;klwphDyH zDpW^k4@7pxR7;~$k3eIXe>+u4b}w-HQjOw}uas)}j@lLosn}J+^yg3d!fnSh*M1Jr)n(5!HPbWw>%%Y8wKS^*KIdJVRUwbUtA`_Evx?_|-?0TR zxU704S7ZFl*NoPXt*onVTOZe@&It*L<3@-S;Da@HD1{Iauy0~VvKklB`8XnH?B{pu zdC%ik#=I;V?5~|_-pi!GdynEaNW*v-E>H;@egmGN0+c`g(~RrWII*4V>2LO{eQ!2_ zQI0x!aPP0&9MlBZ&z(Yh8^K;4K|9vkdB^nNb1B&v-py035KM^{rNk_X^@x#_JU0at z05ppp5fDth4zBB|Frd-ctY{HjJfB0=d9MLHvOtmSJCludwO#VzG+dkmZ;{Q62o5%^@OOL zP)0@Eu)+@s2h&fD$$g0{Q#@4{VZtov;A&8Cp0E(yPt8;XLiV-uxm9Yeb$q7VB_X94 z=V;A9khm|gp-ZyIhNR7@;Tz*jLOhv+i?xbAuenA$-?QiAKTUBkr;6{`y?+)9Fod@7 zoi>D>$Y?n6|FIv#N%Evrvfr{N7rcCL-2PsC3Fu1V&#)O{1qaf66w-_~iI>!_R`Z%6 z4A9ur!jk)RMqR_Q0P~D{G>csb;A@-gIp{=U+DE9SHW-{X?# z&#$fJ?%XND!q}WC&W>HT$KKCvKq^~M<)V)gN~8DpA@{_GP)>ZdlUnM>T`xn~LW8-k z+Lceax>6>1WkXbB>OuZCwYQNG+%Au$e@*9v?ZAM!GpqRAn3$rQ!+J zzsjwvaH7x}360Vk4{7~}5biCt^qX=D0cIf&?RJ*x5_<~Snh-9c$0`+Mo>957y_zf| z|J*bmdhk|vVYhq3c-w3Gv@E<o}2;>Mp-BZ!q7*Db~~8tR?4B={`r@qCEH3Or05} zCfWgehDaR$0_YGDb^Z&t+iNKLJZ{c@$g zT^h>}e%Rx2+N%CpV<=Pe;^>CtxQ=Ovw2AXwMfJLPVDVfxW4|f1JYd!*3mf{Wq8KC5 z!^sxq?zN|q;NRr)AO>Gp&O&_n?B8NfsNb>vN0Alxl=%vosP|=BFG&_T))HOQy z_zcwc3b>G5;FI_zAi(>}@4JCD`HcdV>hq7+!Re+o0M+uRXblQoM4r*Ho*mqmyJ({q zk&FPrf95lR^5=M_l!;$v#yQneRS^Pp3SB>S2KsOUv(4nD*e&Aw^I7QgSprH2iz(X< zM&&b2Fm3iFVQrBz($H7^04;>tRXF|JtbwMFhB^6Nfs!b&S?ym%YTKbg?AG6#4C_@1 z6d)&c4v3?Ss&1u(`tV+gr&QUrsZt?9OIxVU13cH#f+4m~@@!PkFmj%w`lA9N>%&!INn(c2EZsvCB{SZ1IynhCekXkLm~s?HRN2EF3Us_j?2$+$az54CYw zM7B1Ls~1*-(yOqXPSlDOC_@)|77Xa-uFF9d%;tP@iD&tN!ISwftK`u|C6}=AAh#`x zfg7!DL4T|H7nQ@_UG7|rpPv{FW5OzzF7n7j{A*xitMd^{^JU&j<;rRg5+Lu@ z>-7dtFVN&%IK$U(;N&x?dB{i8JA?jF_)D0dxQtRc{$&GGoorjqP*vnhM5^0BJ_}gWbFB$PFg)gEY-H#HHh1uZrxAi$yRcn9g zdpoF8u1zu#T+P4Fe{84mHg@x3cJq4!?BM!l|HXgwFWZ3r+0;$@|FpIJn@dCYUGM$Z zj^^J-{!g~H)BkPz&wqC`D^)h5*F@mGkE?I?5qkGN?%dqZ`kDO#ip0rUB+8jM(5Jct zLDJFemrKsRwoKT z<|YI&oWi6QD1aUVT&vnHS!O6!O_FPqxrpsef{tUyaXFIy@IjT%3U_HfhifGn?bPpd z<;CpGmOi?oMz_v-$BN=1^C&kFR=^39fe)-MQK(Q(b4)tYvZWMs%rTpt z8{_+#P&8KJglusWXIkgi5eL}50w)g4omk)+%QvO)23$pk9Ov0pc_3T5t4hfHXW-KT zGMfJAC4ikI$`1!!T@}>+fXi5>a%^iW`%OY16c(a!_WiPk^dkllI?SFwj(7jk%D>i* z+_D1u5sLpEoY+CpyCj7`6Ws9m(W-It5T!mdE`2yQb09c7pF)?=yoPI$9sxCa-B|V`9tl+4L zKK7y}P_msqR$(6m_Q#zZCBr1vG5%;A!Pf7ou2O8K9?*AD!*NYxYHKWj6(`-K;>>Yz zIrJsrFt7ATDAi>!D3~?@gP5P3LH>dotA>I6!g&c@A)v-eXGdg`+R{~Y$MKYXB2gp3 zAiFe@q)PI&_+kBJ6^VP0lr%)#xD8C(7QgDRyUnTJ->^hGtGP3*Lol^5#v*QoOmVK7l65JrVDep z4r*L)b9aw9-AYjePN#)Bp z$`1*p$ws z7+L?JL>O8B$tPg@M=>iS+dnx4Z2y~6@GsQB|I@_C_U||ae;@f@$NF!!N#Zdu(fv>G zSEstV^|~0sH~4F3-Vd+>_I;1uA0)3f)1pphDD-d;FqLZtf!J0$7ANkmw%hB>L?PIe z69DC%;7MLL z6itz_j_7tVZm1Ia&%s!tIUy4@B)VMTxcvIl*=$jSAwXF-h6Vz0Jv}tc!^tJl?Jlq_ zED~Nf0I9$&?$|1BZ1SHwZGG)rZ*~3sXKKLw2Z6o_3c(}(B)=P19JB9HA zA}eP?SBsZp#rh0Uzt~<*>A4d=phI2;LE6oM>pLKDjZ@`CgAz zD?hv;wAeTpXGp*2)1-HNikVv5 ztJPQA*wq*|Rb+`icU)R}otWG%a@=P_aZN4kX*{yJUujrvV|TI>2D1|{=(r2FX@{%a+8 zZ}$+VJIt0CQ63SG+(Fk)XpH-nyG^AgU8baHmmJwAvDx!;Hr6)tEs z4}5Ln7cDXoZ;sy$sWP63K9n}6*5OX^5A1IcP96}9ADsX4a(J0Gp;ijsz>ZWb^_s2x ztcPQKvLplP0QnCJp9${as&Z-e>QC?j9AihV#eLz-U04xcC6*VrCs-Z?FeZKsFVr8r z%9&rRmiJ{?ZRCXwHFeK#P(2FRZ}GH(6f-u4n%3Au@Wf3{o?a4uS}?bHHAvS2p`qG7 z2;>nL&OErlY~WG4w8M-}r9Z4KtfBnDfRL0lkBL`Ag^!50%){BbC(ih*;fRHXvR+T| z>gNcSD)e0OlsJvyDFI~=8 z%`H)nVegj(ou?Qxo6A!KgpZicg1AQXb3kaFMAAR#eTTLU8e^FK(7uWKDVp z-k<)M3NBk?3%V?;CqfPoC^y)S%hFTuF|QBOR2Jt1%ZAW zzjKVQUym@DLB*G_!iJ<4ApX&;?!8v#bpTW>-H*pHuBd_yzj2&Hl12g|Z$4yTKb((w zMcjRWG(oP&t9zPsgt@3vm|&h?%BfgOLN+ zOyfSX3}mY7yil^gyNlOPalk4}5((`kYArUF*VHZnCYkokY_enaz;sHguV;Gfb z78Q`%l6q|Ma*d_-ff5QA1Arh7Jd>r{q&@v~?M#%owtamtmdQ01XsmP|_Ptc2EfM@B z46tvO*ZknEHXWG51h}OM9d3R53imHOV1kGz!g>C}G6Y>1l#ri=0AR>DiA~i%@QdYw zAGi5yWblMlvZC;71cmw2X;>}7!PYfE3`1XIEr|&v?)JKRp!wacw;Ql1#_4D4d5J0< z*az?10U0sVKeW~(Y$WU}Lv)P&Ht@3ri-Vx&k%#CcOf#KYK(^mGtk)|X{I57)Jzjk^ zN&nc&yS7th>c)tVcX0MGV>0z>=bhBJF9qHz1b!Bek|ljUc-&z=YbgMyT5^m7QwO_k zt^rN_K_vh~W5-X2jie1kf=o}-0`8I#Nf8P-q>n@C`sKsA(YpBy)wMn^9*7wNrXR6@ z{dFMo^g5fSHIb#8FNp@|t78q%z{g+p#QaA9X`XonT{)%J88=anC_yCRmm&yO*{%3d zPFKaofV$`{>jC;(F?l}0a@vq>ZdIfUt| z_xE7_VoVDyZ2SEQ-}@gcT2C$3el&IR?;F1GkW;W6kl{b7bN(x6I_bH8R@lpW4@O4Iw1LElH zUJq75Mdf!*P)cs}aTw?~1$Yr&?Vv}PA0Ci)_T$AGuC_7~-0eAnnMy6>cDxqr;bce` zsd?nMmtO4xBcGD-v0(Lm&Uj9DEx;%`(5Xal3kQ`#XXsktJhX!JAFj%kI~2Q^q?*UV z*qf``(LgWbl`~l_9ozFVkj6#9`7+B>X1-FA%Nx#2+*NHwH`@moJtp%k;;W5^b@R4# zm4d}xW?$R(9G+sqMuc<1X^`@vLXRCV1v`m3HA|>L^-TmHo#1fxF_sJtF)%X4-GFpg#~5==m^PsK*F==Di_@4=(L8j{<*ea7%4Q zi8cf%pspZ4^hRQXzm9(7dW|mYcM+0ad6|AgK+{p~D}b;0fw6ejWi2C@k5csWgreS^ z0+#EF+=LD8Cw*RA&NG_-Y^W4F8gs?iO3Ni^8&8+Kvr{V2w31p+fnE;z0XAO~DazRi}LzzALQ>a>ce7%|gE{(*|{2M^nD z6g`%7Hr{N1pqW3wgT_$&llz9?kB$$+WWrhE{^KT{#J>JxX(hMPc;o7+a4Mdg$%qbK zMy4L6D&LlqrVZPkRly>a2-{#7ZS55o`MuAab!dq73f>wEcb2E2|Imd^vT%fo#(1h47pnS8{C)edq;ebf;n&UWsRi3gdvp5L&*Vbr93D+(e>#nC$5 z%3KbCP8%s5YDCHv1m~XyX&avQ>iW z>)ZG;peq1>wL8nbq|6uJ>M5>=EF^P#Em#n0xmIJ(y~Rh+P&H~c?lODI@O3w5=Khsq zq!dr*X=8BlVlQO?kw*R0J-EHYP6QA~>d#&dP4&QBo$hw_*L&bgpf{NmK<;oMC>aI0 zKYI3e=hsZ?eeKr>5<*EN*;I!l0Mxh8BIgHh2i`pJqI+loAd0Dng^4x_%k3dj{orgP z;Ui4&IC=#0n3P2vEtM=BB?ptIzvLkSYI|LPC;P2CX;ATh`%X4(w5^s|ZS-)U(?ke( zq|o)*JDB!E1gPc#6GQI3_7s}N(aRZ}S#uw9=!L#B84HQK%0*+$p(1CJ0MUZVqU^J? zkyHhLpa%vd6HCWdWU;3n;wgB(D4oV5avv7bwJJUVrma6Wc!BW8#7fy)ZiYdQv~kTc z5zZBO{@6@fghZ(EW3nzj-@NQur(@89wCD874_kAT5g&SeDcppsat_9E#>}|9n6U5m z^hu~2itwLbuHIyvX;;6_Wuq(~bZe$6cc(-E!hGOFKyRTsd$dw)z15$!5c}Qi;9vH3 z2KqS0T}=Xvs|6W3s>T;&4u-LIV5#Wk1Z8||gFT9W&?mm78qFzt2|;L2+)YKuIv6{#haTYO* zdbli*?patstzk!E?=P&}AvXrfkIppGcwvx6x>i`orv!s3$c8Z@F!cOk?oWxtqg5*3 zrhujqW5lasr3&HXySLPJ7Zijff&V1Zh`{cwY`h{AqjaOY z=z4aD7csiJ>ez5YDHw427W{;7t*_TYpyWWU37(85I2bBkUn_84CxG2#gOJ6qD&KB= zdfaXn+W5gbMuc?KJZsJ%-EdNN?z)h$^8;IWTO$Wp=V+72Ir=i2^8&JBNO;WR4a=F7 zCn=yQ7o8n>!%^YRnzo8IPvd8dG$-qOe#K52-r~3BWt@3VzU47k5eODQmA8E4ZlNTmdsD0jrvx7T;t#2@4PaBv{+fpj%iQ2&TxgFRX1LZ2 z*0PA@uc&YD28#zd(Nkq)5YA<$NXfijVwT* z>)ZW&QM2&xD3P1iOGk}8t(_Dzg5xHnSiqp#P?m|dqB(;xfcvWb-fgFiq@P@Y*mwWO zM6O?2qJU%NJl~#wa7i>DBNl?-rPt{zU4C*WLr}?oGm=F#7vrEO(Uo249$~Ih{j(n5lQHH9J0Ed%W^q84J0drM_VgWRSX_Xp()IYXdA{e}vX&j)O4k zw^bs_*A8nrWN^bQ(X6`$d)h;hj<|wcKE&T32-SPH4NsVJD@f==QOzKP$YN8S*1Y>3g@K?X4?d$MN`pQ??MsCMj(pjhHB~f z6zxpIwn57J2)K3HI@w|Ts=P5#9KgM-S7&X{Ynj3kUAXnraVxbNC3g&05UfnlNlTxQpiSB zUmz9czJR_t+{vhb;GYPr;Gi(FHT6$Cri%uQoZQ=)87?pw^bb%((NvQ>w++ll)Pr6( zoU1Wg++Fep_2CzAvqrE8lnJ0^Ef9^(1r`u$Nh$lOAiHcXk=35C*@8@fs$_X<2ed>% z35ojR?M|u$Tb+g9!Ink0v{~YeFp}R*v)O;8 z$o?JIfaO2UW;3ub|Ifm*N)2`U^>0P?ZP?{sgu(BT#HW?s5#3rDamP#TDHR^AAW_TH zn-k0L#_D^0I04~_jpZ1~{z1SBXv2);;U$gY5wU%!j?b==!O;;zmX}ZRS0Ht61N|9bUMU7n4rbK@c=@Xa%z@bS;> zMaSU?#g=80CZqsI9m~ja9zM=Mpf3D~CCado#A*T^7M5U3#I_`aRPeTSygLo(V-Z7; zhe&WK*bkt?&l@~Ci0)NP8|%KCG(K(8mt&qkprNQolT z;)uCZN-loVf3uJS-!)uMvz%>Td>Q-MLO^bqDUg*hWr&qNUz{;z=R!(tJQN3~A-EV`P(N8Yi}U)gzOAkCHx)>z1-OaJ_K zW+IPf8gj%ZvvKVe9S1REpD0>Rn1_zAccUCAVHN6-o+Kn2b}D#cWybUbG?W#mL~l4j zdK5rRr2wIZkrL~i05|BQ?B_{mntcA`-$+sa_)?2KsbYCNWMwnA8p;0qa%h4!`|EjH zZO9(-YtGr}x*Xf9rk@!DO^l-%pijcToBo}Ogj|0=`n!*3&1jh=KfAowkVRb)Icj-z zbs3Iz)v0v~H)+}ydQj zn7g_j3O=H*lDo7#>by{K{Y3Sk1d0DC+)k6#9~I~H1VcE+Ehl4dKaw+Y%wB>lNv39+ z9nt}n-VEU7ZBqi#JF`zck$bzUXvsEmR&w>V(*=Rw$(9hUpId?KOxIkmp7uM?!F! zzLA4ePLnQ_L(Aaonc%>ZieD|O=rPPtJIr#S8P?b&ooPSi-jpTPuBlPG%Xdw-^Q5{a zQNoH~kz+UEu4!h9txqnI$H#|CbB8?Kz@!|}+f;F->zBJAc67Tit+hsbfmNvP(TzmU z^WGC#@n>?8n}~Lk1H8VpHlPql*yw_s+qx{XQ$<#fU#E3dPE2g453D!|4yh1<)PncZuH{RJ zTg@(jgR^&yuQ{1VDGxYH#Kl=Ip0DmccM$N_bIcD_|EA}>lpnx=Fx43M-mTmNU9U~{ zm5ft9l`^0f)qhkYmW>*k>F*7-QIUrz>)#45-_Feyxzbi*=4uq6ufvxmxG*ZbT|IAy zD#y(lzS3dR@xye#P2I<1KA97KS?fgIBEdoDW=5o}PEQuS&-YDvsNpBK?924_92662 z=05N*wcKf)KW|UMd{4D|3!XoIitNA85$K_iwbQ1-Z0$3Ji7)aIHv7hJg?8bxt-^iX zdSUk_RBK4>3^PE72d*GDv(eY$QUs6Dz~!LH0Tw-=g~g_H?TIlHuk3D7<4e3jjx6Ee zX{hQ)AF{>*95jPaSr}Xi8G&st>prFkfVHdoyl6|0g|4YGkQH>Y%@mDT9m)m4v??S*tfK>sI`hqHLDtQ$A?CWj*4?f1~!RwDgiv@$fE`9-XDeOlZ0j)FTqKfq1fXv5Nw-r{p- z*Vz=WXFhC~zOHXljn}?o@l;p4jgrc_@cdX~VkJQr{T%=>4yjh7$QBK7+dhrD6;92@+?GA`kl6rh=r7i0e5_1zb$L6y73wposTwr+2 zPkww#H=7F&z&IR(-1IsvT24F-_{t}`5&(u`Dh4p$T}AUA(v3a_Vm$Db4kLef&mRSn zo{|gs4t7t6MQUKPydae!JSi1Yj8o56CIQ&LhMF{LSRojT>_Rd&&LPoY6|ZiCELy27 zd|>*ZUYf^0M~`@|1T2o=v2uQ{jwgQFS-7xc?Sw8l;Yu+$a8il974Y^xqF9i&TYbq3l6cXQn{^lODT#w7@9jonreR093Iq9d81C$PtwmheDG_*eSiT4w^|G3Q6)G+&K?9#kZ|=hhH1Sdo2lPP zYkEm^PFcKuq=G&xUjVP2G;)6-i~oBF@4wc-+5Wla&Hm4|?r)C7-^@ow_J8PQ#%~zt zKi>Z%aHoYw`(Kj!KMwHyg`{Tx#~Smh2KeaNzq5Y-!{kK!meefwo85lV3sNEQ zsL@{YsU=PEEXoS3D#mN#_dRkkgJ}fHad)vgUzd9P5(%j!sZXIjdbQ6WL0gfiZq-u) z&mX$3Pk#!dxN#VJ8}E|LX;HL^5J-?ORJPo|{tUk^-ra3p^xriKBZm!&Pf(kU5&eRM zpchD}A3t2(Hpcp$JIsw^np6}@obsLgU9W$}6|e>guI_}7BDmhlv*JdFLfPw_Yv*}? z3<*ktfa+ff7wBz?hza8MS)W71b1vx^ayg$RmJ=XN8&!(DHJq3u%j`*hLc1n9amSn^T8#+38Tv8@0DsIaZ7rt!`OVL$V2Apq4PYAcHRymu{Wx%-$ytyi(0CYtM;Jlpl*%OwZt zSkAKgA5&*dCt>;(iLZdMn=k*Z}C@tiBWDo$_(#GTLd+B2^3X4&Y?76@P%Ppv3^u_^&*^r$= zNPzEN$ay(NAixo@!?KGL&Mhe7#Y3fx&F+edVZ<53zfRL3AqEf>#q+0_N!U&ji1qG- zEEf>!p@hE-_?->-~kWaQjjipHpS;}wjNW3@puU%(hQFLz_N}HQ(F1(v53mV4ynx?fuEJfOi2K$Ay zGcQ!Pk@Fa8$*U@UD*4qP$gx)C;Ea!C>qx61XdoQl*2*T$6B8lp+smNj^O>4tmg20N z+3GH8OVtKPVV2X@1)t3Cvc>c23=>Jd#NdXD+x^Zm;j6vHBj_%n!{V^lPcsI7m1-OK zsTgc$!#v85lkA@b6aY=LC!Y@Bg6p7(^m|*qn*ox?q%oo&OAypC^UiV;A3qatutHEb zA8oKXr%he=_u70~*RV8f6S`-O>|{$eyMdW$(A8?VQ@(yUw zPa`4u1WCl%Y4B`$=+3`Xlh`XpByC>c!bI_=a^++}(Wk81hJE((3w-wUL2(@K#VqQY z3fp2()s2IZ`C5YC=JHWwk~3yhm>hfJ`b)@%Sw@ooQ|qIeuN#~7%pmA-N}2mqQJ-l4(jB=AcIc$ z5q(t=_e6t&3%G3lM`FeAJN%RwZ(r@uUwgw^^y}vVVHWS)o5wtorRudsxj=((r?ph# z^0Y~e)6P#Qu5SngMg=G;2^#t#>Fh%**!N6UrVyloYn`13_U6%OnrkgAuuV58$n!jc&nZjGSgOK)yMSY$D z{BCh82xu>*+E@(bia(0~=k^5dUeOBZfq3y%iF<|H7;T-MAw`Lu+C{P9JIT_?N*0?O zFsI$uAoQj{WMt~1mw@Mk)20V!d3X^VPRKKR8N$4YUQ3=m*{m8H=GrPvfLQg`=MhQ~1B_PWNBPGvLS)AL zQmBlKb6wQka^rea&Rt3mxHWH6pq|y7NgO;Uxq`Ru+EUBBFS8ZZdBzgAPP=QLpx(CJ zMmHUHOTHu4GWT#F{}@p0f-;LPC)mfpEGZ4A3KZv@J?VhGXs{#P<^vHz{Rv&=N>ar~ za(w_NWlxW)KzB)9{&E*u$3mOjW+I9CCKebrI_IXG0Q?aZ#K6-`MB3>T;zM5s6W%Gt z%(yz_b=W>V?w0jhqO{tteIZg)A^*#Ex9wi0Wv@Y-!KiF;-`2MNz_->-Plv9@zr~6XCtQB0*ebnRm)Gs_UJji(UNW{#eWMxpqMb`+iKoQOC`8rJBpZK$#kk6>{Dn68n+W+|mL2PVj3WIjeev%syT6b8ukZV}89N5L z|5>L{skUyn-}2M*S@lNVNuAD?ltEeZ(B)#nq9b*5O*7HJd0bfXA%z*?G)BpYTPNG< zM+aow;eaf#SWUa_n;%a|KCL{~$KlCzv#7DEf^Y%?A#u1BF2N+hB#e08y5Yn5#a{pG z@%ngn^l?UMD#5UQ<;um;{UPs0dN^Em6|ME>+w}gnwKrG$-mP3rOc)&@Uv%OC2n|PA zr;*w}oV%*5=JCHfckkjqWl9iXt3k&D@iWF$nwY^0b+&Lm-b4D#Yl!j?h;GG(A#??V z!XIa=yN72Hx<1eb1Ja4!j8v-#`GFbfG=y12y`OU;7Ub!oB=ijj`!Jhbs8rQI9$hsV z^J}U zq%xP;5bJ~M?EJ%>^sgM-Qu6amWDKPc9DXhi_=u|rDyqCbH;j(!9c(|b_X#r!M1~ef zghVa!sL{o-$%j7lNDW3A>_t=XuUgP9NFbuz!(OPM1d_sxVy%Q;uYb)lB$bqmd6c}P}i(KHuQo)=!eKlt=2@_7E>v3kRa(ajyffy!X4iJVmK|b zq}YG~L^PPvVz>GFKp9`@3ie@%h~&-6WH-%bnVc^||KL%Avh|4Gbzc^_8VzmUyP~H~ zD!*8e*0g2y>P&y!jjA_XE3i^xT{N1tD9c%`EQuamsA+;u5Z;8YQ7e{C{MxL9(#_7D}aTjByq-A(U z`E!|kZvG;sHKwUEOD#I*9IqF}Tu%F8AHq9XlVlzu#bfiEOs)tF>@a5RS2OVi#8ZK> zI>@0Z%n)O)1-rlV^HcaeEu!0w&M$*;bl9}v3D2+ByRptws0^(Xnl}Owk5Ydi5%fSH zf&jQ)*&np3w^X9IS$k}?eeL(AHenJ3F3wMZ`lvTWdQNtT1AGFFtm2e8u2ShS7$gu_ zBbgZ4!1%s#h~kTA^9;1`Lq$&OW_bCnO!XVntb+{i)J1tCN!J2nmPXXSn~H>>|UsP zO+u}ZkjWaQ&;!gqJ)HmAyQjuOrD*)wparIG&M#vx#m&UkNSn23Fl$66lQl=7Wh||- zX!Vs+ASpGc&!OqMfF@Lwk*8uT9gnIrV+(o_EMWwe&Y`(C^4kflcW(#h{w@ia1-U~j z*`2$!+)%|3TL?O42U|}~U7#-&kK#&2*AZW)WRle-=}C@lGuAlFSuI!*LITZD*Ez>Q z6URm_@#QdmTdvl@U$}Lx0xFn0xGQSaj;*JwB1s)&r#*@dEAdAF-8&-)=ET&PBI!gb zsQ(3AiM$o~k-t9JBW*dyq!quq$8=epQ+>x{F^(=^ODfNkzm+eJY-lEE<(;E;OVhMx zDZ^K3z;75)OeM;-a4s~EMM#_LGmJX65QdYZ99ScOCv#ADic`n6l8bK{!2|A^@){7t*ju(HNG`!=t0h(;H+b zC#908OKebo&eSwh>MY}#9r4ut-I!_sFhn_DPVc+_{O(!Bh~D#LX`t7{>Dz1yt@v_r z19yDXbk-=hvt(881lQ!EOrQLyQ$xfx%w&m{a?yPB(631-Mo2VX(!&(?&NWj2J zV{G`NIHq5NC$~OhxU1UNm$-!O#2?ojmCJE4J9_#?`8)4eU8S2i z$`T+3@KfMV%NS1D>jN$j6SP}LUX7b>7=c-LwQy9z>>TXN*A{)I9B)3N-;(rODvyL; zW{1z(=Er`j-@yVsNI?}gqiTB!J5xl234QKU?_0pd9|{ja0E;$OFE~!wH%Xsz)D_n_ zq4w2QyNh4q(^HH57aI>7R;Zl8LaTbmDsWDv5Kg6R;!wp42)0-*1XpRo08|R8wqRZU znf+lc?SUsFt$}M(H8Y?vAaj(QK6K7=BrTS`IqK&qK@j-F369H>PfzK9maU>PA->`D zO=U8J=_w~$QI%zF>rRZ2DCPQ6!ncud>K&|-IgD8YCHmaP+|q|;Vmz-jccC3n>gT;3 z=b7z$p0#~X#B~L8)mCm=zaWWX zt8c92#02&XzL>`nQrD@kL*RWRx>07gbO+b4*~YKPR`a3UMB*HfiPb8P1pqqXN14(^ z0RBJH-ub`sZq3?_ZQHEawkuh&ZL?xKsi0!pte6$swr$%u+34=w{XVD9{=DZOm}~v? zonzkP8sp|_)3qOD^uojIm9fF^<+1a`BExgphHUNQpn^MdDZFg9I zTZ5Ke1wRT3%A%1FwdAb^t=C)}UuD7in--`7fHQ}UGQ8tP*3K(7f88N~AuFrwrgUVM zBHbE=CV%v@*ZIzl+!E^QW$1j|W$$iQ`FMHI z=kpU68c`^Md(o1YI?O8UarWBsZ-+~vuddg*yvqDYG6(pEry9ro>{YaD{hqqlQfLD% zd}5|1ksZZJ8%Ty)=^vLt7Hc3}I_%|rcX~N(41DR6Au3a3deeWQEr+H=5R*w9d~VJZ*F zdST&o1<40i3$CZ;D{#7;22RA1rY#v=-4YdJ_Jqy`X1WRV0Wm8;%g9Hrh;0`qa_3lS z#bD7AN9(j($coPeR3jQ+ukC5KNm7CZq4RAgnnv^ed$irL!>*^I2$RQ=WEv!(wA*phtkeG_LH)jt_LO{ z_Cj|0fv*F8jE@4=?;^V_CfBEjv(Ve<_}7}(OH_-q47dAUGx7xy4U}vZ4py#nm#;z& z_C3xun$MGN##SIYjX2-Z+s^`o>PN*`=ru@){`^eAW~{hSeK_Nf8EoE?8EO7iy6+s1 zP6RIsm<~~#W+BN)9HlpdhZbXZ(-1yAFMb64%$-BZmuaow!Wh1D@#GB*H40(p-r4~F zF%7#X$bo&89FDyk-+R2cWub&YY0-MP%7{;PE0sphq${z!%CvKT65-@ zHD97Vee$+N_d=DE<28hDR?$xjjqP0bg59y$Jf(uA9RFpvVG+44)vR2l!#*+zpnLC@ z#+P+mKa#GqZ%$wS1HYwX2%q9Y1F@yR^{o0{kXm16#xerWIZ61LWGrUOYOAWA#FY

50Th$4VV@Zy7VJXu#AbC6 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

RTn^a$3n*|%NMJA#Qt)Atw>RLx&rc*jI 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%0ARUULL42Z4u{Ej&<+yuGT|Ea<(k#z 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 diff --git a/SPEX/Doc/SPEX_version.tex b/SPEX/Doc/SPEX_version.tex index 3acbff0d..114b4ca5 100644 --- a/SPEX/Doc/SPEX_version.tex +++ b/SPEX/Doc/SPEX_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/SPEX -VERSION 3.1.0, Mar 22, 2024 +VERSION 3.0.0, Jul 26, 2023 diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index a500a885..07f51658 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -2,8 +2,8 @@ // SPEX/Include/SPEX.h: Include file for SPEX Library //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -27,7 +27,7 @@ //------------------------------------------------------------------------------ // Unless otherwise noted all functions are authored by: // -// Christopher Lourenco, Jinhao Chen, +// Christopher Lourenco, Jinhao Chen, // Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis // @@ -66,8 +66,8 @@ // // See license.txt for license info. // -// This software is copyright by Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// This software is copyright by Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. // All Rights Reserved. // @@ -95,40 +95,13 @@ #include #include #include -// #include -// #include -// #include -// #include +#include +#include +#include +#include #include "SuiteSparse_config.h" - -//------------------------------------------------------------------------------ -// SPEX Version -//------------------------------------------------------------------------------ - -// Current version of the code -#define SPEX_DATE "Mar 22, 2024" -#define SPEX_VERSION_STRING "3.1.0" -#define SPEX_VERSION_MAJOR 3 -#define SPEX_VERSION_MINOR 1 -#define SPEX_VERSION_SUB 0 - -#define SPEX_VERSION_NUMBER(major,minor,sub) \ - (((major)*1000ULL + (minor))*1000ULL + (sub)) -#define SPEX_VERSION \ - SPEX_VERSION_NUMBER (SPEX_VERSION_MAJOR, \ - SPEX_VERSION_MINOR, \ - SPEX_VERSION_SUB) - -#define SPEX__VERSION SUITESPARSE__VERCODE(3,1,0) -#if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) -#error "SPEX 3.1.0 requires SuiteSparse_config 7.7.0 or later" -#endif - -#if defined ( __cplusplus ) -extern "C" -{ -#endif +#include "amd.h" +#include "colamd.h" //------------------------------------------------------------------------------ // Error codes @@ -155,9 +128,23 @@ typedef enum SPEX_info ; //------------------------------------------------------------------------------ -// SPEX Version, continued +// SPEX Version //------------------------------------------------------------------------------ +// Current version of the code +#define SPEX_DATE "Jul 26, 2023" +#define SPEX_VERSION_STRING "3.0.0" +#define SPEX_VERSION_MAJOR 3 +#define SPEX_VERSION_MINOR 0 +#define SPEX_VERSION_SUB 0 + +#define SPEX_VERSION_NUMBER(major,minor,sub) \ + (((major)*1000ULL + (minor))*1000ULL + (sub)) +#define SPEX_VERSION \ + SPEX_VERSION_NUMBER (SPEX_VERSION_MAJOR, \ + SPEX_VERSION_MINOR, \ + SPEX_VERSION_SUB) + SPEX_info SPEX_version ( int version [3], // SPEX major, minor, and sub version @@ -179,42 +166,6 @@ SPEX_info SPEX_version #error "MPFR v4.0.2 or later is required." #endif -//------------------------------------------------------------------------------ -// SPEX_TRY: try a SPEX method and check for errors -//------------------------------------------------------------------------------ - -// In a robust application, the return values from each call to SPEX should be -// checked, and corrective action should be taken if an error occurs. The -// SPEX_TRY macros assist in this effort. -// -// SPEX is written in C, and so it cannot rely on the try/catch mechanism of -// C++. To accomplish a similar goal, we provide our mechanism. The SPEX_TRY -// macro calls a single SPEX method and then takes corrected action based on a -// user-defined macro SPEX_CATCH. - -#define SPEX_TRY(method) \ -{ \ - SPEX_info info = (method) ; \ - if (info != SPEX_OK) \ - { \ - SPEX_CATCH (info) ; \ - } \ -} - -// A typical example user application might #define SPEX_CATCH as follows. -// Suppose the user function needs to free some workspace and return to the -// caller if an error occurs: - -/* - #define SPEX_CATCH(info) \ - { \ - SPEX_matrix_free (&A, NULL) ; \ - fprintf (stderr, "SPEX failed: info %d, line %d, file %s\n", \ - info, __LINE__, __FILE__) ; \ - return (info) ; \ - } \ -*/ - //------------------------------------------------------------------------------ // Pivot scheme codes //------------------------------------------------------------------------------ @@ -388,7 +339,7 @@ SPEX_type ; // A->x. For example, if A->p_shallow is true, then a non-NULL A->p is a // pointer to a read-only array, and the A->p array is not freed by // SPEX_matrix_free. If A->p is NULL (for a triplet or dense matrix), then -// A->p_shallow has no effect. +// A->p_shallow has no effect. typedef struct { @@ -454,20 +405,6 @@ typedef struct // A SPEX_matrix is a pointer to a SPEX_matrix_struct typedef SPEX_matrix_struct *SPEX_matrix ; -//------------------------------------------------------------------------------ -// SPEX_matrix macros -//------------------------------------------------------------------------------ - -// These macros simplify the access to entries in a SPEX_matrix. -// The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. - -// To access the kth entry in a SPEX_matrix using 1D linear addressing, -// in any matrix kind (CSC, triplet, or dense), in any type: -#define SPEX_1D(A,k,type) ((A)->x.type [k]) - -// To access the (i,j)th entry in a 2D dense SPEX_matrix, in any type: -#define SPEX_2D(A,i,j,type) SPEX_1D (A, (i)+(j)*((A)->m), type) - //------------------------------------------------------------------------------ // SPEX_matrix_allocate: allocate an m-by-n SPEX_matrix //------------------------------------------------------------------------------ @@ -550,7 +487,7 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code // SPEX_matrix_copy: make a copy of a SPEX_matrix, into another kind and type. // SPEX supports 16 matrix formats: 15 of them are all combinations of -// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). +// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). SPEX_info SPEX_matrix_copy ( @@ -855,6 +792,8 @@ SPEX_info SPEX_determine_symmetry const SPEX_options option // Command options ) ; +// ended HERE on Apr 10. + //------------------------------------------------------------------------------ //---------------------------SPEX GMP/MPFR Functions---------------------------- //------------------------------------------------------------------------------ @@ -976,8 +915,6 @@ SPEX_info SPEX_mpq_equal (int *r, const mpq_t x, const mpq_t y) ; SPEX_info SPEX_mpfr_init2(mpfr_t x, const uint64_t size) ; -SPEX_info SPEX_mpfr_set_prec(mpfr_t x, const uint64_t size) ; - SPEX_info SPEX_mpfr_set (mpfr_t x, const mpfr_t y, const mpfr_rnd_t rnd) ; SPEX_info SPEX_mpfr_set_d (mpfr_t x, const double y, const mpfr_rnd_t rnd) ; @@ -1014,13 +951,6 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; -SPEX_info SPEX_mpz_set_null (mpz_t x) ; -SPEX_info SPEX_mpq_set_null (mpq_t x) ; -SPEX_info SPEX_mpfr_set_null (mpfr_t x) ; -SPEX_info SPEX_mpz_clear (mpz_t x) ; -SPEX_info SPEX_mpq_clear (mpq_t x) ; -SPEX_info SPEX_mpfr_clear (mpfr_t x) ; - //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -1034,7 +964,7 @@ SPEX_info SPEX_mpfr_clear (mpfr_t x) ; // "Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via // a Sparse Left-looking Integer-preserving LU Factorization", -// C. Lourenco, J. Chen, E. Moreno-Centeno, T. Davis, +// C. Lourenco, J. Chen, E. Moreno-Centeno, T. Davis, // ACM Trans. Mathematical Software. pp 1-23, vol 48, no 2, 2022. // The theory associated with this software can be found in the paper @@ -1060,7 +990,7 @@ SPEX_info SPEX_mpfr_clear (mpfr_t x) ; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis +// Christopher Lourenco, Jinhao Chen, Timothy A. Davis, and Erick Moreno-Centeno //------------------------------------------------------------------------------ @@ -1211,7 +1141,7 @@ SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b //------------------------------------------------------------------------------ // Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. //------------------------------------------------------------------------------ @@ -1369,9 +1299,5 @@ SPEX_info SPEX_backslash SPEX_options option // Command options (NULL: means use defaults) ) ; -#if defined ( __cplusplus ) -} -#endif - #endif diff --git a/SPEX/LICENSE.txt b/SPEX/LICENSE.txt index 2516bc71..0020fe09 100644 --- a/SPEX/LICENSE.txt +++ b/SPEX/LICENSE.txt @@ -6,8 +6,8 @@ found in the lists below. SPEX: a SParse EXact Factorization Framework for solving SLEs - Copyright (c) 2019-2024, Christopher Lourenco, Jinhao Chen, - Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. + Copyright (c) 2019-2023, Christopher Lourenco, Jinhao Chen, + Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. Available at: https://github.com/clouren/SPEX diff --git a/SPEX/MATLAB/Source/SPEX_mex.h b/SPEX/MATLAB/Source/SPEX_mex.h index 07f418cc..a951aefd 100644 --- a/SPEX/MATLAB/Source/SPEX_mex.h +++ b/SPEX/MATLAB/Source/SPEX_mex.h @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex.h: include file for MATLAB functions //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/Source/spex_mex_check_for_inf.c b/SPEX/MATLAB/Source/spex_mex_check_for_inf.c index bfadbfbf..6242b4f3 100644 --- a/SPEX/MATLAB/Source/spex_mex_check_for_inf.c +++ b/SPEX/MATLAB/Source/spex_mex_check_for_inf.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex_check_for_inf.c: Check A&B for inf/NAN //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/Source/spex_mex_error.c b/SPEX/MATLAB/Source/spex_mex_error.c index f28cbd66..3d978a1a 100644 --- a/SPEX/MATLAB/Source/spex_mex_error.c +++ b/SPEX/MATLAB/Source/spex_mex_error.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex_error.c: Check error codes for MATLAB //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c b/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c index 10713b01..f9c32d3d 100644 --- a/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c +++ b/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex_get_A_and_b.c: convert A&b to SPEX matrices //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c b/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c index b2ee0980..624b1f87 100644 --- a/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c +++ b/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/SPEX_mex_get_matlab_optons.c: Get command options from user //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_backslash.m b/SPEX/MATLAB/spex_backslash.m index b783ab29..73b30bda 100644 --- a/SPEX/MATLAB/spex_backslash.m +++ b/SPEX/MATLAB/spex_backslash.m @@ -88,8 +88,8 @@ % interfaces of all SPEX packages. Typing spex_mex_install in this directory % should do this correctly. -% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Timothy A. Davis and Erick Moreno-Centeno. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_backslash_mex_soln.c b/SPEX/MATLAB/spex_backslash_mex_soln.c index 664b5a3f..a6b84e3a 100644 --- a/SPEX/MATLAB/spex_backslash_mex_soln.c +++ b/SPEX/MATLAB/spex_backslash_mex_soln.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/spex_backslash_mex_soln: Use SPEX Backslash within MATLAB //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_cholesky_backslash.m b/SPEX/MATLAB/spex_cholesky_backslash.m index 1f2c67fd..791af8ae 100644 --- a/SPEX/MATLAB/spex_cholesky_backslash.m +++ b/SPEX/MATLAB/spex_cholesky_backslash.m @@ -91,8 +91,8 @@ % interfaces of all SPEX packages. Typing spex_mex_install in this directory % should do this correctly. -% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Timothy A. Davis and Erick Moreno-Centeno. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_cholesky_mex_soln.c b/SPEX/MATLAB/spex_cholesky_mex_soln.c index 7c9b7389..7684c0e2 100644 --- a/SPEX/MATLAB/spex_cholesky_mex_soln.c +++ b/SPEX/MATLAB/spex_cholesky_mex_soln.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/spex_cholesky_mex_soln: Use SPEX Chol within MATLAB //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_lu_backslash.m b/SPEX/MATLAB/spex_lu_backslash.m index 1afe3942..15f45be0 100644 --- a/SPEX/MATLAB/spex_lu_backslash.m +++ b/SPEX/MATLAB/spex_lu_backslash.m @@ -94,8 +94,8 @@ % % See also vpa, SPEX_install, SPEX_test, SPEX_demo. -% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_lu_mex_soln.c b/SPEX/MATLAB/spex_lu_mex_soln.c index 8530b170..151d55f8 100644 --- a/SPEX/MATLAB/spex_lu_mex_soln.c +++ b/SPEX/MATLAB/spex_lu_mex_soln.c @@ -2,8 +2,8 @@ // SPEX/MATLAB/spex_lu_mex_soln: Use SPEX Left LU within MATLAB //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_mex_demo.m b/SPEX/MATLAB/spex_mex_demo.m index e20780f0..bb393a5c 100644 --- a/SPEX/MATLAB/spex_mex_demo.m +++ b/SPEX/MATLAB/spex_mex_demo.m @@ -5,8 +5,8 @@ % % See also vpa, spex_mex_install, spex_mex_test. -% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/MATLAB/spex_mex_install.m b/SPEX/MATLAB/spex_mex_install.m index 91570067..267e65cb 100644 --- a/SPEX/MATLAB/spex_mex_install.m +++ b/SPEX/MATLAB/spex_mex_install.m @@ -1,26 +1,27 @@ function spex_mex_install(run_demo) -% spex_mex_install: install and test the MATLAB interface to SPEX MATLAB functions. +% spex_mex_INSTALL: install and test the MATLAB interface to SPEX MATLAB functions. % % Usage: spex_mex_install % -% Required Libraries: GMP, MPFR, AMD, COLAMD, SuiteSparse_config, SPEX. If -% -lamd, -lcolamd, and -lsuitesparseconfig are not available, install them with -% 'make install' first, in the top-level SuiteSparse folder. +% Required Libraries: GMP, MPFR, AMD, COLAMD, SPEX. If -lamd and -lcolamd are +% not available, install them with 'make install' first, in the top-level +% SuiteSparse folder. % % You may need to add the top-level lib folder (SPEX/lib, or SuiteSparse/lib % if SPEX is inside SuiteSparse) to your LD_LIBRARY_PATH (DYLD_LIBRARY_PATH % on the Mac). See instructions in the spex_deps.m file. -% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + if (nargin < 1) run_demo = true ; end -fprintf ('Compiling the SPEX for use in MATLAB:\n') ; +fprintf ('Compiling the SPEX mexFunctions for use:\n') ; % Find all source files and add them to the src string src = ''; @@ -62,17 +63,12 @@ function spex_mex_install(run_demo) src = [src, tmp]; end +% Compiler flags +flags = 'CFLAGS=''-std=c99 -fPIC'' LDFLAGS=''-Wl,-rpath=''../../lib'''''; + % External libraries: GMP, MPRF, AMD, and COLAMD [suitesparse_libdir, suitesparse_incdir, gmp_lib, gmp_include, mpfr_lib, mpfr_include] = spex_deps ; -% Compiler flags -openmp = '' ; -if (~ismac && isunix) - openmp = ' -fopenmp' ; -end -flags = sprintf ('CFLAGS=''-std=c11 -fPIC %s'' LDFLAGS=''-Wl,-rpath=''%s''''', ... - openmp, suitesparse_libdir) ; - % libraries: if (isempty (suitesparse_libdir)) suitesparse_libdir = ' ' ; @@ -109,21 +105,13 @@ function spex_mex_install(run_demo) m2 = ['mex ', verbose, ' -R2018a ', includes, ' spex_cholesky_mex_soln.c ' , src, ' ', flags, ' ', libs]; m3 = ['mex ', verbose, ' -R2018a ', includes, ' spex_backslash_mex_soln.c ' , src, ' ', flags, ' ', libs]; -% Now, we evaluate each one if (~isempty (verbose)) fprintf ('%s\n', m1) ; end -fprintf ('Compiling MATLAB interface to SPEX LU:\n') ; + +% Now, we evaluate each one eval (m1) ; -if (~isempty (verbose)) - fprintf ('%s\n', m2) ; -end -fprintf ('Compiling MATLAB interface to SPEX Cholesky:\n') ; eval (m2) ; -if (~isempty (verbose)) - fprintf ('%s\n', m3) ; -end -fprintf ('Compiling MATLAB interface to SPEX Backslash:\n') ; eval (m3) ; if (run_demo) diff --git a/SPEX/MATLAB/spex_mex_test.m b/SPEX/MATLAB/spex_mex_test.m index 797092a1..b10f041b 100644 --- a/SPEX/MATLAB/spex_mex_test.m +++ b/SPEX/MATLAB/spex_mex_test.m @@ -5,8 +5,8 @@ % % See also spex_mex_install, spex_mex_demo. -% SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +% SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. % All Rights Reserved. % SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -83,7 +83,7 @@ fprintf ('\nmaxerr: %g\n', maxerr) ; if (maxerr < 1e-6) - fprintf('\nSPEX LU installation successful\n') + fprintf('\nLeft LU installation successful\n') else error ('\nTesting failure! error too high please reinstall\n') end diff --git a/SPEX/Makefile b/SPEX/Makefile index 4ededd71..d4ae1a0e 100644 --- a/SPEX/Makefile +++ b/SPEX/Makefile @@ -2,8 +2,8 @@ # SuiteSparse/SPEX/Makefile: Makefile for SPEX #------------------------------------------------------------------------------- -# SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -37,32 +37,33 @@ default: library # default is to install only in /usr/local library: - ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . -j${JOBS} ) # install only in SuiteSparse/lib and SuiteSparse/include local: - ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=1 .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=1 .. && cmake --build . -j${JOBS} ) # install only in /usr/local (default) global: - ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=0 .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=0 .. && cmake --build . -j${JOBS} ) debug: - ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . --config Debug -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. && cmake --build . -j${JOBS} ) all: library demos: - ( cd build && cmake $(CMAKE_OPTIONS) -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DDEMO=1 .. && cmake --build . -j${JOBS} ) ./build/spex_demo_lu_simple1 ./build/spex_demo_lu_simple2 ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt ./build/spex_demo_lu_extended f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt ./build/spex_demo_lu_doub f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt ./build/spex_demo_backslash f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt - ./build/spex_demo_cholesky_simple f ExampleMats/494_bus.mat.txt ExampleMats/494_bus.rhs.txt - ./build/spex_demo_cholesky_extended f ExampleMats/494_bus.mat.txt ExampleMats/494_bus.rhs.txt - ./build/spex_demo_threaded f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt ./build/spex_demo_backslash f ExampleMats/Trefethen_500.mat.txt ExampleMats/Trefethen_500.rhs.txt + ./build/spex_demo_cholesky_simple f ExampleMats/494_bus.mat.txt ExampleMats/494_bus.rhs.txt + ./build/spex_demo_cholesky_extended f ExampleMats/494_bus.mat.txt ExampleMats/494_bus.rhs.txt + ./build/spex_demo_threaded f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt + cov: ( cd Tcov && $(MAKE) ) diff --git a/SPEX/Python/SPEXpy/Options.py b/SPEX/Python/SPEXpy/Options.py index 54e07b01..85a28f75 100644 --- a/SPEX/Python/SPEXpy/Options.py +++ b/SPEX/Python/SPEXpy/Options.py @@ -2,8 +2,8 @@ # SPEX/Python/utilities/Options.py: class Options #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/SPEX_error.py b/SPEX/Python/SPEXpy/SPEX_error.py index d15ae43d..5680bb2a 100644 --- a/SPEX/Python/SPEXpy/SPEX_error.py +++ b/SPEX/Python/SPEXpy/SPEX_error.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/SPEX_error.py: class SPEX_error #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/Source/spex_python_connect.c b/SPEX/Python/SPEXpy/Source/spex_python_connect.c index d3fe5e10..728505f8 100644 --- a/SPEX/Python/SPEXpy/Source/spex_python_connect.c +++ b/SPEX/Python/SPEXpy/Source/spex_python_connect.c @@ -2,8 +2,8 @@ // SPEX/Python/spex_connect.c: use SPEX in Python //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/Source/spex_python_connect.h b/SPEX/Python/SPEXpy/Source/spex_python_connect.h index 06d0e6d8..eb227efd 100644 --- a/SPEX/Python/SPEXpy/Source/spex_python_connect.h +++ b/SPEX/Python/SPEXpy/Source/spex_python_connect.h @@ -2,8 +2,8 @@ // SPEX/Python/spex_connect.h: use SPEX in Python //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2022-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/__init__.py b/SPEX/Python/SPEXpy/__init__.py index ab83e6df..0d348eab 100644 --- a/SPEX/Python/SPEXpy/__init__.py +++ b/SPEX/Python/SPEXpy/__init__.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/__init__.py #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/backslash.py b/SPEX/Python/SPEXpy/backslash.py index 66ea49dc..b057b94f 100644 --- a/SPEX/Python/SPEXpy/backslash.py +++ b/SPEX/Python/SPEXpy/backslash.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/backslash.py: solve Ax=b #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/cholesky_backslash.py b/SPEX/Python/SPEXpy/cholesky_backslash.py index 61b56bcc..bde5ff4c 100644 --- a/SPEX/Python/SPEXpy/cholesky_backslash.py +++ b/SPEX/Python/SPEXpy/cholesky_backslash.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/cholesky_backslash.py: solve Ax=b using Cholesky factorization #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/lu_backslash.py b/SPEX/Python/SPEXpy/lu_backslash.py index 4db6b36c..3810af88 100644 --- a/SPEX/Python/SPEXpy/lu_backslash.py +++ b/SPEX/Python/SPEXpy/lu_backslash.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/lu_backslash.py: solve Ax=b using LU factorization #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/spex_connect.py b/SPEX/Python/SPEXpy/spex_connect.py index 2a1c98f0..b8c4a1a2 100644 --- a/SPEX/Python/SPEXpy/spex_connect.py +++ b/SPEX/Python/SPEXpy/spex_connect.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEX/spex_connect.py: link SPEX to use in Python #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/SPEXpy/spex_matrix_from_file.py b/SPEX/Python/SPEXpy/spex_matrix_from_file.py index f70668b9..37e15135 100644 --- a/SPEX/Python/SPEXpy/spex_matrix_from_file.py +++ b/SPEX/Python/SPEXpy/spex_matrix_from_file.py @@ -2,8 +2,8 @@ # SPEX/Python/SPEXpy/spex_from_matrix_file.py: read matrix from file #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Python/spex_python_demo.py b/SPEX/Python/spex_python_demo.py index 71c3a2a9..f1e7e016 100644 --- a/SPEX/Python/spex_python_demo.py +++ b/SPEX/Python/spex_python_demo.py @@ -3,8 +3,8 @@ # matrices #------------------------------------------------------------------------------- -# SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +# SPEX: (c) 2022, Chris Lourenco, Jinhao Chen, +# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. # All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Backslash/License/license.txt b/SPEX/SPEX_Backslash/License/license.txt index d289a39f..f81e2816 100644 --- a/SPEX/SPEX_Backslash/License/license.txt +++ b/SPEX/SPEX_Backslash/License/license.txt @@ -1,7 +1,7 @@ SPEX Backslash: -Copyright (c) 2021-2024, Christopher Lourenco, Jinhao Chen, -Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +Copyright (c) 2021-2023, Christopher Lourenco, Jinhao Chen, +Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. Available at: https://github.com/clouren/SPEX diff --git a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c index 623a767e..76433e50 100644 --- a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c +++ b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c @@ -2,8 +2,8 @@ // SPEX_Backslash/SPEX_backslash.c: Solve a system Ax=b //------------------------------------------------------------------------------ -// SPEX_Backslash: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Backslash: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/License/license.txt b/SPEX/SPEX_Cholesky/License/license.txt index b29eb690..ac5cd4a9 100644 --- a/SPEX/SPEX_Cholesky/License/license.txt +++ b/SPEX/SPEX_Cholesky/License/license.txt @@ -1,7 +1,7 @@ SPEX_Chol: Integer-Preserving Cholesky Factorization -Copyright (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +Copyright (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. Available at: diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c index 26173b29..05e16904 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/SPEX_cholesky_analyze: Perform the symbolic analysis of A //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c index 88c9a106..575812b0 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/SPEX_cholesky_backslash: solve Ax=b //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c index 387f75cf..c662cb9a 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/SPEX_cholesky_factorize: Perform SPEX Chol factorization of A //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c index 5fa2a7d0..f42f15a7 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c @@ -3,8 +3,8 @@ // factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c index 0f6d0fba..6e70d9f2 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_backward_sub: Solve L' x = b for Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c index 91009aae..1802865a 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_counts: Column counts for Cholesky factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c index 80e917d3..a7559a0b 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_ereach: Compute reach of an elimination tree //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c index dd352128..8c2d8f2f 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_etree: Compute the elimination tree of a matrix A //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c index a8dab71d..e899145e 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -2,14 +2,14 @@ // SPEX_Cholesky/spex_cholesky_factor: Integer preserving Cholesky factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -#define SPEX_FREE_ALL \ +# define SPEX_FREE_ALL \ { \ SPEX_factorization_free(&F, option); \ } diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c index 38515168..d4880ffe 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_forward_sub: Solve the system LDx = b //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h b/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h index 73a62061..67013e62 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_internal.h: include file for internal use in SPEX_Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c index cbbd375a..1ac88142 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_leaf: Subroutine for column counts of Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c index 3611b416..d9c03227 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_left_factor: Left-looking REF Chol. factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c index e3d7392c..1caa721e 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c @@ -3,8 +3,8 @@ // left-looking triangular solve //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -55,11 +55,9 @@ // Each iteration of the triangular solve requires that the nonzero pattern // is sorted prior to numeric operations. This is the helper function for // c's default qsort -static inline int compar (const void * a, const void * b) +static inline int compare (const void * a, const void * b) { - int64_t x = (* ((int64_t *) a)) ; - int64_t y = (* ((int64_t *) b)) ; - return (x < y ? -1 : ((x == y) ? 0 : 1)) ; + return ( *(int64_t*)a - *(int64_t*)b ); } SPEX_info spex_cholesky_left_triangular_solve @@ -220,7 +218,7 @@ SPEX_info spex_cholesky_left_triangular_solve } } // Sort the nonzero pattern xi using quicksort - qsort (&xi[top], n-top, sizeof (int64_t), compar) ; + qsort(&xi[top], n-top, sizeof(int64_t), compare); // Reset the history vector h for (i = top; i < n; i++) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c index 1280d974..bcc3a5d7 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_permute_A: Symmetric permutation of matrix A //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c index 6ff7d721..6142df53 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_post: Postorder a forest //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c index 75871a45..5b42a4e3 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_pre_left_factor: Symbolic left-looking Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c index dd3560d3..4c953fdf 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_preorder: symbolic ordering/analysis for Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c index aac78c10..52836c3f 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_symbolic_analysis: Symbolic analysis for Cholesky //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -78,7 +78,7 @@ SPEX_info spex_cholesky_symbolic_analysis SPEX_CHECK( spex_cholesky_counts(&c, A, S->parent, post) ); // Set the column pointers of L - S->cp = (int64_t*) SPEX_malloc( (n+1)*sizeof(int64_t)); + S->cp = (int64_t*) SPEX_malloc( (n+1)*sizeof(int64_t*)); if (S->cp == NULL) { SPEX_FREE_ALL; diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c index 9f7bf67d..a1456cfc 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_tdfs: DFS of a tree rooted at a node //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c index 06ef00a7..a223426c 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_up_factor: Up-looking REF Cholesky factorization //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -92,8 +92,7 @@ SPEX_info spex_cholesky_up_factor int64_t *c = NULL; // Declare variables - int64_t n = A->n, i, j, jnew, k; - int64_t top = n ; + int64_t n = A->n, top, i, j, jnew, k; int sgn, prev_sgn; size_t size; @@ -183,6 +182,7 @@ SPEX_info spex_cholesky_up_factor L->p[k] = c[k] = S->cp[k]; } + //-------------------------------------------------------------------------- // Perform the up-looking factorization //-------------------------------------------------------------------------- diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c index e6c8a4d1..79c5e0bf 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -2,8 +2,8 @@ // SPEX_Cholesky/spex_cholesky_up_triangular_solve: Sparse sym REF tri. solve //------------------------------------------------------------------------------ -// SPEX_Cholesky: (c) 2020-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Cholesky: (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -53,11 +53,9 @@ // Each iteration of the triangular solve requires that the nonzero pattern // is sorted prior to numeric operations. This is the helper function for // c's default qsort -static inline int compar (const void * a, const void * b) +static inline int compare (const void * a, const void * b) { - int64_t x = (* ((int64_t *) a)) ; - int64_t y = (* ((int64_t *) b)) ; - return (x < y ? -1 : ((x == y) ? 0 : 1)) ; + return ( *(int64_t*)a - *(int64_t*)b ); } SPEX_info spex_cholesky_up_triangular_solve @@ -93,17 +91,10 @@ SPEX_info spex_cholesky_up_triangular_solve ASSERT(rhos->type == SPEX_MPZ); ASSERT(rhos->kind == SPEX_DENSE); - int64_t j, i, p, m, n = A->n; + int64_t j, i, p, m, top, n = A->n; int sgn; - (*top_output) = n ; - int64_t top = n ; - ASSERT (n >= 0) ; - ASSERT (k >= 0 && k < n) ; - ASSERT (parent != NULL) ; - ASSERT (c != NULL) ; - ASSERT (h != NULL) ; - ASSERT (xi != NULL) ; + ASSERT(n >= 0); //-------------------------------------------------------------------------- // Initialize REF Triangular Solve by getting the nonzero patern of x && @@ -114,17 +105,13 @@ SPEX_info spex_cholesky_up_triangular_solve // xi[top..n-1] SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, parent, c)); - ASSERT (top >= 0 && top <= n) ; - // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) - qsort (&xi[top], n-top, sizeof (int64_t), compar) ; + qsort(&xi[top], n-top, sizeof(int64_t*), compare); // Reset x[i] = 0 for all i in nonzero pattern xi [top..n-1] for (i = top; i < n; i++) { - j = xi [i] ; - ASSERT (j >= 0 && j <= k) ; - SPEX_MPZ_SET_UI(x->x.mpz[j],0); + SPEX_MPZ_SET_UI(x->x.mpz[xi[i]],0); } // Reset value of x[k]. If the matrix is nonsingular, x[k] will @@ -160,9 +147,6 @@ SPEX_info spex_cholesky_up_triangular_solve { // Obtain the index of the current nonzero j = xi[p]; - - ASSERT (j >= 0 && j <= k) ; - SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); if (sgn == 0) continue; // If x[j] == 0 no work must be done @@ -216,6 +200,7 @@ SPEX_info spex_cholesky_up_triangular_solve h[i] = j; } + //---------------------------------------------------------- /************ Both lij and x[i] are nonzero****************/ // x[i] != 0 --> History & IPGE update on x[i] @@ -270,7 +255,6 @@ SPEX_info spex_cholesky_up_triangular_solve } } } - // ------ History Update x[k] if necessary ----- if (h[k] < j - 1) { @@ -286,7 +270,6 @@ SPEX_info spex_cholesky_up_triangular_solve rhos->x.mpz[h[k]]); } } - // ---- IPGE Update x[k] = (x[k]*rhos[j] - xj*xj) / rho[j-1] ------ // x[k] = x[k] * rho[j] SPEX_MPZ_MUL(x->x.mpz[k],x->x.mpz[k],rhos->x.mpz[j]); @@ -295,15 +278,12 @@ SPEX_info spex_cholesky_up_triangular_solve // Only divide by previous pivot if the previous pivot is not 1 (which // is always the case in the first IPGE iteration) if (j > 0) - { // x[k] = x[k] / rho[j-1] SPEX_MPZ_DIVEXACT(x->x.mpz[k],x->x.mpz[k], rhos->x.mpz[j-1]); - } // Entry is up to date; h[k] = j; } - //---------------------------------------------------------- // At this point, x[k] has been updated throughout the // triangular solve. The last step is to make sure x[k] diff --git a/SPEX/SPEX_LU/License/license.txt b/SPEX/SPEX_LU/License/license.txt index a4615bf8..5174d2bd 100644 --- a/SPEX/SPEX_LU/License/license.txt +++ b/SPEX/SPEX_LU/License/license.txt @@ -1,7 +1,7 @@ SPEX_LU: a Sparse Left-looking Integer-Preserving LU Factorization -Copyright (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +Copyright (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. Available at: https://github.com/clouren/SPEX diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c b/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c index 63ed8f92..970a4347 100644 --- a/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_lu_analyze: symbolic ordering and analysis for sparse LU //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c b/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c index db16f1ce..8739db22 100644 --- a/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c @@ -2,8 +2,8 @@ // SPEX_LU/SPEX_lu_backslash: solve Ax=b, return solution as desired data type //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c b/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c index 0e79ac62..eac75058 100644 --- a/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c @@ -2,8 +2,8 @@ // SPEX_LU/SPEX_lu_factorize: exact sparse LU factorization //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_solve.c b/SPEX/SPEX_LU/Source/SPEX_lu_solve.c index 09ace23d..4dca51d7 100644 --- a/SPEX/SPEX_LU/Source/SPEX_lu_solve.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_solve.c @@ -2,8 +2,8 @@ // SPEX_LU/SPEX_lu_solve: exact solution of Ax=b //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c b/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c index a0ff47f8..6cc147e7 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_back_sub: sparse REF backward substitution (x = U\x) //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c b/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c index 1cb5f119..2f0b8cbe 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_dfs: depth-first search //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c b/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c index 4177697c..1e136690 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_forward_sub: sparse forward substitution (x = (LD)\x) //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c index a09a28dd..cd96bb01 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_get_largest_pivot: find a pivot entry in a column //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ @@ -18,7 +18,7 @@ */ #define SPEX_FREE_ALL \ - SPEX_mpz_clear (big); + SPEX_MPZ_CLEAR(big); #include "spex_lu_internal.h" @@ -51,7 +51,7 @@ SPEX_info spex_left_lu_get_largest_pivot int r ; (*pivot) = -1 ; mpz_t big ; - SPEX_mpz_set_null (big); + SPEX_MPZ_SET_NULL (big); SPEX_MPZ_INIT (big); //-------------------------------------------------------------------------- diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c index 0366c092..3dc8e88b 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_get_nonzero_pivot: find a nonzero pivot in a column //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c index 21ae715d..3e8753b1 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_get_pivot: find a pivot entry in a column //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ @@ -25,8 +25,8 @@ */ #define SPEX_FREE_ALL \ - SPEX_mpq_clear (tol); \ - SPEX_mpq_clear (ratio); + SPEX_MPQ_CLEAR (tol); \ + SPEX_MPQ_CLEAR (ratio); #include "spex_lu_internal.h" @@ -67,8 +67,8 @@ SPEX_info spex_left_lu_get_pivot int sgn, r; mpq_t tol, ratio; - SPEX_mpq_set_null (tol); - SPEX_mpq_set_null (ratio); + SPEX_MPQ_SET_NULL(tol); + SPEX_MPQ_SET_NULL(ratio); if (order == SPEX_SMALLEST) { diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c index e50cfb85..27694711 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_get_smallest_pivot: find the smallest entry in a column //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ @@ -16,7 +16,7 @@ */ #define SPEX_FREE_ALL \ - SPEX_mpz_clear (small); + SPEX_MPZ_CLEAR(small); #include "spex_lu_internal.h" @@ -49,7 +49,7 @@ SPEX_info spex_left_lu_get_smallest_pivot (*pivot) = -1; j = n; flag = top; - mpz_t small; SPEX_mpz_set_null (small); + mpz_t small; SPEX_MPZ_SET_NULL(small); SPEX_MPZ_INIT(small); //-------------------------------------------------------------------------- diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_reach.c b/SPEX/SPEX_LU/Source/spex_left_lu_reach.c index 03cb5e6a..e73d84f4 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_reach.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_reach.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_reach: compute set of nodes reachable from an input set //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c b/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c index d5a7b89c..f2816102 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c @@ -2,8 +2,8 @@ // SPEX_LU/spex_left_lu_ref_triangular_solve: sparse REF triangular solve //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ @@ -74,10 +74,6 @@ static inline int compare (const void * a, const void * b) { return ( *(int64_t*)a - *(int64_t*)b ); - - int64_t x = (* ((int64_t *) a)) ; - int64_t y = (* ((int64_t *) b)) ; - return (x < y ? -1 : ((x == y) ? 0 : 1)) ; } SPEX_info spex_left_lu_ref_triangular_solve // sparse REF triangular solve @@ -136,7 +132,7 @@ SPEX_info spex_left_lu_ref_triangular_solve // sparse REF triangular solve } // Sort xi[top..n-1] - qsort (&xi[top], n-top, sizeof (int64_t), compare) ; + qsort(&xi[top], n-top, sizeof(int64_t), compare); // Place xi back in original value for (j = top; j < n; j++) diff --git a/SPEX/SPEX_LU/Source/spex_lu_internal.h b/SPEX/SPEX_LU/Source/spex_lu_internal.h index 73ba8990..577e4bf4 100644 --- a/SPEX/SPEX_LU/Source/spex_lu_internal.h +++ b/SPEX/SPEX_LU/Source/spex_lu_internal.h @@ -3,8 +3,8 @@ // SPEX_LU //------------------------------------------------------------------------------ -// SPEX_LU: (c) 2019-2024, Christopher Lourenco, Jinhao Chen,, -// Erick Moreno-Centeno, and Timothy A. Davis. All Rights Reserved. +// SPEX_LU: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_Utilities/License/license.txt b/SPEX/SPEX_Utilities/License/license.txt index dc366870..44cb8856 100644 --- a/SPEX/SPEX_Utilities/License/license.txt +++ b/SPEX/SPEX_Utilities/License/license.txt @@ -1,7 +1,7 @@ SPEX_Utilities: Utility functions for SParse EXact package -Copyright (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +Copyright (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. All Rights Reserved. Available at: diff --git a/SPEX/SPEX_Utilities/Source/SPEX_calloc.c b/SPEX/SPEX_Utilities/Source/SPEX_calloc.c index fa982af8..49bdc9d4 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_calloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_calloc.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_calloc: wrapper for calloc //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c b/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c index 16366824..e521a3e8 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_create_default_options: set defaults //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c b/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c index f85cc5f9..a6f14b86 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c @@ -3,8 +3,8 @@ // *numerically* (thus pattern-wise) symmetric //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c b/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c index bce7d24f..c9ae0116 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c @@ -3,8 +3,8 @@ // SPEX_factorization data type. //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -29,7 +29,7 @@ SPEX_info SPEX_factorization_free if ((F_handle != NULL) && (*F_handle != NULL)) { - SPEX_mpq_clear ((*F_handle)->scale_for_A); + SPEX_MPQ_CLEAR((*F_handle)->scale_for_A); SPEX_matrix_free(&((*F_handle)->L), option); SPEX_matrix_free(&((*F_handle)->U), option); diff --git a/SPEX/SPEX_Utilities/Source/SPEX_finalize.c b/SPEX/SPEX_Utilities/Source/SPEX_finalize.c index 5bfeed35..9276f9fc 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_finalize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_finalize.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_finalize: finalize SPEX //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_free.c b/SPEX/SPEX_Utilities/Source/SPEX_free.c index c746a62e..28db44e2 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_free.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_free: wrapper for free //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 217a9110..56ed2b1f 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_gmp.c: interface to the gmp library //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -66,9 +66,7 @@ #include "spex_util_internal.h" // ignore warnings about unused parameters in this file -#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-parameter" -#endif //------------------------------------------------------------------------------ // thread-local-storage @@ -120,7 +118,6 @@ // SPEX will not be thread-safe. spex_gmp_t *spex_gmp = NULL ; - #warning "SPEX not compiled with OpenMP or thread keyword; SPEX will not be thread-safe!" #endif @@ -131,10 +128,10 @@ #define SPEX_GMP_WRAPPER_START_HELPER(z1,z2,q,fr) \ /* spex_gmp_t *spex_gmp = spex_gmp_get ( ) ; */ \ if (spex_gmp == NULL) return (SPEX_OUT_OF_MEMORY); \ - spex_gmp->mpz_archive = z1 ; \ - spex_gmp->mpz_archive2 = z2 ; \ - spex_gmp->mpq_archive = q ; \ - spex_gmp->mpfr_archive = fr ; \ + spex_gmp->mpz_archive = (mpz_t *) z1 ; \ + spex_gmp->mpz_archive2 = (mpz_t *) z2 ; \ + spex_gmp->mpq_archive = (mpq_t *) q ; \ + spex_gmp->mpfr_archive = (mpfr_t *) fr ; \ /* setjmp returns 0 if called from here, or > 0 if from longjmp */ \ int status = setjmp (spex_gmp->environment) ; \ if (status != 0) \ @@ -371,44 +368,38 @@ void *spex_gmp_allocate // spex_gmp_safe_free: free a block of memory and remove it from the archive //------------------------------------------------------------------------------ -// see mpfr-4.2.1/src/mpfr-impl.h, for MPFR_GET_REAL_PTR -#define SPEX_MPFR_GET_REAL_PTR(x) ((x)->_mpfr_d - 1) - static inline void spex_gmp_safe_free (void *p) { if (spex_gmp != NULL) { if (spex_gmp->mpz_archive != NULL) { - if (p == SPEX_MPZ_PTR((spex_gmp->mpz_archive))) + if (p == SPEX_MPZ_PTR(*(spex_gmp->mpz_archive))) { - SPEX_MPZ_PTR((spex_gmp->mpz_archive)) = NULL ; + SPEX_MPZ_PTR(*(spex_gmp->mpz_archive)) = NULL ; } } if (spex_gmp->mpz_archive2 != NULL) { - if (p == SPEX_MPZ_PTR((spex_gmp->mpz_archive2))) + if (p == SPEX_MPZ_PTR(*(spex_gmp->mpz_archive2))) { - SPEX_MPZ_PTR((spex_gmp->mpz_archive2)) = NULL ; + SPEX_MPZ_PTR(*(spex_gmp->mpz_archive2)) = NULL ; } } if (spex_gmp->mpq_archive != NULL) { - if (p == SPEX_MPZ_PTR(SPEX_MPQ_NUM(spex_gmp->mpq_archive))) + if (p == SPEX_MPZ_PTR(SPEX_MPQ_NUM(*spex_gmp->mpq_archive))) { - SPEX_MPZ_PTR(SPEX_MPQ_NUM(spex_gmp->mpq_archive)) = NULL ; + SPEX_MPZ_PTR(SPEX_MPQ_NUM(*spex_gmp->mpq_archive)) = NULL ; } - if (p == SPEX_MPZ_PTR(SPEX_MPQ_DEN(spex_gmp->mpq_archive))) + if (p == SPEX_MPZ_PTR(SPEX_MPQ_DEN(*spex_gmp->mpq_archive))) { - SPEX_MPZ_PTR(SPEX_MPQ_DEN(spex_gmp->mpq_archive)) = NULL ; + SPEX_MPZ_PTR(SPEX_MPQ_DEN(*spex_gmp->mpq_archive)) = NULL ; } } if (spex_gmp->mpfr_archive != NULL) { - if (p == SPEX_MPFR_GET_REAL_PTR(spex_gmp->mpfr_archive)) - { - SPEX_MPFR_MANT(spex_gmp->mpfr_archive) = NULL ; - } + if (p == SPEX_MPFR_REAL_PTR(*spex_gmp->mpfr_archive)) SPEX_MPFR_MANT(*spex_gmp->mpfr_archive) = NULL ; } } SPEX_FREE (p) ; @@ -1164,7 +1155,7 @@ SPEX_info SPEX_mpz_divexact return (SPEX_PANIC); } -#ifdef SPEX_DEBUG + #ifdef SPEX_DEBUG mpq_t r ; mpq_init (r); // r = 0/1 mpz_fdiv_r (SPEX_MPQ_NUM (r), y, z); @@ -1178,7 +1169,7 @@ SPEX_info SPEX_mpz_divexact return (SPEX_PANIC); } mpq_clear (r); -#endif + #endif mpz_divexact (x, y, z); SPEX_GMP_WRAPPER_FINISH ; @@ -1787,10 +1778,7 @@ SPEX_info SPEX_mpfr_init2 ) { // ensure the mpfr number is not too big - if (size > MPFR_PREC_MAX/2) - { - return (SPEX_PANIC); - } + if (size > MPFR_PREC_MAX/2) return (SPEX_PANIC); // initialize the mpfr number SPEX_GMPFR_WRAPPER_START (x); @@ -1799,31 +1787,6 @@ SPEX_info SPEX_mpfr_init2 return (SPEX_OK); } -//------------------------------------------------------------------------------ -// SPEX_mpfr_set_prec -//------------------------------------------------------------------------------ - -/* Purpose: Set the precision of an mpfr_t number */ - -SPEX_info SPEX_mpfr_set_prec -( - mpfr_t x, // Floating point number to revise - const uint64_t size // # of bits in x -) -{ - // ensure the mpfr number is not too big - if (size > MPFR_PREC_MAX/2) - { - return (SPEX_PANIC); - } - - // set the precision of the mpfr number - SPEX_GMPFR_WRAPPER_START (x); - mpfr_set_prec (x, (mpfr_prec_t) size); - SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK); -} - //------------------------------------------------------------------------------ // SPEX_mpfr_set //------------------------------------------------------------------------------ @@ -2138,96 +2101,3 @@ SPEX_info SPEX_mpfr_free_cache ( void ) return (SPEX_OK); } -//------------------------------------------------------------------------------ -// SPEX_mpz_set_null -//------------------------------------------------------------------------------ - -// Purpose: initialize the contents of an mpz_t value - -SPEX_info SPEX_mpz_set_null -( - mpz_t x -) -{ - SPEX_MPZ_SET_NULL (x) ; - return (SPEX_OK); -} - -//------------------------------------------------------------------------------ -// SPEX_mpq_set_null -//------------------------------------------------------------------------------ - -// Purpose: initialize the contents of an mpq_t value - -SPEX_info SPEX_mpq_set_null -( - mpq_t x -) -{ - SPEX_MPQ_SET_NULL (x) ; - return (SPEX_OK); -} - -//------------------------------------------------------------------------------ -// SPEX_mpfr_set_null -//------------------------------------------------------------------------------ - -// Purpose: initialize the contents of an mpfr_t value - -SPEX_info SPEX_mpfr_set_null -( - mpfr_t x -) -{ - SPEX_MPFR_SET_NULL (x) ; - return (SPEX_OK); -} - -//------------------------------------------------------------------------------ -// SPEX_mpz_clear -//------------------------------------------------------------------------------ - -// Purpose: safely clear an mpz_t value - -SPEX_info SPEX_mpz_clear -( - mpz_t x -) -{ - SPEX_MPZ_CLEAR (x) ; - return (SPEX_OK); -} - -//------------------------------------------------------------------------------ -// SPEX_mpq_clear -//------------------------------------------------------------------------------ - -// Purpose: safely clear an mpq_t value - -SPEX_info SPEX_mpq_clear -( - mpq_t x -) -{ - if (x != NULL) - { - SPEX_MPQ_CLEAR (x) ; - } - return (SPEX_OK); -} - -//------------------------------------------------------------------------------ -// SPEX_mpfr_clear -//------------------------------------------------------------------------------ - -// Purpose: safely clear an mpfr_t value - -SPEX_info SPEX_mpfr_clear -( - mpfr_t x -) -{ - SPEX_MPFR_CLEAR (x) ; - return (SPEX_OK); -} - diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index 869eb915..424802b4 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_initialize: initialize SPEX //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -38,11 +38,10 @@ void spex_set_initialized (bool s) SPEX_info SPEX_initialize ( void ) { - if (spex_initialized( )) - { - // SPEX is already initialized - return (SPEX_PANIC); - } + if (spex_initialized( )) return (SPEX_PANIC); + + // SPEX requires GMP to support bit counts that are 64-bit integers + if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) return (SPEX_PANIC); // tell GMP and MPFR which memory allocation functions to use mp_set_memory_functions diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c index 819ef97b..5d1d7e58 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_initialize_expert: intialize SPEX memory functions for GMP //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_malloc.c b/SPEX/SPEX_Utilities/Source/SPEX_malloc.c index ac93fdc7..422a138f 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_malloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_malloc.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_malloc: wrapper for malloc //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c index 95ac35c7..1fb6dea4 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_matrix_allocate: allocate a SPEX_matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -24,20 +24,11 @@ #define SPEX_FREE_ALL \ { \ - SPEX_matrix_free (&A, option); \ + SPEX_matrix_free (&A, option); \ } #include "spex_util_internal.h" -#if defined (__GNUC__) - #if ( __GNUC__ == 11) - // gcc 11 has a bug that triggers a spurious warning for the call - // to SPEX_MPQ_INIT (A->scale), from -Wstringop-overflow. see - // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101854 - #pragma GCC diagnostic ignored "-Wstringop-overflow" - #endif -#endif - SPEX_info SPEX_matrix_allocate ( SPEX_matrix *A_handle, // matrix to allocate @@ -110,7 +101,7 @@ SPEX_info SPEX_matrix_allocate A->x_shallow = false ; // A->scale = 1 - SPEX_MPQ_INIT (A->scale) ; + SPEX_CHECK (spex_create_mpq (A->scale)); SPEX_MPQ_SET_UI (A->scale, 1, 1); //-------------------------------------------------------------------------- diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c index f40223b8..a1c5da53 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c @@ -2,19 +2,17 @@ // SPEX_Utilities/SPEX_matrix_check: check if a matrix is OK //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -#define SPEX_FREE_ALL \ -{ \ - SPEX_FREE (work); \ - SPEX_mpz_clear (q); \ - SPEX_mpz_clear (r); \ -} +#define SPEX_FREE_ALL \ + SPEX_FREE (work); \ + SPEX_MPZ_CLEAR(q); \ + SPEX_MPZ_CLEAR(r); #include "spex_util_internal.h" @@ -23,7 +21,7 @@ lines++ ; \ if (pr == 2 && lines > 30) \ { \ - SPEX_PRINTF (" ...\n"); \ + SPEX_PRINTF (" ...\n"); \ pr = 1 ; \ } @@ -145,8 +143,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code // paranoia: check prec here: cast to mprf_prec_t, and back, assert // equality, if not equal then return SPEX_PANIC mpz_t q, r; - SPEX_mpz_set_null (q); - SPEX_mpz_set_null (r); + SPEX_MPZ_SET_NULL(q); + SPEX_MPZ_SET_NULL(r); int64_t lines = 0 ; // # of lines printed so far @@ -420,7 +418,7 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code } // sort the (i,j) indices - qsort (work, nz, 2 * sizeof (int64_t), compar) ; + qsort (work, nz, 2 * sizeof (int64_t), compar); // check for duplicates for (p = 1 ; p < nz ; p++) diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c index dc27a9b6..efb5fafe 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_matrix_copy: create a copy of a matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c index 0edf8e5d..c7a5d9f1 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -2,17 +2,15 @@ // SPEX_Utilities/SPEX_matrix_free: free a SPEX_matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ // Free a SPEX_matrix. Any shallow component is not freed. -#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-variable" -#endif #include "spex_util_internal.h" SPEX_info SPEX_matrix_free @@ -39,44 +37,67 @@ SPEX_info SPEX_matrix_free // free any non-shallow components //-------------------------------------------------------------------------- - // free the integer pattern - if (!(A->p_shallow)) SPEX_FREE (A->p); - if (!(A->i_shallow)) SPEX_FREE (A->i); - if (!(A->j_shallow)) SPEX_FREE (A->j); + + // free the integer pattern + if (!(A->p_shallow)) SPEX_FREE (A->p); + if (!(A->i_shallow)) SPEX_FREE (A->i); + if (!(A->j_shallow)) SPEX_FREE (A->j); - // free the values - if (!(A->x_shallow)) - { - switch (A->type) + // free the values + if (!(A->x_shallow)) { - case SPEX_MPZ: - spex_free_mpz_array (&(A->x.mpz), A->nzmax) ; - break ; - - case SPEX_MPQ: - spex_free_mpq_array (&(A->x.mpq), A->nzmax) ; - break ; - - case SPEX_MPFR: - spex_free_mpfr_array (&(A->x.mpfr), A->nzmax) ; - break ; - - case SPEX_INT64: - SPEX_FREE (A->x.int64) ; - break ; - - case SPEX_FP64: - SPEX_FREE (A->x.fp64) ; - break ; - - default: - // do nothing - break ; + switch (A->type) + { + case SPEX_MPZ: + if ( A->x.mpz != NULL) + { + for (int64_t i = 0; i < A->nzmax; i++) + { + SPEX_MPZ_CLEAR( A->x.mpz[i]); + } + } + SPEX_FREE (A->x.mpz); + break ; + + case SPEX_MPQ: + if ( A->x.mpq != NULL) + { + for (int64_t i = 0; i < A->nzmax; i++) + { + SPEX_MPQ_CLEAR( A->x.mpq[i]); + } + } + SPEX_FREE (A->x.mpq); + break ; + + case SPEX_MPFR: + if ( A->x.mpfr != NULL) + { + for (int64_t i = 0; i < A->nzmax; i++) + { + SPEX_MPFR_CLEAR( A->x.mpfr[i]); + } + } + SPEX_FREE (A->x.mpfr); + break ; + + case SPEX_INT64: + SPEX_FREE (A->x.int64); + break ; + + case SPEX_FP64: + SPEX_FREE (A->x.fp64); + break ; + + default: + // do nothing + break ; + } } - } + // A->scale is never shallow - SPEX_mpq_clear (A->scale); + SPEX_MPQ_CLEAR (A->scale); //-------------------------------------------------------------------------- // free the header diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c index 0747e676..2d5e8fe1 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c @@ -2,16 +2,14 @@ // SPEX_Utilities/SPEX_matrix_nnz: find # of entries in a matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later //------------------------------------------------------------------------------ -#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-variable" -#endif #include "spex_util_internal.h" SPEX_info SPEX_matrix_nnz // find the # of entries in A diff --git a/SPEX/SPEX_Utilities/Source/SPEX_realloc.c b/SPEX/SPEX_Utilities/Source/SPEX_realloc.c index a8b0a526..b5e9ebce 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_realloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_realloc.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_realloc: wrapper for realloc //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c b/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c index e32a7bf3..7666123b 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c @@ -3,8 +3,8 @@ // SPEX_symbolic_analysis data type. //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c b/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c index fddb7f96..2e53c7a8 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_thread_finalize: finish SPEX for a single user thread //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c index f13b5bf7..67ab3bd2 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_thread_initialize: init SPEX for a single user thread //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_transpose.c b/SPEX/SPEX_Utilities/Source/SPEX_transpose.c index 6fa83e82..177ee8c3 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_transpose.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_transpose.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_transpose: Transpose a CSC matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/SPEX_version.c b/SPEX/SPEX_Utilities/Source/SPEX_version.c index 46918528..de4c09d4 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_version.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_version.c @@ -2,8 +2,8 @@ // SPEX_Utilities/SPEX_version: report SPEX version information //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_amd.c b/SPEX/SPEX_Utilities/Source/spex_amd.c index d5dfa81d..7f41ab89 100644 --- a/SPEX/SPEX_Utilities/Source/spex_amd.c +++ b/SPEX/SPEX_Utilities/Source/spex_amd.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_amd: Call AMD for matrix ordering //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_cast_array.c b/SPEX/SPEX_Utilities/Source/spex_cast_array.c index f1bb6349..6d54368e 100644 --- a/SPEX/SPEX_Utilities/Source/spex_cast_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_cast_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_cast_array: scale and typecast an array //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -35,12 +35,11 @@ // y_scale = 1. // -#define SPEX_FREE_ALL SPEX_mpq_clear (temp) ; +#define SPEX_FREE_ALL \ +SPEX_MPQ_CLEAR(temp); \ #include "spex_util_internal.h" -#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-variable" -#endif SPEX_info spex_cast_array ( @@ -66,7 +65,7 @@ SPEX_info spex_cast_array } SPEX_info info ; int r; - mpq_t temp; SPEX_mpq_set_null (temp); + mpq_t temp; SPEX_MPQ_SET_NULL(temp); mpfr_rnd_t round = SPEX_OPTION_ROUND (option); diff --git a/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c b/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c index 38fdd594..223971e2 100644 --- a/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c +++ b/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_cast_matrix: create a dense typecasted matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_colamd.c b/SPEX/SPEX_Utilities/Source/spex_colamd.c index b1abcd43..ff9cfb27 100644 --- a/SPEX/SPEX_Utilities/Source/spex_colamd.c +++ b/SPEX/SPEX_Utilities/Source/spex_colamd.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_colamd: Call COLAMD for matrix ordering //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c index 85b9e363..7b737460 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_create_mpfr_array: create a dense mpfr array //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -38,8 +38,12 @@ mpfr_t *spex_create_mpfr_array { if (SPEX_mpfr_init2(x[i], prec) != SPEX_OK) { - SPEX_mpfr_set_null (x[i]); - spex_free_mpfr_array (&x, n) ; + SPEX_MPFR_SET_NULL(x[i]); + for (int64_t j = 0; j < i; j++) + { + SPEX_MPFR_CLEAR( x[j]); + } + SPEX_FREE(x); return NULL; } } diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpq.c b/SPEX/SPEX_Utilities/Source/spex_create_mpq.c new file mode 100644 index 00000000..1571e204 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpq.c @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// SPEX_Utilities/spex_create_mpq: create an mpq_t entry +//------------------------------------------------------------------------------ + +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function safely creates and initializes an mpq_t entry. + */ + +// The SPEX_mpq_init function is wrapped in this method to avoid a spurious +// compiler warning in SPEX_MPQ_SET_NULL, about writing past the size of a +// variable. The warning arises when a high level of optimization is used. +// The warning cannot be supressed entirely because it would require a +// modifcation to GMP itself. + +#include "spex_util_internal.h" +SPEX_info spex_create_mpq +( + mpq_t x // mpq_t entry to be initialized +) +{ + + SPEX_info info = SPEX_mpq_init(x); + if (info != SPEX_OK) + { + // Out of memory + SPEX_MPQ_SET_NULL(x); + return info; + } + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c index 480b09fc..4e28bc69 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_create_mpq_array: create a dense mpq array //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -37,8 +37,12 @@ mpq_t *spex_create_mpq_array if (SPEX_mpq_init(x[i]) != SPEX_OK) { // Out of memory - SPEX_mpq_set_null (x[i]); - spex_free_mpq_array (&x, n) ; + SPEX_MPQ_SET_NULL(x[i]); + for (int64_t j = 0; j < i; j++) + { + SPEX_MPQ_CLEAR( x[j]); + } + SPEX_FREE(x); return NULL; } } diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c index e758be61..1e87b387 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_create_mpz_array: create a dense mpz array //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -44,10 +44,17 @@ mpz_t *spex_create_mpz_array // out of memory. NOTE: This can be triggered only when using GMP // v6.1.2 or earlier versions. For GMP v6.2.0 or later versions, // there is no memory allocation, and thus such failure will never - // occur. As a result, this code cannot be tested by the tests + // occur. As a result, this code cannot be untested by the tests // in SPEX/Tcov, when using GMP v6.2.0 or later. - SPEX_mpz_set_null (x[i]); - spex_free_mpz_array (&x, n) ; + SPEX_MPZ_SET_NULL(x[i]); + for (int64_t j = 0; j < i; j++) + { + if ( x[j] != NULL) + { + SPEX_MPZ_CLEAR( x[j]); + } + } + SPEX_FREE(x); return NULL; } #endif diff --git a/SPEX/SPEX_Utilities/Source/spex_cumsum.c b/SPEX/SPEX_Utilities/Source/spex_cumsum.c index 6a386a2a..d7f8ccd8 100644 --- a/SPEX/SPEX_Utilities/Source/spex_cumsum.c +++ b/SPEX/SPEX_Utilities/Source/spex_cumsum.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_cumsum: cumulative sum //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c index 57ce2bed..ce6de0d8 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_expand_double_array: convert double vector to mpz //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -16,9 +16,9 @@ */ #define SPEX_FREE_WORKSPACE \ - SPEX_mpz_clear (gcd); \ - SPEX_mpz_clear (one); \ - SPEX_mpq_clear (temp); \ + SPEX_MPZ_CLEAR(gcd); \ + SPEX_MPZ_CLEAR(one); \ + SPEX_MPQ_CLEAR(temp); \ SPEX_matrix_free(&x3, NULL); \ #define SPEX_FREE_ALL \ @@ -65,8 +65,8 @@ SPEX_info spex_expand_double_array // DOUBLE_MAX. In that case the multiplication could lead to inf. SPEX_matrix x3 = NULL; - mpz_t gcd, one; SPEX_mpz_set_null (gcd); SPEX_mpz_set_null (one); - mpq_t temp; SPEX_mpq_set_null (temp); + mpz_t gcd, one; SPEX_MPZ_SET_NULL(gcd); SPEX_MPZ_SET_NULL(one); + mpq_t temp; SPEX_MPQ_SET_NULL(temp); mpfr_rnd_t round = SPEX_OPTION_ROUND (option); diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c index 44ddb591..b3f06e2f 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_expand_mpfr_array: convert mpfr aray to mpz //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -15,13 +15,21 @@ * arrays to be used within SPEX. */ -#define SPEX_FREE_ALL \ -{ \ - SPEX_mpz_clear (gcd); \ - SPEX_mpz_clear (one); \ - SPEX_mpq_clear (temp); \ - spex_free_mpq_array (&x_mpq, n) ; \ -} +#define SPEX_FREE_ALL \ + SPEX_MPZ_CLEAR(gcd); \ + SPEX_MPZ_CLEAR(one); \ + SPEX_MPQ_CLEAR(temp); \ + if (x_mpq) \ + { \ + for (i = 0; i < n; i++) \ + { \ + if ( x_mpq[i] != NULL) \ + { \ + SPEX_MPQ_CLEAR(x_mpq[i]); \ + } \ + } \ + } \ + SPEX_FREE(x_mpq); #include "spex_util_internal.h" @@ -51,9 +59,9 @@ SPEX_info spex_expand_mpfr_array bool nz_found = false; mpz_t gcd, one; mpq_t *x_mpq = NULL; - SPEX_mpz_set_null (gcd); - SPEX_mpz_set_null (one); - mpq_t temp; SPEX_mpq_set_null (temp); + SPEX_MPZ_SET_NULL(gcd); + SPEX_MPZ_SET_NULL(one); + mpq_t temp; SPEX_MPQ_SET_NULL(temp); SPEX_MPQ_INIT(temp); SPEX_MPZ_INIT(gcd); diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c index 1904cee6..a7097fba 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_expand_mpq_array: convert mpq array to mpz //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -15,7 +15,7 @@ */ #define SPEX_FREE_ALL \ - SPEX_mpz_clear (temp); + SPEX_MPZ_CLEAR(temp); #include "spex_util_internal.h" @@ -33,7 +33,7 @@ SPEX_info spex_expand_mpq_array ASSERT(n >= 0); SPEX_info info ; mpz_t temp; - SPEX_mpz_set_null (temp); + SPEX_MPZ_SET_NULL(temp); SPEX_MPZ_INIT(temp); // Find LCM of denominators of x diff --git a/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c deleted file mode 100644 index 939e48a3..00000000 --- a/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Utilities/spex_free_mpfr_array: free an mpfr_t array -//------------------------------------------------------------------------------ - -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. -// All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// Free a spex mpfr_t array -#if defined (__GNUC__) -#pragma GCC diagnostic ignored "-Wunused-variable" -#endif - -#include "spex_util_internal.h" - -void spex_free_mpfr_array -( - mpfr_t **x_handle, // mpfr_t array of size n - int64_t n -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - if (x_handle == NULL || (*x_handle) == NULL) - { - // nothing to free (not an error) - return ; - } - - //-------------------------------------------------------------------------- - // free the mpfr_t array x - //-------------------------------------------------------------------------- - - mpfr_t *x = (*x_handle) ; - - for (int64_t i = 0 ; i < n ; i++) - { - SPEX_MPFR_CLEAR (x [i]) ; - } - - SPEX_FREE (x) ; - (*x_handle) = NULL ; -} - diff --git a/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c deleted file mode 100644 index 1abb64b9..00000000 --- a/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Utilities/spex_free_mpq_array: free an mpq_t array -//------------------------------------------------------------------------------ - -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. -// All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// Free a spex mpq_t array -#if defined (__GNUC__) -#pragma GCC diagnostic ignored "-Wunused-variable" -#endif - -#include "spex_util_internal.h" - -void spex_free_mpq_array -( - mpq_t **x_handle, // mpq_t array of size n - int64_t n -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - if (x_handle == NULL || (*x_handle) == NULL) - { - // nothing to free (not an error) - return ; - } - - //-------------------------------------------------------------------------- - // free the mpq_t array x - //-------------------------------------------------------------------------- - - mpq_t *x = (*x_handle) ; - - for (int64_t i = 0 ; i < n ; i++) - { - SPEX_mpq_clear (x [i]) ; - } - - SPEX_FREE (x) ; - (*x_handle) = NULL ; -} - diff --git a/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c deleted file mode 100644 index 28b7fee8..00000000 --- a/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Utilities/spex_free_mpz_array: free an mpz_t array -//------------------------------------------------------------------------------ - -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. -// All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// Free a spex mpz_t array -#if defined (__GNUC__) -#pragma GCC diagnostic ignored "-Wunused-variable" -#endif - -#include "spex_util_internal.h" - -void spex_free_mpz_array -( - mpz_t **x_handle, // mpz_t array of size n - int64_t n -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - if (x_handle == NULL || (*x_handle) == NULL) - { - // nothing to free (not an error) - return ; - } - - //-------------------------------------------------------------------------- - // free the mpz_t array x - //-------------------------------------------------------------------------- - - mpz_t *x = (*x_handle) ; - - for (int64_t i = 0 ; i < n ; i++) - { - SPEX_MPZ_CLEAR (x [i]) ; - } - - SPEX_FREE (x) ; - (*x_handle) = NULL ; -} - diff --git a/SPEX/SPEX_Utilities/Source/spex_gmp.h b/SPEX/SPEX_Utilities/Source/spex_gmp.h index 0c8cc7c4..466a3338 100644 --- a/SPEX/SPEX_Utilities/Source/spex_gmp.h +++ b/SPEX/SPEX_Utilities/Source/spex_gmp.h @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_gmp.h: definitions for SPEX_gmp.c //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -32,10 +32,10 @@ typedef struct int64_t nmalloc ; // # of malloc'd objects in spex_gmp->list int64_t nlist ; // size of the spex_gmp->list void **list ; // list of malloc'd objects - mpz_ptr mpz_archive ; // current mpz object - mpz_ptr mpz_archive2 ; // current second mpz object - mpq_ptr mpq_archive ; // current mpq object - mpfr_ptr mpfr_archive ; // current mpfr object + mpz_t *mpz_archive ; // current mpz object + mpz_t *mpz_archive2 ; // current second mpz object + mpq_t *mpq_archive ; // current mpq object + mpfr_t *mpfr_archive ; // current mpfr object int primary ; // 1 if created by SPEX_initialize; 0 for // SPEX_thread_initialize } spex_gmp_t ; @@ -80,6 +80,94 @@ void spex_gmp_dump ( void ) ; SPEX_info spex_gmp_failure (int status) ; +//------------------------------------------------------------------------------ +// Field access macros for MPZ/MPQ/MPFR struct +//------------------------------------------------------------------------------ +// FUTURE: make these accessible to the end user? + +// (similar definition in gmp-impl.h and mpfr-impl.h) + +#define SPEX_MPZ_SIZ(x) ((x)->_mp_size) +#define SPEX_MPZ_PTR(x) ((x)->_mp_d) +#define SPEX_MPZ_ALLOC(x) ((x)->_mp_alloc) +#define SPEX_MPQ_NUM(x) mpq_numref(x) +#define SPEX_MPQ_DEN(x) mpq_denref(x) +#define SPEX_MPFR_MANT(x) ((x)->_mpfr_d) +#define SPEX_MPFR_EXP(x) ((x)->_mpfr_exp) +#define SPEX_MPFR_PREC(x) ((x)->_mpfr_prec) +#define SPEX_MPFR_SIGN(x) ((x)->_mpfr_sign) + +/*re-define but same result: */ +#define SPEX_MPFR_REAL_PTR(x) (&((x)->_mpfr_d[-1])) + +/* Invalid exponent value (to track bugs...) */ +#define SPEX_MPFR_EXP_INVALID \ + ((mpfr_exp_t) 1 << (GMP_NUMB_BITS*sizeof(mpfr_exp_t)/sizeof(mp_limb_t)-2)) + +/* Macros to set the pointer in mpz_t/mpq_t/mpfr_t variable to NULL. It is best + * practice to call these macros immediately after mpz_t/mpq_t/mpfr_t variable + * is declared, and before the mp*_init function is called. It would help to + * prevent error when SPEX_MP*_CLEAR is called before the variable is + * successfully initialized. + */ + +#define SPEX_MPZ_SET_NULL(x) \ +{ \ + SPEX_MPZ_PTR(x) = NULL; \ + SPEX_MPZ_SIZ(x) = 0; \ + SPEX_MPZ_ALLOC(x) = 0; \ +} + +#define SPEX_MPQ_SET_NULL(x) \ +{ \ + SPEX_MPZ_PTR(SPEX_MPQ_NUM(x)) = NULL; \ + SPEX_MPZ_SIZ(SPEX_MPQ_NUM(x)) = 0; \ + SPEX_MPZ_ALLOC(SPEX_MPQ_NUM(x)) = 0; \ + SPEX_MPZ_PTR(SPEX_MPQ_DEN(x)) = NULL; \ + SPEX_MPZ_SIZ(SPEX_MPQ_DEN(x)) = 0; \ + SPEX_MPZ_ALLOC(SPEX_MPQ_DEN(x)) = 0; \ +} + +#define SPEX_MPFR_SET_NULL(x) \ +{ \ + SPEX_MPFR_MANT(x) = NULL; \ + SPEX_MPFR_PREC(x) = 0; \ + SPEX_MPFR_SIGN(x) = 1; \ + SPEX_MPFR_EXP(x) = SPEX_MPFR_EXP_INVALID; \ +} + +/* GMP does not give a mechanism to tell a user when an mpz, mpq, or mpfr + * item has been cleared; thus, if mp*_clear is called on an object that + * has already been cleared, gmp will crash. It is also not possible to + * set a mp*_t = NULL. Thus, this mechanism modifies the internal GMP + * size of entries to avoid crashing in the case that a mp*_t is cleared + * multiple times. + */ + +#define SPEX_MPZ_CLEAR(x) \ +{ \ + if ((x) != NULL && SPEX_MPZ_PTR(x) != NULL) \ + { \ + mpz_clear(x); \ + SPEX_MPZ_SET_NULL(x); \ + } \ +} + +#define SPEX_MPQ_CLEAR(x) \ +{ \ + SPEX_MPZ_CLEAR(SPEX_MPQ_NUM(x)); \ + SPEX_MPZ_CLEAR(SPEX_MPQ_DEN(x)); \ +} + +#define SPEX_MPFR_CLEAR(x) \ +{ \ + if ((x) != NULL && SPEX_MPFR_MANT(x) != NULL)\ + { \ + mpfr_clear(x); \ + SPEX_MPFR_SET_NULL(x); \ + } \ +} + //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //-------------------------------GMP/MPFR wrapper macros------------------------ @@ -154,4 +242,5 @@ SPEX_info spex_gmp_failure (int status) ; #define SPEX_MPFR_SGN(sgn,x) SPEX_CHECK( SPEX_mpfr_sgn (sgn,x) ) #define SPEX_MPFR_FREE_CACHE() SPEX_CHECK( SPEX_mpfr_free_cache () ) + #endif diff --git a/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c b/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c index 4cf2f29f..bb7ba8a0 100644 --- a/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c +++ b/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_matrix_mul: multiplies a MPZ matrix by a scalar //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c b/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c index 93378e22..0e886696 100644 --- a/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c +++ b/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c @@ -3,8 +3,8 @@ // as A_out = P*A_in //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c b/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c index ff914337..3754bf6d 100644 --- a/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c +++ b/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_sparse_collapse: shrink space required by CSC mpz matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c b/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c index 8428f773..0607a5cd 100644 --- a/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c +++ b/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_sparse_realloc: double the space for a sparse mpz matrix //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index fbf11c41..3ca7c885 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -2,8 +2,8 @@ // SPEX_Utilities/spex_util_internal: include file for internal use in SPEX_Utility functions //------------------------------------------------------------------------------ -// SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX_Utilities: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -15,10 +15,8 @@ #ifndef SPEX_UTIL_INTERNAL_H #define SPEX_UTIL_INTERNAL_H -#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wunused-value" -#endif //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -27,11 +25,10 @@ //------------------------------------------------------------------------------ // Standard C libraries -#include -#include #include -#include -#include + +// SuiteSparse headers +#include "SuiteSparse_config.h" // user-callable functions #include "SPEX.h" @@ -39,11 +36,6 @@ // SPEX interface to GMP and MPFR #include "spex_gmp.h" -// SuiteSparse headers -#include "SuiteSparse_config.h" -#include "colamd.h" -#include "amd.h" - //------------------------------------------------------------------------------ // debugging //------------------------------------------------------------------------------ @@ -151,34 +143,31 @@ // Local variables (only declared, allocated and freed inside an if, for // example) do not go inside the workspace. +#ifdef SPEX_DEBUG -// SPEX_CHECK: similar to SPEX_TRY (which is user-accessible). The SPEX_CHECK -// macro is used internally. - -#define SPEX_CHECK(method) \ -{ \ - info = (method); \ - if (info != SPEX_OK) \ - { \ - SPEX_FREE_ALL; \ - return (info); \ - } \ -} - -//------------------------------------------------------------------------------ -// check versions of SuiteSparse packages -//------------------------------------------------------------------------------ + #define SPEX_CHECK(method) \ + { \ + info = (method); \ + if (info != SPEX_OK) \ + { \ + printf("file %s line %d\n",__FILE__,__LINE__);\ + SPEX_FREE_ALL; \ + return (info); \ + } \ + } -#if !defined (SUITESPARSE__VERSION) || SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0) -#error "SPEX requires SuiteSparse_config 7.7.0 or later" -#endif +#else -#if !defined (AMD__VERSION) || AMD__VERSION < SUITESPARSE__VERCODE(3,3,2) -#error "SPEX requires AMD 3.3.2 or later" -#endif + #define SPEX_CHECK(method) \ + { \ + info = (method); \ + if (info != SPEX_OK) \ + { \ + SPEX_FREE_ALL; \ + return (info); \ + } \ + } -#if !defined (COLAMD__VERSION) || COLAMD__VERSION < SUITESPARSE__VERCODE(3,3,3) -#error "SPEX requires COLAMD 3.3.3 or later" #endif //------------------------------------------------------------------------------ @@ -203,8 +192,12 @@ #define SPEX_PR2(...) { if (pr >= 2) SPEX_PRINTF (__VA_ARGS__) } #define SPEX_PR3(...) { if (pr >= 3) SPEX_PRINTF (__VA_ARGS__) } + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//----------------------------------------------------- //------------------------------------------------------------------------------ -// Default parameter values //------------------------------------------------------------------------------ // Tolerance used in the pivoting schemes. This number can be anything in @@ -291,88 +284,7 @@ #define SPEX_OPTION_ALGORITHM(option) \ SPEX_OPTION (option, algo, SPEX_DEFAULT_ALGORITHM) -//------------------------------------------------------------------------------ -// Field access macros for MPZ/MPQ/MPFR struct -//------------------------------------------------------------------------------ - -// Thse macros rely on GMP and MPFR definitions in gmp.h, but which are not -// necessarily meant to be accessed by the application (SPEX) that is using -// GMP. They provide access to the internal structure for the MPZ, MPQ, and -// MPFR data types. - -#define SPEX_MPZ_SIZ(x) ((x)->_mp_size) -#define SPEX_MPZ_PTR(x) ((x)->_mp_d) -#define SPEX_MPZ_ALLOC(x) ((x)->_mp_alloc) -#define SPEX_MPQ_NUM(x) mpq_numref(x) -#define SPEX_MPQ_DEN(x) mpq_denref(x) -#define SPEX_MPFR_MANT(x) ((x)->_mpfr_d) -#define SPEX_MPFR_EXP(x) ((x)->_mpfr_exp) -#define SPEX_MPFR_PREC(x) ((x)->_mpfr_prec) -#define SPEX_MPFR_SIGN(x) ((x)->_mpfr_sign) - -// Invalid exponent value (to track bugs...) -#define SPEX_MPFR_EXP_INVALID \ - ((mpfr_exp_t) 1 << (GMP_NUMB_BITS*sizeof(mpfr_exp_t)/sizeof(mp_limb_t)-2)) - -/* Macros to set the pointer in mpz_t/mpq_t/mpfr_t variable to NULL. It is best - * practice to call these macros immediately after mpz_t/mpq_t/mpfr_t variable - * is declared, and before the mp*_init function is called. It would help to - * prevent error when SPEX_MP*_CLEAR is called before the variable is - * successfully initialized. - */ -#define SPEX_MPZ_SET_NULL(x) \ -{ \ - SPEX_MPZ_PTR(x) = NULL; \ - SPEX_MPZ_SIZ(x) = 0; \ - SPEX_MPZ_ALLOC(x) = 0; \ -} - -#define SPEX_MPQ_SET_NULL(x) \ -{ \ - SPEX_MPZ_SET_NULL (SPEX_MPQ_NUM (x)) ; \ - SPEX_MPZ_SET_NULL (SPEX_MPQ_DEN (x)) ; \ -} - -#define SPEX_MPFR_SET_NULL(x) \ -{ \ - SPEX_MPFR_MANT(x) = NULL; \ - SPEX_MPFR_PREC(x) = 0; \ - SPEX_MPFR_SIGN(x) = 1; \ - SPEX_MPFR_EXP(x) = SPEX_MPFR_EXP_INVALID; \ -} - -/* GMP does not give a mechanism to tell a user when an mpz, mpq, or mpfr - * item has been cleared; thus, if mp*_clear is called on an object that - * has already been cleared, gmp will crash. It is also not possible to - * set a mp*_t = NULL. Thus, this mechanism modifies the internal GMP - * size of entries to avoid crashing in the case that a mp*_t is cleared - * multiple times. - */ - -#define SPEX_MPZ_CLEAR(x) \ -{ \ - if ((x) != NULL && SPEX_MPZ_PTR(x) != NULL) \ - { \ - mpz_clear(x); \ - SPEX_MPZ_SET_NULL(x); \ - } \ -} - -#define SPEX_MPQ_CLEAR(x) \ -{ \ - SPEX_MPZ_CLEAR(SPEX_MPQ_NUM(x)); \ - SPEX_MPZ_CLEAR(SPEX_MPQ_DEN(x)); \ -} - -#define SPEX_MPFR_CLEAR(x) \ -{ \ - if ((x) != NULL && SPEX_MPFR_MANT(x) != NULL)\ - { \ - mpfr_clear(x); \ - SPEX_MPFR_SET_NULL(x); \ - } \ -} // ============================================================================ // Internal Functions @@ -397,18 +309,6 @@ mpfr_t *spex_create_mpfr_array const SPEX_options option // command options containing the prec for mpfr ) ; -//------------------------------------------------------------------------------ -// spex_free_mpfr_array: free a 1D mpfr_t array -//------------------------------------------------------------------------------ - -// Purpose: frees the array created by spex_create_mpfr_array. - -void spex_free_mpfr_array -( - mpfr_t **x_handle, // mpfr_t array of size n - int64_t n -) ; - //------------------------------------------------------------------------------ // spex_create_mpq_array: Creates a 1D array, whose entries are all mpq_t type. //------------------------------------------------------------------------------ @@ -424,16 +324,11 @@ mpq_t *spex_create_mpq_array int64_t n // size of the array ) ; -//------------------------------------------------------------------------------ -// spex_free_mpq_array: delete a 1D mpq_t array -//------------------------------------------------------------------------------ - -// Purpose: frees the array created by spex_create_mpq_array. +// Create and initialize a single mpq_t variable -void spex_free_mpq_array +SPEX_info spex_create_mpq ( - mpq_t **x_handle, // mpq_t array of size n - int64_t n + mpq_t x // mpq_t entry to be initialized ) ; //------------------------------------------------------------------------------ @@ -448,25 +343,24 @@ void spex_free_mpq_array mpz_t *spex_create_mpz_array ( - int64_t n // size of the array + int64_t n // size of the array ) ; //------------------------------------------------------------------------------ -// spex_free_mpz_array: delete a 1D mpz_t array +// spex_delete_mpz_array: delete a 1D mpz_t array //------------------------------------------------------------------------------ -// Purpose: frees the array created by spex_create_mpz_array. +// Delete a simple 1D array, where A[i] is an entry of type mpz_t. -void spex_free_mpz_array +/* Purpose: This function deletes a mpz array of size n + */ + +void spex_delete_mpz_array ( - mpz_t **x_handle, // mpz_t array of size n - int64_t n + mpz_t **x, // mpz array to be deleted + int64_t n // Size of x ) ; -//------------------------------------------------------------------------------ -// spex_expand_double_array -//------------------------------------------------------------------------------ - /* Purpose: This function converts a double array of size n to an appropriate * mpz array of size n. To do this, the number is multiplied by 10^17 then, the * GCD is found. This function allows the use of matrices in double precision @@ -670,5 +564,19 @@ SPEX_info spex_amd ASSERT_KIND (A,required_kind) ; \ ASSERT_TYPE (A,required_type) ; +//------------------------------------------------------------------------------ +// SPEX_matrix macros +//------------------------------------------------------------------------------ + +// These macros simplify the access to entries in a SPEX_matrix. +// The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. + +// To access the kth entry in a SPEX_matrix using 1D linear addressing, +// in any matrix kind (CSC, triplet, or dense), in any type: +#define SPEX_1D(A,k,type) ((A)->x.type [k]) + +// To access the (i,j)th entry in a 2D SPEX_matrix, in any type: +#define SPEX_2D(A,i,j,type) SPEX_1D (A, (i)+(j)*((A)->m), type) + #endif diff --git a/SPEX/Tcov/.gitignore b/SPEX/Tcov/.gitignore index 14492e71..8b6d5d37 100644 --- a/SPEX/Tcov/.gitignore +++ b/SPEX/Tcov/.gitignore @@ -1,10 +1,15 @@ -# Ignore these files: -Makefile -spex*.c -SPEX*.c -*.out -spex_demo_lu_extended -tcov_for_cholesky -tcov_for_lu -tcov_for_lu2 -tcov_for_other +# Ignore all files: +* + +# except these files ... +!covall +!cov.awk +!cover +!covs +!gcovs +!Mats4Tcov/ +!README.txt +!simple_*.c +!simple_*.h +!tcov_*.c +!tcov_*.h diff --git a/SPEX/Tcov/simple_rand.c b/SPEX/Tcov/simple_rand.c index 6902ec3f..c61c65a4 100644 --- a/SPEX/Tcov/simple_rand.c +++ b/SPEX/Tcov/simple_rand.c @@ -2,8 +2,8 @@ // SPEX/Tcov/simple_rand.c: a very simple random number generator // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Tcov/simple_rand.h b/SPEX/Tcov/simple_rand.h index f6c1cb01..ba362469 100644 --- a/SPEX/Tcov/simple_rand.h +++ b/SPEX/Tcov/simple_rand.h @@ -2,8 +2,8 @@ // SPEX/Tcov/simple_rand.h: a very simple random number generator // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/Tcov/tcov_for_cholesky.c b/SPEX/Tcov/tcov_for_cholesky.c index 9721cf76..3d4f7748 100644 --- a/SPEX/Tcov/tcov_for_cholesky.c +++ b/SPEX/Tcov/tcov_for_cholesky.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_for_cholesky.c: test coverage for SPEX_Cholesky // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -34,6 +34,8 @@ // BRUTAL: test a method with debug malloc, until it succeeds //------------------------------------------------------------------------------ +// The method must return a bool (true if successful, false if failure). + #define NTRIAL_MAX 10000 #define BRUTAL(method) \ @@ -47,7 +49,7 @@ if (info2 != SPEX_OUT_OF_MEMORY) break ; \ } \ if (info2 != SPEX_OK) TEST_ABORT (info2) ; \ - malloc_count = INT64_MAX ; \ + malloc_count = INT64_MAX ; \ printf ("\nBrutal Cholesky trials %ld: tests passed\n", trial); \ } @@ -120,8 +122,8 @@ SPEX_info spex_test_chol_backslash (SPEX_matrix A, SPEX_matrix b, #undef SPEX_FREE_ALL #define SPEX_FREE_ALL \ { \ - SPEX_mpz_clear (q1); \ - SPEX_mpz_clear (r1); \ + SPEX_MPZ_CLEAR(q1); \ + SPEX_MPZ_CLEAR(r1); \ } SPEX_info spex_test_cdiv_qr (mpz_t n, mpz_t d) ; @@ -130,8 +132,8 @@ SPEX_info spex_test_cdiv_qr (mpz_t n, mpz_t d) { //SPEX_info info ; mpz_t q1, r1; - SPEX_mpz_set_null (q1); - SPEX_mpz_set_null (r1); + SPEX_MPZ_SET_NULL(q1); + SPEX_MPZ_SET_NULL(r1); OK2 (SPEX_mpz_init2(q1,1)); OK2 (SPEX_mpz_init2(r1,1)); @@ -317,27 +319,20 @@ int main (int argc, char *argv []) //-------------------------------------------------------------------------- // test spex_expand_mpfr_array //-------------------------------------------------------------------------- - //create mpfr array where all elements are multiples of 220 mpfr_rnd_t round = SPEX_OPTION_ROUND (option); mpfr_t* x_mpfr = spex_create_mpfr_array (3, option); mpz_t* x_mpz = spex_create_mpz_array (3); mpq_t x_scale; - SPEX_MPQ_INIT (x_scale) ; - + OK (spex_create_mpq (x_scale)); SPEX_MPQ_SET_UI (x_scale, 1, 10); for (int64_t k = 0 ; k < 3 ; k++) { SPEX_MPFR_SET_SI( x_mpfr[k],(k+2)*220, round); } - + OK ( spex_expand_mpfr_array (x_mpz, x_mpfr, x_scale, 3, option)); - - // free x_mpz, x_mpfr, and x_scale - spex_free_mpz_array (&x_mpz, 3) ; - spex_free_mpfr_array (&x_mpfr, 3) ; - SPEX_mpq_clear (x_scale) ; - + //-------------------------------------------------------------------------- // missing gmp coverage //-------------------------------------------------------------------------- @@ -409,19 +404,18 @@ int main (int argc, char *argv []) ERR(SPEX_mpz_divexact(gmp_x,gmp_y,gmp_0),SPEX_PANIC); //Free - SPEX_mpz_clear (gmp_x); - SPEX_mpz_clear (gmp_0); - SPEX_mpz_clear (gmp_y); - SPEX_mpq_clear (gmp_a); - SPEX_mpq_clear (gmp_b); - SPEX_mpq_clear (gmp_c); - SPEX_mpfr_clear (gmp_e); - SPEX_mpfr_clear (gmp_f); - SPEX_mpfr_clear (gmp_g); - SPEX_mpfr_clear (gmp_h); - SPEX_mpz_clear (gmp_n); - SPEX_mpz_clear (gmp_d); - SPEX_mpz_clear (tmpz); + SPEX_MPZ_CLEAR(gmp_x); + SPEX_MPZ_CLEAR(gmp_y); + SPEX_MPQ_CLEAR(gmp_a); + SPEX_MPQ_CLEAR(gmp_b); + SPEX_MPQ_CLEAR(gmp_c); + SPEX_MPFR_CLEAR(gmp_e); + SPEX_MPFR_CLEAR(gmp_f); + SPEX_MPFR_CLEAR(gmp_g); + SPEX_MPFR_CLEAR(gmp_h); + SPEX_MPZ_CLEAR(gmp_n); + SPEX_MPZ_CLEAR(gmp_d); + SPEX_MPZ_CLEAR(tmpz); //-------------------------------------------------------------------------- // error handling @@ -562,7 +556,6 @@ int main (int argc, char *argv []) SPEX_PANIC); spex_set_initialized (true); SPEX_FREE_ALL; - SPEX_finalize ( ) ; printf ("%s: all tests passed\n\n", __FILE__); fprintf (stderr, "%s: all tests passed\n\n", __FILE__); diff --git a/SPEX/Tcov/tcov_for_lu.c b/SPEX/Tcov/tcov_for_lu.c index 8cd13cb3..d967ac74 100644 --- a/SPEX/Tcov/tcov_for_lu.c +++ b/SPEX/Tcov/tcov_for_lu.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_for_lu.c: test coverage for SPEX_LU // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -263,6 +263,11 @@ int main ( int argc, char *argv[]) Ab_type, malloc_count); } + /*mpz_t mpz1, mpz2, mpz3; + SPEX_MPZ_SET_NULL(mpz1); + SPEX_MPZ_SET_NULL(mpz2); + SPEX_MPZ_SET_NULL(mpz3);*/ + int64_t n=4, numRHS=1, j, nz=11; //------------------------------------------------------------------ diff --git a/SPEX/Tcov/tcov_for_lu2.c b/SPEX/Tcov/tcov_for_lu2.c index af4abec6..673aeb36 100644 --- a/SPEX/Tcov/tcov_for_lu2.c +++ b/SPEX/Tcov/tcov_for_lu2.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_for_lu2.c: test coverage for SPEX_Cholesky // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -127,7 +127,8 @@ int main (int argc, char *argv []) malloc_count = INT64_MAX ; OK (SPEX_create_default_options (&option)); - + + //-------------------------------------------------------------------------- // load the test matrix and create the right-hand-side //-------------------------------------------------------------------------- @@ -140,7 +141,8 @@ int main (int argc, char *argv []) printf ("\nInput matrix: %ld-by-%ld with %ld entries\n", n, m, anz); OK ((n != m) ? SPEX_PANIC : SPEX_OK); create_test_rhs (&b, A->n); - + + //TESTS option->pivot = SPEX_TOL_LARGEST; option->order = SPEX_AMD ; @@ -148,14 +150,14 @@ int main (int argc, char *argv []) printf ("LU backslash, AMD ordering, no malloc testing:\n"); OK (spex_test_lu_backslash (A, b, option)); option->print_level = 0 ; - + option->pivot = SPEX_FIRST_NONZERO ; option->order = SPEX_COLAMD ; option->print_level = 3 ; printf ("LU backslash, AMD ordering, no malloc testing:\n"); OK (spex_test_lu_backslash (A, b, option)); option->print_level = 0 ; - + option->pivot = SPEX_TOL_SMALLEST ; option->tol = 0; option->order = SPEX_COLAMD ; @@ -166,21 +168,16 @@ int main (int argc, char *argv []) OK (SPEX_matrix_free (&A, option)); OK (SPEX_matrix_free (&b, option)); - + option->order = SPEX_AMD ; read_test_matrix (&A, "../ExampleMats/test1.mat.txt"); OK (SPEX_lu_analyze( &S, A, option)); OK (SPEX_symbolic_analysis_free(&S, option)); OK (SPEX_matrix_free (&A, option)); - + read_test_matrix (&A, "../ExampleMats/test5.mat.txt"); - SPEX_lu_analyze( &S, A, option); - + SPEX_lu_analyze( &S, A, option); + SPEX_FREE_ALL; - OK (SPEX_finalize ( )) ; - SPEX_FREE (option) ; - - printf ("%s: all tests passed\n\n", __FILE__); - fprintf (stderr, "%s: all tests passed\n\n", __FILE__); - return (0) ; + } diff --git a/SPEX/Tcov/tcov_for_other.c b/SPEX/Tcov/tcov_for_other.c deleted file mode 100644 index b0f9b08e..00000000 --- a/SPEX/Tcov/tcov_for_other.c +++ /dev/null @@ -1,104 +0,0 @@ -// ---------------------------------------------------------------------------- -// SPEX/Tcov/tcov_for_other.c: test coverage for other methods -// ---------------------------------------------------------------------------- - -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. -// All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//----------------------------------------------------------------------------- - -#include "tcov_utilities.h" -#include "spex_demos.h" - -#undef SPEX_FREE_ALL -#define SPEX_FREE_ALL ; - -//------------------------------------------------------------------------------ -// ERR: test wrapper for SPEX_* function when expected error would produce -//------------------------------------------------------------------------------ - -#define ERR(method,expected_error) \ -{ \ - SPEX_info info5 = (method) ; \ - if (info5 != expected_error) \ - { \ - printf ("SPEX method was expected to fail, but succeeded!\n") ; \ - printf ("this error was expected:\n") ; \ - SPEX_PRINT_INFO (expected_error) ; \ - printf ("but this error was obtained:\n") ; \ - TEST_ABORT (info5) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// BRUTAL: test a method with debug malloc, until it succeeds -//------------------------------------------------------------------------------ - -#define NTRIAL_MAX 10000 - -#define BRUTAL(method) \ -{ \ - int64_t trial = 0 ; \ - SPEX_info info2 = SPEX_OK ; \ - for (trial = 0 ; trial <= NTRIAL_MAX ; trial++) \ - { \ - malloc_count = trial ; \ - info2 = (method) ; \ - if (info2 != SPEX_OUT_OF_MEMORY) break ; \ - } \ - if (info2 != SPEX_OK) TEST_ABORT (info2) ; \ - malloc_count = INT64_MAX ; \ -} - -//------------------------------------------------------------------------------ -// test program -//------------------------------------------------------------------------------ - -int main (int argc, char *argv []) -{ - - //-------------------------------------------------------------------------- - // start SPEX - //-------------------------------------------------------------------------- - - SPEX_options option = NULL ; - - OK (SPEX_initialize_expert (tcov_malloc, tcov_calloc, tcov_realloc, - tcov_free)) ; - - // disable malloc testing for the first part of the test - spex_set_gmp_ntrials (INT64_MAX) ; - malloc_count = INT64_MAX ; - - OK (SPEX_create_default_options (&option)) ; - - //-------------------------------------------------------------------------- - // basic tests of mpfr methods - //-------------------------------------------------------------------------- - - mpfr_t x ; - printf ("MPFR_PREC_MAX: %g\n", (double) MPFR_PREC_MAX) ; - ERR (SPEX_mpfr_init2 (x, MPFR_PREC_MAX), SPEX_PANIC) ; - BRUTAL (SPEX_mpfr_init2 (x, 4)) ; - ERR (SPEX_mpfr_set_prec (x, MPFR_PREC_MAX), SPEX_PANIC) ; - for (uint64_t k = 4 ; k < 32*1024 ; k = k*2) - { - BRUTAL (SPEX_mpfr_set_prec (x, k)) ; - } - OK (SPEX_mpfr_clear (x)) ; - - //-------------------------------------------------------------------------- - // finalize the tests - //-------------------------------------------------------------------------- - - SPEX_FREE_ALL ; - OK (SPEX_finalize ( )) ; - SPEX_FREE (option) ; - - printf ("%s: all tests passed\n\n", __FILE__) ; - fprintf (stderr, "%s: all tests passed\n\n", __FILE__) ; - return (0) ; -} - diff --git a/SPEX/Tcov/tcov_utilities.c b/SPEX/Tcov/tcov_utilities.c index c257d8d8..6c3ee5f1 100644 --- a/SPEX/Tcov/tcov_utilities.c +++ b/SPEX/Tcov/tcov_utilities.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_utilities.c: utility functions for tcov tests // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -109,13 +109,13 @@ int spex_gmp_realloc_test /* Purpose: Given a solution vector x, check the solution of the linear system * Ax = b. This is done by computing a rational-arthmetic A*x == b. This * function is provided here only used for debugging purposes, as the routines - * within SPEX are guaranteed to be exact. + * within SPEX are gauranteed to be exact. */ #undef SPEX_FREE_ALL -#define SPEX_FREE_ALL \ - SPEX_mpq_clear (temp); \ - SPEX_mpq_clear (scale); \ +#define SPEX_FREE_ALL \ + SPEX_MPQ_CLEAR(temp); \ + SPEX_MPQ_CLEAR(scale); \ SPEX_matrix_free(&b2, NULL); SPEX_info spex_check_solution @@ -146,8 +146,8 @@ SPEX_info spex_check_solution int64_t p, j, i ; SPEX_matrix b2 = NULL; // b2 stores the solution of A*x - mpq_t temp; SPEX_mpq_set_null (temp); - mpq_t scale; SPEX_mpq_set_null (scale); + mpq_t temp; SPEX_MPQ_SET_NULL(temp); + mpq_t scale; SPEX_MPQ_SET_NULL(scale); SPEX_MPQ_INIT(temp); SPEX_MPQ_INIT(scale); diff --git a/SPEX/Tcov/tcov_utilities.h b/SPEX/Tcov/tcov_utilities.h index af23bdd5..c1615b42 100644 --- a/SPEX/Tcov/tcov_utilities.h +++ b/SPEX/Tcov/tcov_utilities.h @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_utilities.h: utilities for tcov tests // ---------------------------------------------------------------------------- -// SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. +// SPEX: (c) 2019-2023, Chris Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. // All Rights Reserved. // SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later diff --git a/SPEX/cmake_modules/FindGMP.cmake b/SPEX/cmake_modules/FindGMP.cmake index bd4a224f..2fa7773c 100644 --- a/SPEX/cmake_modules/FindGMP.cmake +++ b/SPEX/cmake_modules/FindGMP.cmake @@ -4,7 +4,7 @@ # The following copyright and license applies to just this file only, not to # the library itself: -# FindGMP.cmake, Copyright (c) 2022-2024, Timothy A. Davis. All Rights Reserved. +# FindGMP.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- @@ -27,7 +27,7 @@ if ( DEFINED ENV{CMAKE_PREFIX_PATH} ) # import CMAKE_PREFIX_PATH, typically created by spack - list ( APPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) + set ( CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) endif ( ) # include files for gmp diff --git a/SPEX/cmake_modules/FindMPFR.cmake b/SPEX/cmake_modules/FindMPFR.cmake index c5a3e037..fae9cb25 100644 --- a/SPEX/cmake_modules/FindMPFR.cmake +++ b/SPEX/cmake_modules/FindMPFR.cmake @@ -4,7 +4,7 @@ # The following copyright and license applies to just this file only, not to # the library itself: -# FindMPFR.cmake, Copyright (c) 2022-2024, Timothy A. Davis. All Rights Reserved. +# FindMPFR.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- @@ -27,7 +27,7 @@ if ( DEFINED ENV{CMAKE_PREFIX_PATH} ) # import CMAKE_PREFIX_PATH, typically created by spack - list ( APPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) + set ( CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) endif ( ) # include files for mpfr diff --git a/SPEX/cmake_modules/FindSPEX.cmake b/SPEX/cmake_modules/FindSPEX.cmake new file mode 100644 index 00000000..8e4509f8 --- /dev/null +++ b/SPEX/cmake_modules/FindSPEX.cmake @@ -0,0 +1,114 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/SPEX/cmake_modules/FindSPEX.cmake +#------------------------------------------------------------------------------- + +# The following copyright and license applies to just this file only, not to +# the library itself: +# FindSPEX.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +#------------------------------------------------------------------------------- + +# Finds the SPEX include file and compiled library and sets: + +# SPEX_INCLUDE_DIR - where to find SPEX.h +# SPEX_LIBRARY - dynamic SPEX library +# SPEX_STATIC - static SPEX library +# SPEX_LIBRARIES - libraries when using SPEX +# SPEX_FOUND - true if SPEX found + +# set ``SPEX_ROOT`` to a SPEX installation root to +# tell this module where to look. + +# All the Find*.cmake files in SuiteSparse are installed by 'make install' into +# /usr/local/lib/cmake/SuiteSparse (where '/usr/local' is the +# ${CMAKE_INSTALL_PREFIX}). To access this file, place the following commands +# in your CMakeLists.txt file. See also SuiteSparse/Example/CMakeLists.txt: +# +# set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} +# ${CMAKE_INSTALL_PREFIX}/lib/cmake/SuiteSparse ) + +#------------------------------------------------------------------------------- + +# include files for SPEX +find_path ( SPEX_INCLUDE_DIR + NAMES SPEX.h + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SPEX + HINTS ${CMAKE_SOURCE_DIR}/../SPEX + PATH_SUFFIXES include Include +) + +# dynamic SPEX library +find_library ( SPEX_LIBRARY + NAMES spex + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SPEX + HINTS ${CMAKE_SOURCE_DIR}/../SPEX + PATH_SUFFIXES lib build +) + +if ( MSVC ) + set ( STATIC_SUFFIX .lib ) +else ( ) + set ( STATIC_SUFFIX .a ) +endif ( ) + +# static SPEX library +set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) +set ( CMAKE_FIND_LIBRARY_SUFFIXES ${STATIC_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) +find_library ( SPEX_STATIC + NAMES spex + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SPEX + HINTS ${CMAKE_SOURCE_DIR}/../SPEX + PATH_SUFFIXES lib build +) +set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) + +# get version of the library from the dynamic library name +get_filename_component ( SPEX_LIBRARY ${SPEX_LIBRARY} REALPATH ) +get_filename_component ( SPEX_FILENAME ${SPEX_LIBRARY} NAME ) +string ( + REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" + SPEX_VERSION + ${SPEX_FILENAME} +) + +if ( NOT SPEX_VERSION ) + # if the version does not appear in the filename, read the include file + foreach ( _VERSION MAIN_VERSION SUB_VERSION SUBSUB_VERSION ) + file ( STRINGS ${SPEX_INCLUDE_DIR}/SPEX.h _VERSION_LINE REGEX "define[ ]+SPEX_${_VERSION}" ) + if ( _VERSION_LINE ) + string ( REGEX REPLACE ".*define[ ]+SPEX_${_VERSION}[ ]+([0-9]*).*" "\\1" _SPEX_${_VERSION} "${_VERSION_LINE}" ) + endif ( ) + unset ( _VERSION_LINE ) + endforeach ( ) + set ( SPEX_VERSION "${_SPEX_MAIN_VERSION}.${_SPEX_SUB_VERSION}.${_SPEX_SUBSUB_VERSION}" ) +endif ( ) + +set ( SPEX_LIBRARIES ${SPEX_LIBRARY} ) + +include (FindPackageHandleStandardArgs) + +find_package_handle_standard_args ( SPEX + REQUIRED_VARS SPEX_LIBRARIES SPEX_INCLUDE_DIR + VERSION_VAR SPEX_VERSION +) + +mark_as_advanced ( + SPEX_INCLUDE_DIR + SPEX_LIBRARY + SPEX_STATIC + SPEX_LIBRARIES +) + +if ( SPEX_FOUND ) + message ( STATUS "SPEX version: ${SPEX_VERSION}" ) + message ( STATUS "SPEX include: ${SPEX_INCLUDE_DIR}" ) + message ( STATUS "SPEX library: ${SPEX_LIBRARY}" ) + message ( STATUS "SPEX static: ${SPEX_STATIC}" ) +else ( ) + message ( STATUS "SPEX not found" ) +endif ( ) + diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index 02250c98..64f6695a 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -10,42 +10,30 @@ # get the version #------------------------------------------------------------------------------- -# cmake 3.22 is required to find BLAS/LAPACK for UMFPACK, CHOLMOD, SPQR, -# and ParU: +# cmake 3.22 is required to find the BLAS cmake_minimum_required ( VERSION 3.22 ) # version of both SuiteSparse and SuiteSparse_config -set ( SUITESPARSE_DATE "Mar 22, 2024" ) +set ( SUITESPARSE_DATE "Mar FIXME, 2023" ) set ( SUITESPARSE_VERSION_MAJOR 7 ) -set ( SUITESPARSE_VERSION_MINOR 7 ) +set ( SUITESPARSE_VERSION_MINOR 1 ) set ( SUITESPARSE_VERSION_SUB 0 ) -set ( SUITESPARSE_CONFIG_VERSION_MAJOR ${SUITESPARSE_VERSION_MAJOR} CACHE STRING "" FORCE ) -set ( SUITESPARSE_CONFIG_VERSION_MINOR ${SUITESPARSE_VERSION_MINOR} CACHE STRING "" FORCE ) -set ( SUITESPARSE_CONFIG_VERSION_PATCH ${SUITESPARSE_VERSION_SUB} CACHE STRING "" FORCE ) message ( STATUS "Building SuiteSparse_config version: v" ${SUITESPARSE_VERSION_MAJOR}. ${SUITESPARSE_VERSION_MINOR}. ${SUITESPARSE_VERSION_SUB} " (" ${SUITESPARSE_DATE} ")" ) -#------------------------------------------------------------------------------- -# define the project -#------------------------------------------------------------------------------- - -project ( SuiteSparseConfig - VERSION "${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB}" - LANGUAGES C ) - #------------------------------------------------------------------------------- # SuiteSparse policies #------------------------------------------------------------------------------- set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${PROJECT_SOURCE_DIR}/cmake_modules ) + ${CMAKE_SOURCE_DIR}/cmake_modules ) include ( SuiteSparsePolicy ) -if ( SUITESPARSE_HAS_FORTRAN ) +if ( NOT NFORTRAN ) include ( FortranCInterface ) else ( ) # No Fortran compiler available or enabled, configuration is not automatic. @@ -53,72 +41,26 @@ else ( ) set ( FortranCInterface_GLOBAL__MACRO ${SUITESPARSE_C_TO_FORTRAN} ) endif ( ) -message ( STATUS "C to Fortran calling protocol: ") -message ( STATUS " SUITESPARSE_HAS_FORTRAN : ${SUITESPARSE_HAS_FORTRAN}" ) -message ( STATUS " FortranCInterface_GLOBAL_MACRO : ${FortranCInterface_GLOBAL_MACRO}" ) -message ( STATUS " FortranCInterface_GLOBAL__MACRO : ${FortranCInterface_GLOBAL__MACRO}" ) - #------------------------------------------------------------------------------- -# CUDA warning on Windows with MSVC +# define the project #------------------------------------------------------------------------------- -if ( SUITESPARSE_HAS_CUDA AND MSVC ) - message ( WARNING "NOTE: CUDA on MSVC has only recently been revised. It appears to be functional but has not been as rigorously tested as I would like (I have limited resources for testing CUDA on Windows). If you encounter issues, set the cmake option SUITESPARSE_USE_CUDA to OFF and post an issue on GitHub." ) -endif ( ) +project ( suitesparseconfig + VERSION "${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB}" + LANGUAGES C ) #------------------------------------------------------------------------------- -# find OpenMP +# find library dependencies #------------------------------------------------------------------------------- -option ( SUITESPARSE_CONFIG_USE_OPENMP "ON: Use OpenMP in SuiteSparse_config if available. OFF: Do not use OpenMP. (Default: SUITESPARSE_USE_OPENMP)" ${SUITESPARSE_USE_OPENMP} ) -if ( SUITESPARSE_CONFIG_USE_OPENMP ) - if ( CMAKE_VERSION VERSION_LESS 3.24 ) - find_package ( OpenMP COMPONENTS C ) - else ( ) - find_package ( OpenMP COMPONENTS C GLOBAL ) - endif ( ) -else ( ) +option ( NOPENMP "ON: do not use OpenMP. OFF (default): use OpenMP" off ) +if ( NOPENMP ) # OpenMP has been disabled - set ( OpenMP_C_FOUND OFF ) -endif ( ) - -if ( SUITESPARSE_CONFIG_USE_OPENMP AND OpenMP_C_FOUND ) - set ( SUITESPARSE_CONFIG_HAS_OPENMP ON ) + message ( STATUS "OpenMP disabled" ) + set ( OPENMP_FOUND false ) else ( ) - set ( SUITESPARSE_CONFIG_HAS_OPENMP OFF ) + find_package ( OpenMP ) endif ( ) -message ( STATUS "SuiteSparse_config has OpenMP: ${SUITESPARSE_CONFIG_HAS_OPENMP}" ) - -# check for strict usage -if ( SUITESPARSE_USE_STRICT AND SUITESPARSE_CONFIG_USE_OPENMP AND NOT SUITESPARSE_CONFIG_HAS_OPENMP ) - message ( FATAL_ERROR "OpenMP required for SuiteSparse_config but not found" ) -endif ( ) - -# check for librt in case of fallback to "clock_gettime" -include ( CheckSymbolExists ) -check_symbol_exists ( clock_gettime "time.h" NO_RT ) -if ( NO_RT ) - message ( STATUS "Using clock_gettime without librt" ) - set ( SUITESPARSE_HAVE_CLOCK_GETTIME ON ) -else ( ) - # check if we need to link to librt for that function - set ( _orig_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ) - list ( APPEND CMAKE_REQUIRED_LIBRARIES "rt" ) - check_symbol_exists ( clock_gettime "time.h" WITH_RT ) - set ( CMAKE_REQUIRED_LIBRARIES ${_orig_CMAKE_REQUIRED_LIBRARIES} ) - if ( WITH_RT ) - message ( STATUS "Using clock_gettime with librt" ) - set ( SUITESPARSE_HAVE_CLOCK_GETTIME ON ) - endif ( ) -endif ( ) - -if ( NOT SUITESPARSE_CONFIG_USE_OPENMP AND NOT SUITESPARSE_HAVE_CLOCK_GETTIME ) - message ( STATUS "No OpenMP and no clock_gettime available. Timing functions won't work." ) -endif ( ) - -#------------------------------------------------------------------------------- -# find the BLAS -#------------------------------------------------------------------------------- include ( SuiteSparseBLAS ) @@ -135,57 +77,38 @@ configure_file ( "Config/SuiteSparse_config.h.in" # NEWLINE_STYLE LF ) #------------------------------------------------------------------------------- -# dynamic SuiteSparseConfig library properties +# dynamic suitesparseconfig library properties #------------------------------------------------------------------------------- file ( GLOB SUITESPARSECONFIG_SOURCES "*.c" ) -if ( BUILD_SHARED_LIBS ) - add_library ( SuiteSparseConfig SHARED ${SUITESPARSECONFIG_SOURCES} ) - - set_target_properties ( SuiteSparseConfig PROPERTIES - VERSION ${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB} - C_STANDARD 11 - C_STANDARD_REQUIRED ON - OUTPUT_NAME suitesparseconfig - SOVERSION ${SUITESPARSE_VERSION_MAJOR} - PUBLIC_HEADER "SuiteSparse_config.h" - WINDOWS_EXPORT_ALL_SYMBOLS ON ) - - if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) - set_target_properties ( SuiteSparseConfig PROPERTIES EXPORT_NO_SYSTEM ON ) - endif ( ) - - target_include_directories ( SuiteSparseConfig - INTERFACE $ - $ ) -endif ( ) +add_library ( suitesparseconfig SHARED ${SUITESPARSECONFIG_SOURCES} ) +set_target_properties ( suitesparseconfig PROPERTIES + VERSION ${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB} + C_STANDARD 11 + C_STANDARD_REQUIRED ON + SOVERSION ${SUITESPARSE_VERSION_MAJOR} + PUBLIC_HEADER "SuiteSparse_config.h" + WINDOWS_EXPORT_ALL_SYMBOLS ON ) #------------------------------------------------------------------------------- -# static SuiteSparseConfig library properties +# static suitesparseconfig library properties #------------------------------------------------------------------------------- -if ( BUILD_STATIC_LIBS ) - add_library ( SuiteSparseConfig_static STATIC ${SUITESPARSECONFIG_SOURCES} ) +if ( NOT NSTATIC ) + add_library ( suitesparseconfig_static STATIC ${SUITESPARSECONFIG_SOURCES} ) - set_target_properties ( SuiteSparseConfig_static PROPERTIES + set_target_properties ( suitesparseconfig_static PROPERTIES + VERSION ${SUITESPARSE_VERSION_MAJOR}.${SUITESPARSE_VERSION_MINOR}.${SUITESPARSE_VERSION_SUB} C_STANDARD 11 C_STANDARD_REQUIRED ON OUTPUT_NAME suitesparseconfig - PUBLIC_HEADER "SuiteSparse_config.h" ) + SOVERSION ${SUITESPARSE_VERSION_MAJOR} ) - if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) - set_target_properties ( SuiteSparseConfig_static PROPERTIES + if ( MSVC ) + set_target_properties ( suitesparseconfig_static PROPERTIES OUTPUT_NAME suitesparseconfig_static ) endif ( ) - - if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" ) - set_target_properties ( SuiteSparseConfig_static PROPERTIES EXPORT_NO_SYSTEM ON ) - endif ( ) - - target_include_directories ( SuiteSparseConfig_static - INTERFACE $ - $ ) endif ( ) #------------------------------------------------------------------------------- @@ -193,45 +116,24 @@ endif ( ) #------------------------------------------------------------------------------- # libm: -include ( CheckSymbolExists ) -check_symbol_exists ( fmax "math.h" NO_LIBM ) -if ( NOT NO_LIBM ) - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SuiteSparseConfig PRIVATE m ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - target_link_libraries ( SuiteSparseConfig_static PUBLIC m ) - list ( APPEND SUITESPARSE_CONFIG_STATIC_LIBS "m" ) +if ( NOT WIN32 ) + target_link_libraries ( suitesparseconfig PUBLIC m ) + if ( NOT NSTATIC ) + target_link_libraries ( suitesparseconfig_static PUBLIC m ) endif ( ) endif ( ) # OpenMP: -if ( SUITESPARSE_CONFIG_HAS_OPENMP ) +if ( OPENMP_FOUND ) message ( STATUS "OpenMP C libraries: ${OpenMP_C_LIBRARIES} ") message ( STATUS "OpenMP C include: ${OpenMP_C_INCLUDE_DIRS} ") message ( STATUS "OpenMP C flags: ${OpenMP_C_FLAGS} ") - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SuiteSparseConfig PRIVATE OpenMP::OpenMP_C ) - target_include_directories ( SuiteSparseConfig SYSTEM AFTER INTERFACE - "$" ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - target_link_libraries ( SuiteSparseConfig_static PRIVATE OpenMP::OpenMP_C ) - target_include_directories ( SuiteSparseConfig_static SYSTEM AFTER INTERFACE - "$" ) - list ( APPEND SUITESPARSE_CONFIG_STATIC_LIBS ${OpenMP_C_LIBRARIES} ) - endif ( ) -else ( ) - # librt - if ( WITH_RT ) - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( SuiteSparseConfig PRIVATE "rt" ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - target_link_libraries ( SuiteSparseConfig_static PRIVATE "rt" ) - list ( APPEND SUITESPARSE_CONFIG_STATIC_LIBS "rt" ) - endif ( ) + target_link_libraries ( suitesparseconfig PUBLIC ${OpenMP_C_LIBRARIES} ) + if ( NOT NSTATIC ) + target_link_libraries ( suitesparseconfig_static PUBLIC ${OpenMP_C_LIBRARIES} ) endif ( ) + set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS} " ) + include_directories ( ${OpenMP_C_INCLUDE_DIRS} ) endif ( ) # BLAS: @@ -245,123 +147,23 @@ if ( BLAS_FOUND ) endif ( ) #------------------------------------------------------------------------------- -# SuiteSparseConfig installation location +# suitesparseconfig installation location #------------------------------------------------------------------------------- -include ( CMakePackageConfigHelpers ) - file ( GLOB SUITESPARSE_CMAKE_MODULES "cmake_modules/*" ) -if ( BUILD_SHARED_LIBS ) - install ( TARGETS SuiteSparseConfig - EXPORT SuiteSparse_configTargets - LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - RUNTIME DESTINATION ${SUITESPARSE_BINDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) -if ( BUILD_STATIC_LIBS ) - install ( TARGETS SuiteSparseConfig_static - EXPORT SuiteSparse_configTargets - ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} - PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) -endif ( ) +install ( TARGETS suitesparseconfig + LIBRARY DESTINATION ${SUITESPARSE_LIBDIR} + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} + RUNTIME DESTINATION ${SUITESPARSE_BINDIR} + PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} ) install ( FILES ${SUITESPARSE_CMAKE_MODULES} - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SuiteSparse + DESTINATION ${SUITESPARSE_LIBDIR}/cmake/SuiteSparse COMPONENT Development ) - -# create (temporary) export target file during build -export ( EXPORT SuiteSparse_configTargets - NAMESPACE SuiteSparse:: - FILE ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configTargets.cmake ) - -# install export target and config for find_package -install ( EXPORT SuiteSparse_configTargets - NAMESPACE SuiteSparse:: - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SuiteSparse_config ) - -configure_package_config_file ( - Config/SuiteSparse_configConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configConfig.cmake - INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SuiteSparse_config ) - -write_basic_package_version_file ( - ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configConfigVersion.cmake - COMPATIBILITY SameMajorVersion ) - -install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_configConfigVersion.cmake - DESTINATION ${SUITESPARSE_PKGFILEDIR}/cmake/SuiteSparse_config ) - -#------------------------------------------------------------------------------- -# create pkg-config file -#------------------------------------------------------------------------------- - -if ( NOT MSVC ) - # This might be something like: - # /usr/lib/libgomp.so;/usr/lib/libpthread.a;m - # convert to -l flags for pkg-config, i.e.: "-lgomp -lpthread -lm" - set ( SUITESPARSE_CONFIG_STATIC_LIBS_LIST ${SUITESPARSE_CONFIG_STATIC_LIBS} ) - set ( SUITESPARSE_CONFIG_STATIC_LIBS "" ) - foreach ( _lib ${SUITESPARSE_CONFIG_STATIC_LIBS_LIST} ) - string ( FIND ${_lib} "." _pos REVERSE ) - if ( ${_pos} EQUAL "-1" ) - set ( SUITESPARSE_CONFIG_STATIC_LIBS "${SUITESPARSE_CONFIG_STATIC_LIBS} -l${_lib}" ) - continue () - endif ( ) - set ( _kinds "SHARED" "STATIC" ) - if ( WIN32 ) - list ( PREPEND _kinds "IMPORT" ) - endif ( ) - foreach ( _kind IN LISTS _kinds ) - set ( _regex ".*\\/(lib)?([^\\.]*)(${CMAKE_${_kind}_LIBRARY_SUFFIX})" ) - if ( ${_lib} MATCHES ${_regex} ) - string ( REGEX REPLACE ${_regex} "\\2" _libname ${_lib} ) - if ( NOT "${_libname}" STREQUAL "" ) - set ( SUITESPARSE_CONFIG_STATIC_LIBS "${SUITESPARSE_CONFIG_STATIC_LIBS} -l${_libname}" ) - break () - endif ( ) - endif ( ) - endforeach ( ) - endforeach ( ) - - set ( prefix "${CMAKE_INSTALL_PREFIX}" ) - set ( exec_prefix "\${prefix}" ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE ) - if (SUITESPARSE_LIBDIR_IS_ABSOLUTE) - set ( libdir "${SUITESPARSE_LIBDIR}") - else ( ) - set ( libdir "\${exec_prefix}/${SUITESPARSE_LIBDIR}") - endif ( ) - cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE ) - if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE) - set ( includedir "${SUITESPARSE_INCLUDEDIR}") - else ( ) - set ( includedir "\${prefix}/${SUITESPARSE_INCLUDEDIR}") - endif ( ) - if ( BUILD_SHARED_LIBS ) - set ( SUITESPARSE_LIB_BASE_NAME $ ) - else ( ) - set ( SUITESPARSE_LIB_BASE_NAME $ ) - endif ( ) - configure_file ( - Config/SuiteSparse_config.pc.in - SuiteSparse_config.pc.out - @ONLY - NEWLINE_STYLE LF ) - file ( GENERATE - OUTPUT SuiteSparse_config.pc - INPUT ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_config.pc.out - NEWLINE_STYLE LF ) - install ( FILES - ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse_config.pc - DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) +if ( NOT NSTATIC ) + install ( TARGETS suitesparseconfig_static + ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} ) endif ( ) -#------------------------------------------------------------------------------- -# report status -#------------------------------------------------------------------------------- - include ( SuiteSparseReport ) diff --git a/SuiteSparse_config/Config/README.md.in b/SuiteSparse_config/Config/README.md.in index 16fbb9f9..e45ae9c0 100644 --- a/SuiteSparse_config/Config/README.md.in +++ b/SuiteSparse_config/Config/README.md.in @@ -9,41 +9,11 @@ by Tim Davis, available at https://github.com/DrTimothyAldenDavis/SuiteSparse . Primary author of SuiteSparse (codes and algorithms, excl. METIS): Tim Davis -Code co-authors, in alphabetical order (not including METIS or LAGraph): - Patrick Amestoy, Mohsen Aznaveh, David Bateman, Jinhao Chen, Yanqing Chen, - Iain Duff, Joe Eaton, Les Foster, William Hager, Raye Kimmerer, Scott - Kolodziej, Chris Lourenco, Stefan Larimore, Lorena Mejia Domenzain, Erick - Moreno-Centeno, Markus Mützel, Corey Nolel, Ekanathan Palamadai, - Sivasankaran Rajamanickam, Sanjay Ranka, Wissam Sid-Lakhdar, and - Nuri Yeralan. - -LAGraph has been developed by the highest number of developers of any of -the packages in SuiteSparse and deserves its own list. The list also -appears in LAGraph/Contibutors.txt: - - Janos B. Antal, Budapest University of Technology and Economics, Hungary - Mohsen Aznaveh, Texas A&M University - David A. Bader New Jersey Institute of Technology - Aydin Buluc, Lawrence Berkeley National Lab - Jinhao Chen, Texas A&M University - Tim Davis, Texas A&M University - Florentin Dorre, Technische Univeritat Dresden, Neo4j - Marton Elekes, Budapest University of Technology and Economics, Hungary - Balint Hegyi, Budapest University of Technology and Economics, Hungary - Tanner Hoke, Texas A&M University - James Kitchen, Anaconda - Scott Kolodziej, Texas A&M University - Pranav Konduri, Texas A&M University - Roi Lipman, Redis Labs (now FalkorDB) - Tze Meng Low, Carnegie Mellon University - Tim Mattson, Intel - Scott McMillan, Carnegie Mellon University - Markus Muetzel - Michel Pelletier, Graphegon - Gabor Szarnyas, CWI Amsterdam, The Netherlands - Erik Welch, Anaconda, NVIDIA - Carl Yang, University of California at Davis, Waymo - Yongzhe Zhang, SOKENDAI, Japan +Code co-authors, in alphabetical order (not including METIS): + Patrick Amestoy, David Bateman, Jinhao Chen, Yanqing Chen, Iain Duff, + Les Foster, William Hager, Scott Kolodziej, Chris Lourenco, Stefan + Larimore, Erick Moreno-Centeno, Ekanathan Palamadai, Sivasankaran + Rajamanickam, Sanjay Ranka, Wissam Sid-Lakhdar, Nuri Yeralan. METIS is authored by George Karypis. @@ -51,460 +21,17 @@ Additional algorithm designers: Esmond Ng and John Gilbert. Refer to each package for license, copyright, and author information. ------------------------------------------------------------------------------ -Documentation ------------------------------------------------------------------------------ - -Refer to each package for the documentation on each package, typically in the -Doc subfolder. - ----------------------------------------------------------------------------- SuiteSparse branches ----------------------------------------------------------------------------- -* dev: the default branch, with recent updates of features to appear in - the next stable release. The intent is to keep this branch in - fully working order at all times, but the features will not be - finalized at any given time. -* stable: the most recent stable release. -* dev2: working branch. All submitted PRs should made to this branch. - This branch might not always be in working order. - ------------------------------------------------------------------------------ -SuiteSparse Packages ------------------------------------------------------------------------------ - -Packages in SuiteSparse, and files in this directory: - -* `AMD` - - approximate minimum degree ordering. This is the built-in AMD function in - MATLAB. - - authors: Tim Davis, Patrick Amestoy, Iain Duff - -* `bin` - - where programs are placed when compiled, for `make local` - -* `BTF` - - permutation to block triangular form - - authors: Tim Davis, Ekanathan Palamadai - -* `build` - - folder for default build tree - -* `CAMD` - - constrained approximate minimum degree ordering - - authors: Tim Davis, Patrick Amestoy, Iain Duff, Yanqing Chen - -* `CCOLAMD` - - constrained column approximate minimum degree ordering - - authors: Tim Davis, Sivasankaran Rajamanickam, Stefan Larimore. - - Algorithm design collaborators: Esmond Ng, John Gilbert (for COLAMD) - -* `ChangeLog` - - a summary of changes to SuiteSparse. See `*/Doc/ChangeLog` for details for - each package. - -* `CHOLMOD` - - sparse Cholesky factorization. Requires AMD, COLAMD, CCOLAMD, the BLAS, and - LAPACK. Optionally uses METIS. This is `chol` and `x=A\b` in MATLAB. - - author for all modules: Tim Davis - - CHOLMOD/Modify module authors: Tim Davis and William W. Hager - - CHOLMOD/SuiteSparse_metis: a modified version of METIS, embedded into the - CHOLMOD library. See the README.txt files for details. author: George - Karypis. This is a slightly modified copy included with SuiteSparse via the - open-source license provided by George Karypis. SuiteSparse cannot use an - unmodified copy of METIS. - -* `CITATION.bib` - - citations for SuiteSparse packages, in bibtex format. - -* `CMakeLists.txt` - - optional, to compile all of SuiteSparse. See below. - -* `CODE_OF_CONDUCT.md` - - community guidelines - -* `COLAMD` - - column approximate minimum degree ordering. This is the built-in COLAMD - function in MATLAB. - - authors (of the code): Tim Davis and Stefan Larimore - - Algorithm design collaborators: Esmond Ng, John Gilbert - -* `Contents.m` - - a list of contents for 'help SuiteSparse' in MATLAB. - -* `CONTRIBUTING.md` - - how to contribute to SuiteSparse - -* `CONTRIBUTOR-LICENSE.txt` - - required contributor agreement - -* `CSparse` - - a concise sparse matrix package, developed for my book, "Direct Methods for - Sparse Linear Systems", published by SIAM. Intended primarily for teaching. - Note that the code is (c) Tim Davis, as stated in the book. - - For production, use CXSparse instead. In particular, both CSparse and - CXSparse have the same include filename: `cs.h`. This package is used for - the built-in DMPERM in MATLAB. - - author: Tim Davis - -* `CXSparse` - - CSparse Extended. Includes support for complex matrices and both int or long - integers. Use this instead of CSparse for production use; it creates a - libcsparse.so (or dylib on the Mac) with the same name as CSparse. It is a - superset of CSparse. Any code that links against CSparse should also be able - to link against CXSparse instead. - - author: Tim Davis, David Bateman - -* `Example` - - a simple package that relies on almost all of SuiteSparse - -* `.github` - - workflows for CI testing on GitHub. - -* `GraphBLAS` - - graph algorithms in the language of linear algebra. - - https://graphblas.org - - authors: Tim Davis, Joe Eaton, Corey Nolet - -* `include` - - `make install` places user-visible include files for each package here, after - `make local`. - -* `KLU` - - sparse LU factorization, primarily for circuit simulation. Requires AMD, - COLAMD, and BTF. Optionally uses CHOLMOD, CAMD, CCOLAMD, and METIS. - - authors: Tim Davis, Ekanathan Palamadai - -* `LAGraph` - - a graph algorithms library based on GraphBLAS. See also - https://github.com/GraphBLAS/LAGraph - - Authors: many. - -* `LDL` - - a very concise LDL' factorization package - - author: Tim Davis - -* `lib` - - `make install` places shared libraries for each package here, after - `make local`. - -* `LICENSE.txt` - - collected licenses for each package. - -* `Makefile` - - optional, to compile all of SuiteSparse using `make`, which is used as a - simple wrapper for `cmake` in each subproject. - - * `make` - - compiles SuiteSparse libraries. Subsequent `make install` will install - in `CMAKE_INSTALL_PATH` (might default to `/usr/local/lib` on Linux or Mac). - - * `make local` - - compiles SuiteSparse. Subsequent `make install` will install in `./lib`, - `./include`. Does not install in `CMAKE_INSTALL_PATH`. - - * `make global` - - compiles SuiteSparse libraries. Subsequent `make install` will install in - `/usr/local/lib` (or whatever the configured `CMAKE_INSTALL_PREFIX` is). - Does not install in `./lib` and `./include`. - - * `make install` - - installs in the current directory (`./lib`, `./include`), or in - `/usr/local/lib` and `/usr/local/include`, (the latter defined by - `CMAKE_INSTALL_PREFIX`) depending on whether `make`, `make local`, or - `make global` has been done. - - * `make uninstall` - - undoes `make install`. - - * `make distclean` - - removes all files not in distribution, including `./bin`, `./share`, - `./lib`, and `./include`. - - * `make purge` - - same as `make distclean`. - - * `make clean` - - removes all files not in distribution, but keeps compiled libraries and - demos, `./lib`, `./share`, and `./include`. - - Each individual subproject also has each of the above `make` targets. - - Things you don't need to do: - - * `make docs` - - creates user guides from LaTeX files - - * `make cov` - - runs statement coverage tests (Linux only) - -* `MATLAB_Tools` - - various m-files for use in MATLAB - - author: Tim Davis (all parts) - - for `spqr_rank`: author Les Foster and Tim Davis - - * `Contents.m` - - list of contents - - * `dimacs10` - - loads matrices for DIMACS10 collection - - * `Factorize` - - object-oriented `x=A\b` for MATLAB - - * `find_components` - - finds connected components in an image - - * `GEE` - - simple Gaussian elimination - - * `getversion.m` - - determine MATLAB version - - * `gipper.m` - - create MATLAB archive - - * `hprintf.m` - - print hyperlinks in command window - - * `LINFACTOR` - - predecessor to `Factorize` package - - * `MESHND` - - nested dissection ordering of regular meshes - - * `pagerankdemo.m` - - illustrates how PageRank works - - * `SFMULT` - - `C=S*F` where `S` is sparse and `F` is full - - * `shellgui` - - display a seashell - - * `sparseinv` - - sparse inverse subset - - * `spok` - - check if a sparse matrix is valid - - * `spqr_rank` - - SPQR_RANK package. MATLAB toolbox for rank deficient sparse matrices: null - spaces, reliable factorizations, etc. With Leslie Foster, San Jose State - Univ. - - * `SSMULT` - - `C=A*B` where `A` and `B` are both sparse. - This was the basis for the built-in `C=A*B` in MATLAB, until it was - superseded by GraphBLAS in MATLAB R2021a. - - * `SuiteSparseCollection` - - for the SuiteSparse Matrix Collection - - * `waitmex` - - waitbar for use inside a mexFunction - -* `Mongoose` - - graph partitioning. - - authors: Nuri Yeralan, Scott Kolodziej, William Hager, Tim Davis - -* `ParU` - - a parallel unsymmetric pattern multifrontal method. - - Currently a pre-release. - - authors: Mohsen Aznaveh and Tim Davis - -* `RBio` - - read/write sparse matrices in Rutherford/Boeing format - - author: Tim Davis - -* `README.md` - - this file - -* `SPEX` - - solves sparse linear systems in exact arithmetic. - - Requires the GNU GMP and MPRF libraries. - - This will be soon replaced by a more general package, SPEX v3 that includes - this method (exact sparse LU) and others (sparse exact Cholesky, and sparse - exact update/downdate). The API of v3 will be changing significantly. - - authors: Chris Lourenco, Jinhao Chen, Erick Moreno-Centeno, - Lorena Lorena Mejia Domenzain, and Tim Davis. - - See https://github.com/clouren/SPEX for the latest version. - -* `SPQR` - - sparse QR factorization. This the built-in `qr` and `x=A\b` in MATLAB. Also - called SuiteSparseQR. - - Includes two GPU libraries: `SPQR/GPUQREngine` and - `SPQR/SuiteSparse_GPURuntime`. - - author of the CPU code: Tim Davis - - author of GPU modules: Tim Davis, Nuri Yeralan, Wissam Sid-Lakhdar, - Sanjay Ranka - -* `ssget` - - MATLAB interface to the SuiteSparse Matrix Collection - - author: Tim Davis - -* `SuiteSparse_config` - - library with common functions and configuration for all the above packages. - `CSparse`, `GraphBLAS`, `LAGraph`, and `MATLAB_Tools` do not use - `SuiteSparse_config`. - - author: Tim Davis - -* `SuiteSparse_demo.m` - - a demo of SuiteSparse for MATLAB - -* `SuiteSparse_install.m` - - install SuiteSparse for MATLAB - -* `SuiteSparse_paths.m` - - set paths for SuiteSparse MATLAB mexFunctions - -* `SuiteSparse_test.m` - - exhaustive test for SuiteSparse in MATLAB - -* `UMFPACK` - - sparse LU factorization. Requires `AMD` and the `BLAS`. - - This is the built-in `lu` and `x=A\b` in MATLAB. - - author: Tim Davis - - algorithm design collaboration: Iain Duff - -Refer to each package for license, copyright, and author information. All -codes are authored or co-authored by Timothy A. Davis (email: davis@tamu.edu), -except for METIS (by George Karypis), `GraphBLAS/cpu_features` (by Google), -GraphBLAS/lz4, zstd, and xxHash (by Yann Collet, now at Facebook), and -GraphBLAS/CUDA/jitify.hpp (by NVIDIA). Parts of GraphBLAS/CUDA are -Copyright (c) by NVIDIA. Please refer to each of these licenses. - ------------------------------------------------------------------------------ -For distro maintainers (Linux, homebrew, spack, R, Octave, Trilinos, ...): ------------------------------------------------------------------------------ - -Thanks for packaging SuiteSparse! Here are some suggestions: - -* GraphBLAS takes a long time to compile because it creates many fast - "FactoryKernels" at compile-time. If you want to reduce the compile time and - library size, enable the `GRAPHBLAS_COMPACT` mode, but keep the JIT compiler - enabled. Then GraphBLAS will compile the kernels it needs at run-time, via - its JIT compiler. Performance will be the same as the FactoryKernels once - the JIT kernels are compiled. User compiled kernels are placed in - `~/.SuiteSparse`, by default. You do not need to distribute the source for - GraphBLAS to enable the JIT compiler: just `libgraphblas.so` and - `GraphBLAS.h` is enough. - -* GraphBLAS needs OpenMP! It's fundamentally a parallel code so please - distribute it with OpenMP enabled. Performance will suffer otherwise. - -* CUDA acceleration: CHOLMOD and SPQR can benefit from their CUDA kernels. If - you do not have CUDA or do not want to include it in your distro, this - version of SuiteSparse skips the building of the `CHOLMOD_CUDA` and `SPQR_CUDA` - libraries, and does not link against the `GPUQREngine` and - `SuiteSparse_GPURuntime` libraries. + * dev: the default branch, with recent updates of features to appear in + the next stable release. The intent is to keep this branch in + fully working order at all times, but the features will not be + finalized at any given time. + * stable: the most recent stable release. + * dev2: working branch. All submitted PRs should made to this branch. + This branch might not always be in working order. ----------------------------------------------------------------------------- How to cite the SuiteSparse meta-package and its component packages: @@ -513,180 +40,193 @@ How to cite the SuiteSparse meta-package and its component packages: SuiteSparse is a meta-package of many packages, each with their own published papers. To cite the whole collection, use the URLs: -* https://github.com/DrTimothyAldenDavis/SuiteSparse -* http://suitesparse.com (which is a forwarding URL + * https://github.com/DrTimothyAldenDavis/SuiteSparse + * http://suitesparse.com (which is a forwarding URL to https://people.engr.tamu.edu/davis/suitesparse.html) Please also cite the specific papers for the packages you use. This is a long list; if you want a shorter list, just cite the most recent "Algorithm XXX:" papers in ACM TOMS, for each package. -* For the MATLAB x=A\b, see below for AMD, COLAMD, CHOLMOD, UMFPACK, - and SuiteSparseQR (SPQR). + * For the MATLAB x=A\b, see below for AMD, COLAMD, CHOLMOD, UMFPACK, + and SuiteSparseQR (SPQR). -* for GraphBLAS, and C=AB in MATLAB (sparse-times-sparse): + * for GraphBLAS, and `C=A*B` in MATLAB (sparse-times-sparse): - T. A. Davis. Algorithm 1037: SuiteSparse:GraphBLAS: Parallel Graph Algorithms - in the Language of Sparse Linear Algebra. ACM Trans. Math. Softw. 49, 3, - Article 28 (September 2023), 30 pages. https://doi.org/10.1145/3577195 + T. Davis, Algorithm 10xx: SuiteSparse:GraphBLAS: parallel graph + algorithms in the language of sparse linear algebra, ACM Trans on + Mathematical Software, to appear, 2023. See the pdf in + https://github.com/DrTimothyAldenDavis/GraphBLAS/tree/stable/Doc - T. Davis, Algorithm 1000: SuiteSparse:GraphBLAS: graph algorithms in the - language of sparse linear algebra, ACM Trans on Mathematical Software, vol - 45, no 4, Dec. 2019, Article No 44. https://doi.org/10.1145/3322125. + T. Davis, Algorithm 1000: SuiteSparse:GraphBLAS: graph algorithms in + the language of sparse linear algebra, ACM Trans on Mathematical + Software, vol 45, no 4, Dec. 2019, Article No 44. + https://doi.org/10.1145/3322125. -* for LAGraph: + * for CSparse/CXSParse: - G. Szárnyas et al., "LAGraph: Linear Algebra, Network Analysis Libraries, and - the Study of Graph Algorithms," 2021 IEEE International Parallel and - Distributed Processing Symposium Workshops (IPDPSW), Portland, OR, USA, 2021, - pp. 243-252. https://doi.org/10.1109/IPDPSW52791.2021.00046. + T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM Series on + the Fundamentals of Algorithms, SIAM, Philadelphia, PA, 2006. + https://doi.org/10.1137/1.9780898718881 -* for CSparse/CXSParse: + * for SuiteSparseQR (SPQR): (also cite AMD, COLAMD): - T. A. Davis, Direct Methods for Sparse Linear Systems, SIAM Series on the - Fundamentals of Algorithms, SIAM, Philadelphia, PA, 2006. - https://doi.org/10.1137/1.9780898718881 + T. A. Davis, Algorithm 915: SuiteSparseQR: Multifrontal multithreaded + rank-revealing sparse QR factorization, ACM Trans. on Mathematical + Software, 38(1), 2011, pp. 8:1--8:22. + https://doi.org/10.1145/2049662.2049670 -* for SuiteSparseQR (SPQR): (also cite AMD, COLAMD): + * for SuiteSparseQR/GPU: - T. A. Davis, Algorithm 915: SuiteSparseQR: Multifrontal multithreaded - rank-revealing sparse QR factorization, ACM Trans. on Mathematical Software, - 38(1), 2011, pp. 8:1--8:22. https://doi.org/10.1145/2049662.2049670 + Sencer Nuri Yeralan, T. A. Davis, Wissam M. Sid-Lakhdar, and Sanjay + Ranka. 2017. Algorithm 980: Sparse QR Factorization on the GPU. ACM + Trans. Math. Softw. 44, 2, Article 17 (June 2018), 29 pages. + https://doi.org/10.1145/3065870 -* for SuiteSparseQR/GPU: + * for CHOLMOD: (also cite AMD, COLAMD): - Sencer Nuri Yeralan, T. A. Davis, Wissam M. Sid-Lakhdar, and Sanjay Ranka. - 2017. Algorithm 980: Sparse QR Factorization on the GPU. ACM Trans. Math. - Softw. 44, 2, Article 17 (June 2018), 29 pages. - https://doi.org/10.1145/3065870 + Y. Chen, T. A. Davis, W. W. Hager, and S. Rajamanickam, Algorithm 887: + CHOLMOD, supernodal sparse Cholesky factorization and update/downdate, + ACM Trans. on Mathematical Software, 35(3), 2008, pp. 22:1--22:14. + https://dl.acm.org/doi/abs/10.1145/1391989.1391995 -* for CHOLMOD: (also cite AMD, COLAMD): + T. A. Davis and W. W. Hager, Dynamic supernodes in sparse Cholesky + update/downdate and triangular solves, ACM Trans. on Mathematical + Software, 35(4), 2009, pp. 27:1--27:23. + https://doi.org/10.1145/1462173.1462176 - Y. Chen, T. A. Davis, W. W. Hager, and S. Rajamanickam, Algorithm 887: - CHOLMOD, supernodal sparse Cholesky factorization and update/downdate, ACM - Trans. on Mathematical Software, 35(3), 2008, pp. 22:1--22:14. - https://dl.acm.org/doi/abs/10.1145/1391989.1391995 + * for CHOLMOD/Modify Module: (also cite AMD, COLAMD): - T. A. Davis and W. W. Hager, Dynamic supernodes in sparse Cholesky - update/downdate and triangular solves, ACM Trans. on Mathematical Software, - 35(4), 2009, pp. 27:1--27:23. https://doi.org/10.1145/1462173.1462176 + T. A. Davis and William W. Hager, Row Modifications of a Sparse + Cholesky Factorization SIAM Journal on Matrix Analysis and Applications + 2005 26:3, 621-639 + https://doi.org/10.1137/S089547980343641X -* for CHOLMOD/Modify Module: (also cite AMD, COLAMD): + T. A. Davis and William W. Hager, Multiple-Rank Modifications of a + Sparse Cholesky Factorization SIAM Journal on Matrix Analysis and + Applications 2001 22:4, 997-1013 + https://doi.org/10.1137/S0895479899357346 - T. A. Davis and William W. Hager, Row Modifications of a Sparse Cholesky - Factorization SIAM Journal on Matrix Analysis and Applications 2005 26:3, - 621-639. https://doi.org/10.1137/S089547980343641X + T. A. Davis and William W. Hager, Modifying a Sparse Cholesky + Factorization, SIAM Journal on Matrix Analysis and Applications 1999 + 20:3, 606-627 + https://doi.org/10.1137/S0895479897321076 - T. A. Davis and William W. Hager, Multiple-Rank Modifications of a Sparse - Cholesky Factorization SIAM Journal on Matrix Analysis and Applications 2001 - 22:4, 997-1013. https://doi.org/10.1137/S0895479899357346 + * for CHOLMOD/GPU Modules: - T. A. Davis and William W. Hager, Modifying a Sparse Cholesky Factorization, - SIAM Journal on Matrix Analysis and Applications 1999 20:3, 606-627. - https://doi.org/10.1137/S0895479897321076 + Steven C. Rennich, Darko Stosic, Timothy A. Davis, Accelerating sparse + Cholesky factorization on GPUs, Parallel Computing, Vol 59, 2016, pp + 140-150. + https://doi.org/10.1016/j.parco.2016.06.004 -* for CHOLMOD/GPU Modules: + * for AMD and CAMD: - Steven C. Rennich, Darko Stosic, Timothy A. Davis, Accelerating sparse - Cholesky factorization on GPUs, Parallel Computing, Vol 59, 2016, pp 140-150. - https://doi.org/10.1016/j.parco.2016.06.004 + P. Amestoy, T. A. Davis, and I. S. Duff, Algorithm 837: An approximate + minimum degree ordering algorithm, ACM Trans. on Mathematical Software, + 30(3), 2004, pp. 381--388. + https://dl.acm.org/doi/abs/10.1145/1024074.1024081 -* for AMD and CAMD: + P. Amestoy, T. A. Davis, and I. S. Duff, An approximate minimum degree + ordering algorithm, SIAM J. Matrix Analysis and Applications, 17(4), + 1996, pp. 886--905. + https://doi.org/10.1137/S0895479894278952 - P. Amestoy, T. A. Davis, and I. S. Duff, Algorithm 837: An approximate - minimum degree ordering algorithm, ACM Trans. on Mathematical Software, - 30(3), 2004, pp. 381--388. - https://dl.acm.org/doi/abs/10.1145/1024074.1024081 + * for COLAMD, SYMAMD, CCOLAMD, and CSYMAMD: - P. Amestoy, T. A. Davis, and I. S. Duff, An approximate minimum degree - ordering algorithm, SIAM J. Matrix Analysis and Applications, 17(4), 1996, - pp. 886--905. https://doi.org/10.1137/S0895479894278952 + T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD, + an approximate column minimum degree ordering algorithm, ACM Trans. on + Mathematical Software, 30(3), 2004, pp. 377--380. + https://doi.org/10.1145/1024074.1024080 -* for COLAMD, SYMAMD, CCOLAMD, and CSYMAMD: + T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, A column approximate + minimum degree ordering algorithm, ACM Trans. on Mathematical Software, + 30(3), 2004, pp. 353--376. + https://doi.org/10.1145/1024074.1024079 - T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, Algorithm 836: COLAMD, an - approximate column minimum degree ordering algorithm, ACM Trans. on - Mathematical Software, 30(3), 2004, pp. 377--380. - https://doi.org/10.1145/1024074.1024080 + * for UMFPACK: (also cite AMD and COLAMD): - T. A. Davis, J. R. Gilbert, S. Larimore, E. Ng, A column approximate minimum - degree ordering algorithm, ACM Trans. on Mathematical Software, 30(3), 2004, - pp. 353--376. https://doi.org/10.1145/1024074.1024079 + T. A. Davis, Algorithm 832: UMFPACK - an unsymmetric-pattern + multifrontal method with a column pre-ordering strategy, ACM Trans. on + Mathematical Software, 30(2), 2004, pp. 196--199. + https://dl.acm.org/doi/abs/10.1145/992200.992206 -* for UMFPACK: (also cite AMD and COLAMD): + T. A. Davis, A column pre-ordering strategy for the unsymmetric-pattern + multifrontal method, ACM Trans. on Mathematical Software, 30(2), 2004, + pp. 165--195. + https://dl.acm.org/doi/abs/10.1145/992200.992205 - T. A. Davis, Algorithm 832: UMFPACK - an unsymmetric-pattern multifrontal - method with a column pre-ordering strategy, ACM Trans. on Mathematical - Software, 30(2), 2004, pp. 196--199. - https://dl.acm.org/doi/abs/10.1145/992200.992206 + T. A. Davis and I. S. Duff, A combined unifrontal/multifrontal method + for unsymmetric sparse matrices, ACM Trans. on Mathematical Software, + 25(1), 1999, pp. 1--19. + https://doi.org/10.1145/305658.287640 - T. A. Davis, A column pre-ordering strategy for the unsymmetric-pattern - multifrontal method, ACM Trans. on Mathematical Software, 30(2), 2004, pp. - 165--195. https://dl.acm.org/doi/abs/10.1145/992200.992205 + T. A. Davis and I. S. Duff, An unsymmetric-pattern multifrontal method + for sparse LU factorization, SIAM J. Matrix Analysis and Computations, + 18(1), 1997, pp. 140--158. + https://doi.org/10.1137/S0895479894246905 - T. A. Davis and I. S. Duff, A combined unifrontal/multifrontal method for - unsymmetric sparse matrices, ACM Trans. on Mathematical Software, 25(1), - 1999, pp. 1--19. https://doi.org/10.1145/305658.287640 + * for the FACTORIZE m-file: - T. A. Davis and I. S. Duff, An unsymmetric-pattern multifrontal method for - sparse LU factorization, SIAM J. Matrix Analysis and Computations, 18(1), - 1997, pp. 140--158. https://doi.org/10.1137/S0895479894246905 + T. A. Davis, Algorithm 930: FACTORIZE, an object-oriented linear system + solver for MATLAB, ACM Trans. on Mathematical Software, 39(4), 2013, + pp. 28:1-28:18. + https://doi.org/10.1145/2491491.2491498 -* for the FACTORIZE m-file: + * for KLU and BTF (also cite AMD and COLAMD): - T. A. Davis, Algorithm 930: FACTORIZE, an object-oriented linear system - solver for MATLAB, ACM Trans. on Mathematical Software, 39(4), 2013, pp. - 28:1-28:18. https://doi.org/10.1145/2491491.2491498 + T. A. Davis and Ekanathan Palamadai Natarajan. 2010. Algorithm 907: + KLU, A Direct Sparse Solver for Circuit Simulation Problems. ACM Trans. + Math. Softw. 37, 3, Article 36 (September 2010), 17 pages. + https://dl.acm.org/doi/abs/10.1145/1824801.1824814 -* for KLU and BTF (also cite AMD and COLAMD): + * for LDL: - T. A. Davis and Ekanathan Palamadai Natarajan. 2010. Algorithm 907: KLU, A - Direct Sparse Solver for Circuit Simulation Problems. ACM Trans. Math. - Softw. 37, 3, Article 36 (September 2010), 17 pages. - https://dl.acm.org/doi/abs/10.1145/1824801.1824814 + T. A. Davis. Algorithm 849: A concise sparse Cholesky factorization + package. ACM Trans. Math. Softw. 31, 4 (December 2005), 587–591. + https://doi.org/10.1145/1114268.1114277 -* for LDL: + * for ssget and the SuiteSparse Matrix Collection: - T. A. Davis. Algorithm 849: A concise sparse Cholesky factorization package. - ACM Trans. Math. Softw. 31, 4 (December 2005), 587–591. - https://doi.org/10.1145/1114268.1114277 + T. A. Davis and Yifan Hu. 2011. The University of Florida sparse + matrix collection. ACM Trans. Math. Softw. 38, 1, Article 1 (November + 2011), 25 pages. + https://doi.org/10.1145/2049662.2049663 -* for ssget and the SuiteSparse Matrix Collection: + Kolodziej et al., (2019). The SuiteSparse Matrix Collection Website + Interface. Journal of Open Source Software, 4(35), 1244, + https://doi.org/10.21105/joss.01244 - T. A. Davis and Yifan Hu. 2011. The University of Florida sparse matrix - collection. ACM Trans. Math. Softw. 38, 1, Article 1 (November 2011), 25 - pages. https://doi.org/10.1145/2049662.2049663 + * for `spqr_rank`: - Kolodziej et al., (2019). The SuiteSparse Matrix Collection Website - Interface. Journal of Open Source Software, 4(35), 1244. - https://doi.org/10.21105/joss.01244 + Leslie V. Foster and T. A. Davis. 2013. Algorithm 933: Reliable + calculation of numerical rank, null space bases, pseudoinverse + solutions, and basic solutions using suitesparseQR. ACM Trans. Math. + Softw. 40, 1, Article 7 (September 2013), 23 pages. + https://doi.org/10.1145/2513109.2513116 -* for `spqr_rank`: + * for Mongoose: - Leslie V. Foster and T. A. Davis. 2013. Algorithm 933: Reliable calculation - of numerical rank, null space bases, pseudoinverse solutions, and basic - solutions using suitesparseQR. ACM Trans. Math. Softw. 40, 1, Article 7 - (September 2013), 23 pages. https://doi.org/10.1145/2513109.2513116 + T. A. Davis, William W. Hager, Scott P. Kolodziej, and S. Nuri Yeralan. + 2020. Algorithm 1003: Mongoose, a Graph Coarsening and Partitioning + Library. ACM Trans. Math. Softw. 46, 1, Article 7 (March 2020), 18 + pages. + https://doi.org/10.1145/3337792 -* for Mongoose: + * for SPEX: - T. A. Davis, William W. Hager, Scott P. Kolodziej, and S. Nuri Yeralan. - 2020. Algorithm 1003: Mongoose, a Graph Coarsening and Partitioning Library. - ACM Trans. Math. Softw. 46, 1, Article 7 (March 2020), 18 pages. - https://doi.org/10.1145/3337792 - -* for SPEX: - - Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and T. A. Davis. - 2022. Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via - a Sparse Left-Looking Integer-Preserving LU Factorization. ACM Trans. Math. - Softw. June 2022. https://doi.org/10.1145/3519024 + Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and T. A. + Davis. 2022. Algorithm 1021: SPEX Left LU, Exactly Solving Sparse + Linear Systems via a Sparse Left-Looking Integer-Preserving LU + Factorization. ACM Trans. Math. Softw. June 2022. + https://doi.org/10.1145/3519024 ----------------------------------------------------------------------------- About the BLAS and LAPACK libraries ----------------------------------------------------------------------------- -NOTE: if you use OpenBLAS, be sure to use version 0.3.27 or later. +NOTE: Use of the Intel MKL BLAS is strongly recommended. In a 2019 test, +OpenBLAS caused result in severe performance degradation. The reason for this +is being investigated, and this may be resolved in the near future. To select your BLAS/LAPACK, see the instructions in SuiteSparseBLAS.cmake in `SuiteSparse_config/cmake_modules`. If `SuiteSparse_config` finds a BLAS with @@ -694,17 +234,15 @@ To select your BLAS/LAPACK, see the instructions in SuiteSparseBLAS.cmake in `SuiteSparse_config.h` with the `SUITESPARSE_BLAS_INT` defined as `int64_t`. Otherwise, if a 32-bit BLAS is found, this type is defined as `int32_t`. If later on, UMFPACK, CHOLMOD, or SPQR are compiled and linked with a BLAS that -has a different integer size, you must override the definition with `-DBLAS64` -(to assert the use of 64-bit integers in the BLAS) or `-DBLAS32`, (to assert -the use of 32-bit integers in the BLAS). - -The size of the BLAS integer has nothing to do with `sizeof(void *)`. +has a different integer size, you must override the definition with -DBLAS64 +(to assert the use of 64-bit integers in the BLAS) or -DBLAS32, (to assert the +use of 32-bit integers in the BLAS). When distributed in a binary form (such as a Debian, Ubuntu, Spack, or Brew package), SuiteSparse should probably be compiled to expect a 32-bit BLAS, since this is the most common case. The default is to use a 32-bit BLAS, but -this can be changed by setting the cmake variable -`SUITESPARSE_USE_64BIT_BLAS` to `ON`. +this can be changed in SuiteSparseBLAS.cmake or by compiling with +`-DALLOW_64BIT_BLAS=1`. By default, SuiteSparse hunts for a suitable BLAS library. To enforce a particular BLAS library use either: @@ -713,140 +251,263 @@ particular BLAS library use either: cd Package ; cmake -DBLA_VENDOR=OpenBLAS .. make To use the default (hunt for a BLAS), do not set `BLA_VENDOR`, or set it to -`ANY`. In this case, if `SUITESPARSE_USE_64BIT_BLAS` is ON, preference is -given to a 64-bit BLAS, but a 32-bit BLAS library will be used if no 64-bit -library is found. However, if both `SUITESPARSE_USE_64BIT_BLAS` and -`SUITESPARSE_USE_STRICT` are ON, then only a 64-bit BLAS is considered. - -When selecting a particular BLAS library, the `SUITESPARSE_USE_64BIT_BLAS` -setting is strictly followed. If set to true, only a 64-bit BLAS library will -be used. If false (the default), only a 32-bit BLAS library will be used. If -no such BLAS is found, the build will fail. - ------------------------------------------------------------------------------ -QUICK START FOR THE C/C++ LIBRARIES: ------------------------------------------------------------------------------ - -Type the following in this directory (requires system priviledge to do the -`sudo make install`): -``` - mkdir -p build && cd build - cmake .. - cmake --build . - sudo cmake --install . -``` - -All libraries will be created and installed into the default system-wide folder -(/usr/local/lib on Linux). All include files needed by the applications that -use SuiteSparse are installed into /usr/local/include/suitesparse (on Linux). - -To build only a subset of libraries, set `SUITESPARSE_ENABLE_PROJECTS` when -configuring with CMake. E.g., to build and install CHOLMOD and CXSparse -(including their dependencies), use the following commands: -``` - mkdir -p build && cd build - cmake -DSUITESPARSE_ENABLE_PROJECTS="cholmod;cxsparse" .. - cmake --build . - sudo cmake --install . -``` - -For Windows (MSVC), import the `CMakeLists.txt` file into MS Visual Studio. -Be sure to specify the build type as Release; for example, to build SuiteSparse -on Windows in the command window, run: -``` - mkdir -p build && cd build - cmake .. - cmake --build . --config Release - cmake --install . -``` - -Be sure to first install all required libraries: BLAS and LAPACK for UMFPACK, -CHOLMOD, and SPQR, and GMP and MPFR for SPEX. Be sure to use the latest -libraries; SPEX requires MPFR 4.0.2 and GMP 6.1.2 (these version numbers -do NOT correspond to the X.Y.Z suffix of libgmp.so.X.Y.Z and libmpfr.so.X.Y.Z; -see the SPEX user guide for details). - -To compile the libraries and install them only in SuiteSparse/lib (not -/usr/local/lib), do this instead in the top-level of SuiteSparse: -``` - mkdir -p build && cd build - cmake -DCMAKE_INSTALL_PREFIX=.. .. - cmake --build . - cmake --install . -``` - -If you add /home/me/SuiteSparse/lib to your library search path -(`LD_LIBRARY_PATH` in Linux), you can do the following (for example): -``` - S = /home/me/SuiteSparse - cc myprogram.c -I$(S)/include/suitesparse -lumfpack -lamd -lcholmod -lsuitesparseconfig -lm -``` +ANY. In this case, if `ALLOW_64BIT_BLAS` is set, preference is given to a +64-bit BLAS, but a 32-bit BLAS library will be used if no 64-bit library is +found. -To change the C and C++ compilers, and to compile in parallel use: -``` - cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER==g++ .. -``` +When selecting a particular BLAS library, the `ALLOW_64BIT_BLAS` setting is +strictly followed. If set to true, only a 64-bit BLAS library will be used. +If false (the default), only a 32-bit BLAS library will be used. If no such +BLAS is found, the build will fail. -for example, which changes the compiler to gcc and g++. +------------------ +SuiteSparse/README +------------------ -This will work on Linux/Unix and the Mac. It should automatically detect if -you have the Intel compilers or not, and whether or not you have CUDA. +Packages in SuiteSparse, and files in this directory: -See `SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake` to select your BLAS. + GraphBLAS graph algorithms in the language of linear algebra. + https://graphblas.org + author: Tim Davis + + SPEX solves sparse linear systems in exact arithmetic. + Requires the GNU GMP and MPRF libraries. + This will be soon replaced by a more general package, SPEX v3 + that includes this method (exact sparse LU) and others (sparse + exact Cholesky, and sparse exact update/downdate). The API + of v3 will be changing significantly. + + AMD approximate minimum degree ordering. This is the built-in AMD + function in MATLAB. + authors: Tim Davis, Patrick Amestoy, Iain Duff + + bin where programs are placed when compiled + + BTF permutation to block triangular form + authors: Tim Davis, Ekanathan Palamadai + + CAMD constrained approximate minimum degree ordering + authors: Tim Davis, Patrick Amestoy, Iain Duff, Yanqing Chen + + CCOLAMD constrained column approximate minimum degree ordering + authors: Tim Davis, Sivasankaran Rajamanickam, Stefan Larimore. + Algorithm design collaborators: Esmond Ng, John Gilbert + (for COLAMD) + + ChangeLog a summary of changes to SuiteSparse. See */Doc/ChangeLog + for details for each package. + + CHOLMOD sparse Cholesky factorization. Requires AMD, COLAMD, CCOLAMD, + the BLAS, and LAPACK. Optionally uses METIS. This is chol and + x=A\b in MATLAB. + author for all modules: Tim Davis + CHOLMOD/Modify module authors: Tim Davis and William W. Hager + + COLAMD column approximate minimum degree ordering. This is the + built-in COLAMD function in MATLAB. + authors (of the code): Tim Davis and Stefan Larimore + Algorithm design collaborators: Esmond Ng, John Gilbert + + Contents.m a list of contents for 'help SuiteSparse' in MATLAB. + + CSparse a concise sparse matrix package, developed for my + book, "Direct Methods for Sparse Linear Systems", + published by SIAM. Intended primarily for teaching. + Note that the code is (c) Tim Davis, as stated in the book. + For production, use CXSparse instead. In particular, both + CSparse and CXSparse have the same include filename: cs.h. + This package is used for the built-in DMPERM in MATLAB. + author: Tim Davis + + CXSparse CSparse Extended. Includes support for complex matrices + and both int or long integers. Use this instead of CSparse + for production use; it creates a libcsparse.so (or *dylib on + the Mac) with the same name as CSparse. It is a superset + of CSparse. Any code that links against CSparse should + also be able to link against CXSparse instead. + author: Tim Davis, David Bateman + + include 'make install' places user-visible include files for each + package here, after 'make local' + + KLU sparse LU factorization, primarily for circuit simulation. + Requires AMD, COLAMD, and BTF. Optionally uses CHOLMOD, + CAMD, CCOLAMD, and METIS. + authors: Tim Davis, Ekanathan Palamadai + + LDL a very concise LDL' factorization package + author: Tim Davis + + lib 'make install' places shared libraries for each package + here, after 'make local' + + Makefile to compile all of SuiteSparse + + make compiles SuiteSparse libraries. + Subsequent "make install" will install + in just CMAKE_INSTALL_PATH (defaults to + /usr/local/lib on Linux or Mac). + + make both compiles SuiteSparse, and then "make install" + will instal in both ./lib and + CMAKE_INSTALL_PATH). + + make local compiles SuiteSparse. + Subsequent "make install will install only + in ./lib, ./include only. + Does not install in CMAKE_INSTALL_PATH. + + make global compiles SuiteSparse libraries. + Subsequent "make install" will install in + just /usr/local/lib (or whatever your + CMAKE_INSTALL_PREFIX is). + Does not install in ./lib and ./include. + + make install installs in the current directory + (./lib, ./include), and/or in + /usr/local/lib and /usr/local/include, + depending on whether "make", "make local", + "make global", or "make both", + etc has been done. + + make uninstall undoes 'make install' + + make distclean removes all files not in distribution, including + ./bin, ./share, ./lib, and ./include. + + make purge same as 'make distclean' + + make clean removes all files not in distribution, but + keeps compiled libraries and demoes, ./lib, + ./share, and ./include. + + Each individual package also has each of the above 'make' + targets. + + Things you don't need to do: + make docs creates user guides from LaTeX files + make cov runs statement coverage tests (Linux only) + + MATLAB_Tools various m-files for use in MATLAB + author: Tim Davis (all parts) + for spqr_rank: author Les Foster and Tim Davis + + Contents.m list of contents + dimacs10 loads matrices for DIMACS10 collection + Factorize object-oriented x=A\b for MATLAB + find_components finds connected components in an image + GEE simple Gaussian elimination + getversion.m determine MATLAB version + gipper.m create MATLAB archive + hprintf.m print hyperlinks in command window + LINFACTOR predecessor to Factorize package + MESHND nested dissection ordering of regular meshes + pagerankdemo.m illustrates how PageRank works + SFMULT C=S*F where S is sparse and F is full + shellgui display a seashell + sparseinv sparse inverse subset + spok check if a sparse matrix is valid + spqr_rank SPQR_RANK package. MATLAB toolbox for rank + deficient sparse matrices: null spaces, + reliable factorizations, etc. With Leslie + Foster, San Jose State Univ. + SSMULT C=A*B where A and B are both sparse + SuiteSparseCollection for the SuiteSparse Matrix Collection + waitmex waitbar for use inside a mexFunction + + The SSMULT and SFMULT functions are the basis for the + built-in C=A*B functions in MATLAB. + + Mongoose graph partitioning. + authors: Nuri Yeralan, Scott Kolodziej, William Hager, Tim Davis + + CHOLMOD/SuiteSparse_metis: a modified version of METIS, embedded into + the CHOLMOD library. See the README.txt files + for details. author: George Karypis. This is a slightly + modified copy included with SuiteSparse via the open-source + license provided by George Karypis. SuiteSparse cannot use + an unmodified copy METIS. + + RBio read/write sparse matrices in Rutherford/Boeing format + author: Tim Davis + + README.txt this file + + SPQR sparse QR factorization. This the built-in qr and x=A\b in + MATLAB. Also called SuiteSparseQR. + author of the CPU code: Tim Davis + author of GPU modules: Tim Davis, Nuri Yeralan, + Wissam Sid-Lakhdar, Sanjay Ranka + + GPUQREngine: GPU support package for SPQR + (not built into MATLAB, however) + authors: Tim Davis, Nuri Yeralan, Sanjay Ranka, + Wissam Sid-Lakhdar + + SuiteSparse_config configuration file for all the above packages. + CSparse and MATLAB_Tools do not use SuiteSparse_config. + author: Tim Davis + + SuiteSparse_GPURuntime GPU support package for SPQR and CHOLMOD + (not builtin to MATLAB, however). + + SuiteSparse_install.m install SuiteSparse for MATLAB + SuiteSparse_paths.m set paths for SuiteSparse MATLAB mexFunctions + + SuiteSparse_test.m exhaustive test for SuiteSparse in MATLAB + + ssget MATLAB interface to the SuiteSparse Matrix Collection + author: Tim Davis + + UMFPACK sparse LU factorization. Requires AMD and the BLAS. + This is the built-in lu and x=A\b in MATLAB. + author: Tim Davis + algorithm design collaboration: Iain Duff + +Some codes optionally use METIS 5.1.0. This package is located in SuiteSparse +in the `CHOLMOD/SuiteSparse_metis` directory. Its use is optional. To compile +CHOLMOD without it, use the CMAKE_OPTIONS="-DNPARTITION=1" setting. The use of +METIS can improve ordering quality for some matrices, particularly large 3D +discretizations. METIS has been slightly modified for use in SuiteSparse; see +the `CHOLMOD/SuiteSparse_metis/README.txt` file for details. -You may also need to add SuiteSparse/lib to your path. If your copy of -SuiteSparse is in /home/me/SuiteSparse, for example, then add this to your -`~/.bashrc` file: - -``` -LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/me/SuiteSparse/lib -export LD_LIBRARY_PATH -``` +Refer to each package for license, copyright, and author information. All +codes are authored or co-authored by Timothy A. Davis (email: davis@tamu.edu), +except for METIS (by George Karypis), GraphBLAS/cpu_features (by Google), +GraphBLAS/lz4 and zstd (by Yann Collet, now at Facebook), and +GraphBLAS/CUDA/jitify.hpp (by NVIDIA). Parts of GraphBLAS/CUDA are +Copyright (c) by NVIDIA. Please refer to each of these licenses. -For the Mac, use this instead: -``` -DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/home/me/SuiteSparse/lib -export DYLD_LIBRARY_PATH -``` - -Default install location of files is below, where PACKAGE is one of the -packages in SuiteSparse: - - * `CMAKE_INSTALL_PREFIX/include/suitesparse/`: include files - * `CMAKE_INSTALL_PREFIX/lib/`: compiled libraries - * `CMAKE_INSTALL_PREFIX/lib/cmake/SuiteSparse/`: `*.cmake` scripts - for all of SuiteSparse - * `CMAKE_INSTALL_PREFIX/lib/cmake/PACKAGE/`: `*Config.cmake` scripts for a - specific package - * `CMAKE_INSTALL_PREFIX/lib/pkgconfig/PACKAGE.pc`: `.pc` scripts for - a specific package pkgconfig +Licenses for each package are located in the following files, all in +PACKAGENAME/Doc/License.txt, and these files are also concatenated into +the top-level LICENSE.txt file. ----------------------------------------------------------------------------- QUICK START FOR MATLAB USERS (Linux or Mac): ----------------------------------------------------------------------------- -Suppose you place SuiteSparse in the `/home/me/SuiteSparse` folder. +Uncompress the SuiteSparse.zip or SuiteSparse.tar.gz archive file (they contain +the same thing). Suppose you place SuiteSparse in the /home/me/SuiteSparse +folder. + +Add the SuiteSparse/lib folder to your run-time library path. On Linux, add +this to your ~/.bashrc script, assuming /home/me/SuiteSparse is the location of +your copy of SuiteSparse: -Add the `SuiteSparse/lib` folder to your run-time library path. On Linux, add -this to your `~/.bashrc` script, assuming `/home/me/SuiteSparse` is the -location of your copy of SuiteSparse: -``` LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/me/SuiteSparse/lib export LD_LIBRARY_PATH -``` -For the Mac, use this instead, in your `~/.zshrc` script, assuming you place -SuiteSparse in `/Users/me/SuiteSparse`: -``` +For the Mac, use this instead, in your ~/.zshrc script, assuming you place +SuiteSparse in /Users/me/SuiteSparse: + DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/Users/me/SuiteSparse/lib export DYLD_LIBRARY_PATH -``` -Compile all of SuiteSparse with `make local`. +Compile all of SuiteSparse with "make local". Next, compile the GraphBLAS MATLAB library. In the system shell while in the -SuiteSparse folder, type `make gbmatlab` if you want to install it system-wide -with `make install`, or `make gblocal` if you want to use the library in +SuiteSparse folder, type "make gbmatlab" if you want to install it system-wide +with "make install", or "make gblocal" if you want to use the library in your own SuiteSparse/lib. Then in the MATLAB Command Window, cd to the SuiteSparse directory and type @@ -860,391 +521,162 @@ Documents/MATLAB/startup.m. You can also use the `SuiteSparse_paths` m-file to set all your paths at the start of each MATLAB session. ----------------------------------------------------------------------------- -Compilation options +QUICK START FOR THE C/C++ LIBRARIES: ----------------------------------------------------------------------------- -You can set specific options for CMake with the command (for example): -``` - cmake -DCHOLMOD_PARTITION=OFF -DBUILD_STATIC_LIBS=OFF -DCMAKE_BUILD_TYPE=Debug .. -``` - -That command will compile all of SuiteSparse except for CHOLMOD/Partition -Module (because of `-DCHOLMOD_PARTITION=OFF`). Debug mode will be used (the -build type). The static libraries will not be built (since -`-DBUILD_STATIC_LIBS=OFF` is set). - -* `SUITESPARSE_ENABLE_PROJECTS`: - - Semicolon separated list of projects to be built or `all`. - Default: `all` in which case the following projects are built: - - `suitesparse_config;mongoose;amd;btf;camd;ccolamd;colamd;cholmod;cxsparse;ldl;klu;umfpack;paru;rbio;spqr;spex;graphblas;lagraph` - - Additionally, `csparse` can be included in that list to build CSparse. - -* `CMAKE_BUILD_TYPE`: - - Default: `Release`, use `Debug` for debugging. - -* `SUITESPARSE_USE_STRICT`: - - SuiteSparse has many user-definable settings of the form `SUITESPARSE_USE_*` - or `(package)_USE_*` for some particular package. In general, these settings - are not strict. For example, if `SUITESPARSE_USE_OPENMP` is `ON` then OpenMP - is preferred, but SuiteSparse can be used without OpenMP so no error is - generated if OpenMP is not found. However, if `SUITESPARSE_USE_STRICT` is - `ON` then all `*_USE_*` settings are treated strictly and an error occurs - if any are set to `ON` but the corresponding package or setting is not - available. The `*_USE_SYSTEM_*` settings are always treated as strict. - Default: `OFF`. - -* `SUITESPARSE_USE_CUDA`: - - If set to `ON`, CUDA is enabled for all of SuiteSparse. Default: `ON`, - - CUDA on Windows with MSVC appears to be working with this release, but it - should be considered as a prototype and may not be fully functional. I have - limited resources for testing CUDA on Windows. If you encounter issues, - disable CUDA and post this as an issue on GitHub. - -* `CHOLMOD_USE_CUDA`: - - Default: `ON`. Both `SUITESPARSE_USE_CUDA` and `CHOLMOD_USE_CUDA` must be - enabled to use CUDA in CHOLMOD. - -* `SPQR_USE_CUDA`: - - Default: `ON`. Both `SUITESPARSE_USE_CUDA` and `SPQR_USE_CUDA` must be - enabled to use CUDA in SPQR. - -* `CMAKE_INSTALL_PREFIX`: - - Defines the install location (default on Linux is `/usr/local`). For example, - this command while in a folder `build` in the top level SuiteSparse folder - will set the install directory to `/stuff`, used by the subsequent - `sudo cmake --install .`: -``` - cmake -DCMAKE_INSTALL_PREFIX=/stuff .. - sudo cmake --install . -``` - -* `SUITESPARSE_PKGFILEDIR`: - - Directory where CMake Config and pkg-config files will be installed. By - default, CMake Config files will be installed in the subfolder `cmake` of the - directory where the (static) libraries will be installed (e.g., `lib`). The - `.pc` files for pkg-config will be installed in the subfolder `pkgconfig` of - the directory where the (static) libraries will be installed. - - This option allows to install them at a location different from the (static) - libraries. This allows to install multiple configurations of the SuiteSparse - libraries at the same time (e.g., by also setting a different - `CMAKE_RELEASE_POSTFIX` and `CMAKE_INSTALL_LIBDIR` for each of them). To pick - up the respective configuration in downstream projects, set, e.g., - `CMAKE_PREFIX_PATH` (for CMake) or `PKG_CONFIG_PATH` (for build systems using - pkg-config) to the path containing the respective CMake Config files or - pkg-config files. - -* `SUITESPARSE_INCLUDEDIR_POSTFIX`: - - Postfix for installation target of header from SuiteSparse. Default: - suitesparse, so the default include directory is: - `CMAKE_INSTALL_PREFIX/include/suitesparse` - -* `BUILD_SHARED_LIBS`: - - If `ON`, shared libraries are built. - Default: `ON`. - -* `BUILD_STATIC_LIBS`: - - If `ON`, static libraries are built. - Default: `ON`, except for GraphBLAS, which takes a long time to compile so - the default for GraphBLAS is `OFF` unless `BUILD_SHARED_LIBS` is `OFF`. +For Linux and Mac: type the following in this directory (requires system +priviledge to do the `sudo make install`): -* `SUITESPARSE_CUDA_ARCHITECTURES`: + make + sudo make install - A string, such as `"all"` or `"35;50;75;80"` that lists the CUDA - architectures to use when compiling CUDA kernels with `nvcc`. The `"all"` - option requires CMake 3.23 or later. Default: `"52;75;80"`. +All libraries will be created and copied into SuiteSparse/lib and into +/usr/local/lib. All include files need by the applications that use +SuiteSparse are copied into SuiteSparse/include and into /usr/local/include. -* `BLA_VENDOR`: +For Windows, import each `*/CMakeLists.txt` file into MS Visual Studio. - A string. Leave unset, or use `"ANY"` to select any BLAS library (the - default). Or set to the name of a `BLA_VENDOR` defined by FindBLAS.cmake. - See: - https://cmake.org/cmake/help/latest/module/FindBLAS.html#blas-lapack-vendors - -* `SUITESPARSE_USE_64BIT_BLAS`: - - If `ON`, look for a 64-bit BLAS. If `OFF`: 32-bit only. Default: `OFF`. - -* `SUITESPARSE_USE_OPENMP`: - - If `ON`, OpenMP is used by default if it is available. Default: `ON`. - - GraphBLAS, LAGraph, and ParU will be vastly slower if OpenMP is not used. - CHOLMOD will be somewhat slower without OpenMP (as long as it still has a - parallel BLAS/LAPACK). Three packages (UMFPACK, CHOLMOD, and SPQR) rely - heavily on parallel BLAS/LAPACK libraries and those libraries may use OpenMP - internally. If you wish to disable OpenMP in an entire application, select a - single-threaded BLAS/LAPACK, or a parallel BLAS/LAPACK that does not use - OpenMP (such as the Apple Accelerate Framework). Using a single-threaded - BLAS/LAPACK library will cause UMFPACK, CHOLMOD, and SPQR to be vastly - slower. - - WARNING: GraphBLAS may not be thread-safe if built without OpenMP or pthreads - (see the GraphBLAS User Guide for details). - -* `SUITESPARSE_CONFIG_USE_OPENMP`: - - If `ON`, `SuiteSparse_config` uses OpenMP if it is available. - Default: `SUITESPARSE_USE_OPENMP`. - It is not essential and only used to let `SuiteSparse_time` call - `omp_get_wtime`. - -* `CHOLMOD_USE_OPENMP`: - - If `ON`, OpenMP is used in CHOLMOD if it is available. - Default: `SUITESPARSE_USE_OPENMP`. - -* `GRAPHBLAS_USE_OPENMP`: - - If `ON`, OpenMP is used in GraphBLAS if it is available. - Default: `SUITESPARSE_USE_OPENMP`. - -* `LAGRAPH_USE_OPENMP`: - - If `ON`, OpenMP is used in LAGraph if it is available. - Default: `SUITESPARSE_USE_OPENMP`. - -* `PARU_USE_OPENMP`: - - If `ON`, OpenMP is used in ParU if it is available. - Default: `SUITESPARSE_USE_OPENMP`. - -* `SPEX_USE_OPENMP`: - - If `ON`, OpenMP is used in SPEX if it is available. - Default: `SUITESPARSE_USE_OPENMP`. - -* `SUITESPARSE_DEMOS`: - - If `ON`, build the demo programs for each package. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_BTF`: - - If `ON`, use BTF libraries installed on the build system. If `OFF`, - automatically build BTF as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_CHOLMOD`: - - If `ON`, use CHOLMOD libraries installed on the build system. If `OFF`, - automatically build CHOLMOD as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_AMD`: - - If `ON`, use AMD libraries installed on the build system. If `OFF`, - automatically build AMD as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_COLAMD`: - - If `ON`, use COLAMD libraries installed on the build system. If `OFF`, - automatically build COLAMD as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_CAMD`: - - If `ON`, use CAMD libraries installed on the build system. If `OFF`, - automatically build CAMD as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_CCOLAMD`: - - If `ON`, use CCOLAMD libraries installed on the build system. If `OFF`, - automatically build CCOLAMD as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_GRAPHBLAS`: - - If `ON`, use GraphBLAS libraries installed on the build system. If `OFF`, - automatically build GraphBLAS as dependency if needed. Default: `OFF`. - -* `SUITESPARSE_USE_SYSTEM_SUITESPARSE_CONFIG`: - - If `ON`, use `SuiteSparse_config` libraries installed on the build system. If - `OFF`, automatically build `SuiteSparse_config` as dependency if needed. - Default: `OFF`. - -* `SUITESPARSE_USE_FORTRAN` - - If `ON`, use the Fortran compiler to determine how C calls Fortan, and to - build several optional Fortran routines. If `OFF`, use - `SUITESPARSE_C_TO_FORTRAN` to define how C calls Fortran. - Default: `ON`. - -* `SUITESPARSE_C_TO_FORTRAN` - - A string that defines how C calls Fortran (i.e., functions exported by the - BLAS library). This setting is used if no working Fortran compiler could be - detected or `SUITESPARSE_USE_FORTRAN` is set to `OFF`. This string is to be - read as the argument list and the body of a preprocessor macro. The first - argument to that macro is any Fortran function name in lowercase letters. - The second argument is the same function name in uppercase letters. The body - defines by which function name Fortran functions are called. This is - necessary because Fortran is case-insensitive, and different Fortran - compilers use different name mangling conventions. If a MSVC C/C++ compiler - is used, this defaults to `"(name,NAME) name"` (i.e., lower case without - trailing underscore). That is the name mangling convention for the Intel - Fortran compiler on Windows. If any other C/C++ compilers are used, this - defaults to `"(name,NAME) name##_"` (i.e., lower case with trailing - underscore). That is the name mangling convention for most of the commonly - used Fortran compilers (like `ifx` on platforms other than Windows, - `gfortran`, `flang`, ...). The latter name mangling convention is also used - by default by OpenBLAS (independent on the platform or the compiler used to - build OpenBLAS). You might need to configure with - `-DSUITESPARSE_C_TO_FORTRAN="(name,NAME) name##_"` if you'd like to build - SuiteSparse using a MSVC compiler and link to OpenBLAS. - -Additional options are available for specific packages: - -* `UMFPACK_USE_CHOLMOD`: - - If `ON`, UMFPACK uses CHOLMOD for additional (optional) - ordering options. Default: `ON`. - -* `KLU_USE_CHOLMOD`: - - If `ON`, KLU uses CHOLMOD for additional (optional) - ordering options. Default: `ON`. - -CHOLMOD is composed of a set of Modules that can be independently selected; -all options default to `ON`: - -* `CHOLMOD_GPL` - - If `OFF`, do not build any GPL-licensed module (MatrixOps, Modify, Supernodal, - and GPU modules) - -* `CHOLMOD_CHECK` - - If `OFF`, do not build the Check module. +Be sure to first install all required libraries: BLAS and LAPACK for UMFPACK, +CHOLMOD, and SPQR, and GMP and MPFR for SPEX. Be sure to use the latest +libraries; SPEX requires MPFR 4.0.2 and GMP 6.1.2 (these version numbers +do NOT correspond to the X.Y.Z suffix of libgmp.so.X.Y.Z and libmpfr.so.X.Y.Z; +see the SPEX user guide for details). -* `CHOLMOD_MATRIXOPS` +To compile the libraries and install them only in SuiteSparse/lib (not +/usr/local/lib), do this instead in the top-level of SuiteSparse: - If `OFF`, do not build the MatrixOps module. + make local -* `CHOLMOD_CHOLESKY` - If `OFF`, do not build the Cholesky module. This also disables the Supernodal - and Modify modules. +If you add /home/me/SuiteSparse/lib to your library search path +(`LD_LIBRARY_PATH` in Linux), you can do the following (for example): -* `CHOLMOD_MODIFY` + S = /home/me/SuiteSparse + cc myprogram.c -I$(S)/include -lumfpack -lamd -lcholmod -lsuitesparseconfig -lm - If `OFF`, do not build the Modify module. +To change the C and C++ compilers, and to compile in parallel use: -* `CHOLMOD_CAMD` + CC=gcc CX=g++ JOBS=32 make - If `OFF`, do not link against CAMD and CCOLAMD. This also disables the - Partition module. +for example, which changes the compiler to gcc and g++, and runs make with +'make -j32', in parallel with 32 jobs. -* `CHOLMOD_PARTITION` +This will work on Linux/Unix and the Mac. It should automatically detect if +you have the Intel compilers or not, and whether or not you have CUDA. - If `OFF`, do not build the Partition module. +NOTE: Use of the Intel MKL BLAS is strongly recommended. The OpenBLAS can +(rarely) result in severe performance degradation, in CHOLMOD in particular. +The reason for this is still under investigation and might already be resolved +in the current version of OpenBLAS. See +`SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake` to select your BLAS. -* `CHOLMOD_SUPERNODAL` +You may also need to add SuiteSparse/lib to your path. If your copy of +SuiteSparse is in /home/me/SuiteSparse, for example, then add this to your +~/.bashrc file: - If `OFF`, do not build the Supernodal module. + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/me/SuiteSparse/lib + export LD_LIBRARY_PATH ------------------------------------------------------------------------------ -Possible build/install issues ------------------------------------------------------------------------------ +For the Mac, use this instead: -One common issue can affect all packages: getting the right #include files -that match the current libraries being built. It's possible that your Linux -distro has an older copy of SuiteSparse headers in /usr/include or -/usr/local/include, or that Homebrew has installed its suite-sparse bundle into -/opt/homebrew/include or other places. Old libraries can appear in in -/usr/local/lib, /usr/lib, etc. When building a new copy of SuiteSparse, the -cmake build system is normally (or always?) able to avoid these, and use the -right header for the right version of each library. - -As an additional guard against this possible error, each time one SuiteSparse -package #include's a header from another one, it checks the version number in -the header file, and reports an #error to the compiler if a stale version is -detected. In addition, the Example package checks both the header version and -the library version (by calling a function in each library). If the versions -mismatch in any way, the Example package reports an error at run time. - -For example, CHOLMOD 5.1.0 requires AMD 3.3.0 or later. If it detects an -older one in `amd.h`, it will report an `#error`: - -``` - #include "amd.h" - #if ( ... AMD version is stale ... ) - #error "CHOLMOD 5.1.0 requires AMD 3.3.0 or later" - #endif -``` - -and the compilation will fail. The Example package makes another check, -by calling `amd_version` and comparing it with the versions from the `amd.h` -header file. - -If this error or one like it occurs, check to see if you have an old copy of -SuiteSparse, and uninstall it before compiling your new copy of SuiteSparse. - -There are other many possible build/install issues that are covered by the -corresponding user guides for each package, such as finding the right BLAS, -OpenMP, and other libraries, and how to compile on the Mac when using GraphBLAS -inside MATLAB, and so on. Refer to the User Guides for more details. + DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/home/me/SuiteSparse/lib + export DYLD_LIBRARY_PATH ----------------------------------------------------------------------------- -Interfaces to SuiteSparse +Python interface ----------------------------------------------------------------------------- -MATLAB/Octave/R/Mathematica interfaces: - - Many built-in methods in MATLAB and Octave rely on SuiteSparse, including - `C=A*B` `x=A\b`, `L=chol(A)`, `[L,U,P,Q]=lu(A)`, `R=qr(A)`, `dmperm(A)`, - `p=amd(A)`, `p=colamd(A)`, ... - See also Mathematica, R, and many many more. The list is too long. - -Julia interface: - - https://github.com/JuliaSparse/SparseArrays.jl - -python interface to GraphBLAS by Anaconda and NVIDIA: - - https://pypi.org/project/python-graphblas - -Intel's Go interface to GraphBLAS: +See scikit-sparse and scikit-umfpack for the Python interface via SciPy: - https://pkg.go.dev/github.com/intel/forGraphBLASGo +https://github.com/scikit-sparse/scikit-sparse -See scikit-sparse and scikit-umfpack for the Python interface via SciPy: +https://github.com/scikit-umfpack/scikit-umfpack - https://github.com/scikit-sparse/scikit-sparse - https://github.com/scikit-umfpack/scikit-umfpack +----------------------------------------------------------------------------- +Compilation options +----------------------------------------------------------------------------- -See math.js by Jos de Jong for a JavaScript port of CSparse: +You can set specific options for CMake with the command (for example): - https://github.com/josdejong/mathjs + CMAKE_OPTIONS="-DNPARTITION=1 -DNSTATIC=1 -DCMAKE_BUILD_TYPE=Debug" make -See russell for a Rust interface: +That command will compile all of SuiteSparse except for CHOLMOD/Partition +Module. Debug mode will be used. The static libraries will not be built +(NSTATIC is true). + + CMAKE_BUILD_TYPE: Default: "Release", use "Debug" for debugging. + + ENABLE_CUDA: if set to true, CUDA is enabled for the project. + Default: true for CHOLMOD and SPQR; false otherwise + + LOCAL_INSTALL: if true, "cmake --install" will install + into SuiteSparse/lib and SuiteSparse/include. + if false, "cmake --install" will install into the + default prefix (or the one configured with + CMAKE_INSTALL_PREFIX). + Default: false + + NSTATIC: if true, static libraries are not built. + Default: false, except for GraphBLAS, which + takes a long time to compile so the default for + GraphBLAS is true. For Mongoose, the NSTATIC setting + is treated as if it always false, since the mongoose + program is built with the static library. + + SUITESPARSE_CUDA_ARCHITECTURES: a string, such as "all" or + "35;50;75;80" that lists the CUDA architectures to use + when compiling CUDA kernels with nvcc. The "all" + option requires cmake 3.23 or later. + Default: "52;75;80". + + BLA_VENDOR a string. Leave unset, or use "ANY" to select any BLAS + library (the default). Or set to the name of a + BLA_VENDOR defined by FindBLAS.cmake. See: + https://cmake.org/cmake/help/latest/module/FindBLAS.html#blas-lapack-vendors + + ALLOW_64BIT_BLAS if true: look for a 64-bit BLAS. If false: 32-bit only. + Default: false. + + NOPENMP if true: OpenMP is not used. Default: false. + UMFPACK, CHOLMOD, SPQR, and GraphBLAS will be slow. + Note that BLAS and LAPACK may still use OpenMP + internally; if you wish to disable OpenMP in an entire + application, select a single-threaded BLAS/LAPACK. + WARNING: GraphBLAS may not be thread-safe if built + without OpenMP (see the User Guide for details). + + DEMO if true: build the demo programs for each package. + Default: false. + +Additional options are available within specific packages: + + NCHOLMOD if true, UMFPACK and KLU do not use CHOLMOD for + additional (optional) ordering options - https://github.com/cpmech/russell +CHOLMOD is composed of a set of Modules that can be independently selected; +all options default to false: + + NGL if true: do not build any GPL-licensed module + (MatrixOps, Modify, Supernodal, and GPU modules) + NCHECK if true: do not build the Check module. + NMATRIXOPS if true: do not build the MatrixOps module. + NCHOLESKY if true: do not build the Cholesky module. + This also disables the Supernodal and Modify modules. + NMODIFY if true: do not build the Modify module. + NCAMD if true: do not link against CAMD and CCOLAMD. + This also disables the Partition module. + NPARTITION if true: do not build the Partition module. + NSUPERNODAL if true: do not build the Supernodal module. ----------------------------------------------------------------------------- Acknowledgements ----------------------------------------------------------------------------- -Markus Mützel contributed the most recent update of the SuiteSparse build -system for all SuiteSparse packages, extensively porting it and modernizing it. - -I would also like to thank François Bissey, Sebastien Villemot, Erik Welch, Jim -Kitchen, and Fabian Wein for their valuable feedback on the +I would like to thank François Bissey, Sebastien Villemot, Erik Welch, Jim +Kitchen, Markus Mützel, and Fabian Wein for their valuable feedback on the SuiteSparse build system and how it works with various Linux / Python distros and other package managers. If you are a maintainer of a SuiteSparse packaging for a Linux distro, conda-forge, R, spack, brew, vcpkg, etc, please feel free to contact me if there's anything I can do to make your life easier. -I would also like to thank Raye Kimmerer for adding support for 32-bit -row/column indices in SPQR v4.2.0. See also the various Acknowledgements within each package. diff --git a/SuiteSparse_config/Config/SuiteSparse_config.h.in b/SuiteSparse_config/Config/SuiteSparse_config.h.in index 0d203f55..09d05c92 100644 --- a/SuiteSparse_config/Config/SuiteSparse_config.h.in +++ b/SuiteSparse_config/Config/SuiteSparse_config.h.in @@ -368,24 +368,13 @@ int SuiteSparse_divcomplex // determine which timer to use, if any #ifndef NTIMER - // SuiteSparse_config itself can be compiled without OpenMP, - // but other packages can themselves use OpenMP. In this case, - // those packages should use omp_get_wtime() directly. This can - // be done via the SUITESPARSE_TIME macro, defined below: - #cmakedefine SUITESPARSE_HAVE_CLOCK_GETTIME #if defined ( _OPENMP ) #define SUITESPARSE_TIMER_ENABLED - #define SUITESPARSE_TIME (omp_get_wtime ( )) - #elif defined ( SUITESPARSE_HAVE_CLOCK_GETTIME ) + #elif defined ( _POSIX_C_SOURCE ) + #if _POSIX_C_SOURCE >= 199309L #define SUITESPARSE_TIMER_ENABLED - #define SUITESPARSE_TIME (SuiteSparse_time ( )) - #else - // No timer is available - #define SUITESPARSE_TIME (0) + #endif #endif -#else - // The timer is explictly disabled - #define SUITESPARSE_TIME (0) #endif // SuiteSparse printf macro @@ -425,14 +414,9 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_SUB_VERSION @SUITESPARSE_VERSION_MINOR@ #define SUITESPARSE_SUBSUB_VERSION @SUITESPARSE_VERSION_SUB@ -// version format x.y #define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) -#define SUITESPARSE_VERSION SUITESPARSE_VER_CODE(@SUITESPARSE_VERSION_MAJOR@, @SUITESPARSE_VERSION_MINOR@) - -// version format x.y.z -#define SUITESPARSE__VERCODE(main,sub,patch) \ - (((main)*1000ULL + (sub))*1000ULL + (patch)) -#define SUITESPARSE__VERSION SUITESPARSE__VERCODE(@SUITESPARSE_VERSION_MAJOR@,@SUITESPARSE_VERSION_MINOR@,@SUITESPARSE_VERSION_SUB@) +#define SUITESPARSE_VERSION \ + SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION) //============================================================================== // SuiteSparse interface to the BLAS and LAPACK libraries @@ -485,7 +469,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #elif defined ( BLAS_UNDERSCORE ) - // append an underscore, use lower case + // append an undescore, use lower case #define SUITESPARSE_FORTRAN(name,NAME) name ## _ #define SUITESPARSE__FORTRAN(name,NAME) name ## _ @@ -545,12 +529,12 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // If the suffix does not contain "_", use (Sun Perf., for example): -// cd build && cmake -DBLAS64_SUFFIX="64" .. +// cd build ; cmake -DBLAS64_SUFFIX="64" .. // If the suffix contains "_" (OpenBLAS in spack for example), use the // following: -// cd build && cmake -DBLAS64_SUFFIX="_64" .. +// cd build ; cmake -DBLAS64_SUFFIX="_64" .. // This setting could be used by the spack packaging of SuiteSparse when linked // with the spack-installed OpenBLAS with 64-bit integers. See @@ -588,7 +572,6 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // C names of Fortan BLAS and LAPACK functions used by SuiteSparse //------------------------------------------------------------------------------ -// double #define SUITESPARSE_BLAS_DTRSV SUITESPARSE_BLAS ( dtrsv , DTRSV ) #define SUITESPARSE_BLAS_DGEMV SUITESPARSE_BLAS ( dgemv , DGEMV ) #define SUITESPARSE_BLAS_DTRSM SUITESPARSE_BLAS ( dtrsm , DTRSM ) @@ -596,15 +579,8 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_BLAS_DSYRK SUITESPARSE_BLAS ( dsyrk , DSYRK ) #define SUITESPARSE_BLAS_DGER SUITESPARSE_BLAS ( dger , DGER ) #define SUITESPARSE_BLAS_DSCAL SUITESPARSE_BLAS ( dscal , DSCAL ) -#define SUITESPARSE_BLAS_DNRM2 SUITESPARSE_BLAS ( dnrm2 , DNRM2 ) - #define SUITESPARSE_LAPACK_DPOTRF SUITESPARSE_BLAS ( dpotrf , DPOTRF ) -#define SUITESPARSE_LAPACK_DLARF SUITESPARSE_BLAS ( dlarf , DLARF ) -#define SUITESPARSE_LAPACK_DLARFG SUITESPARSE_BLAS ( dlarfg , DLARFG ) -#define SUITESPARSE_LAPACK_DLARFT SUITESPARSE_BLAS ( dlarft , DLARFT ) -#define SUITESPARSE_LAPACK_DLARFB SUITESPARSE_BLAS ( dlarfb , DLARFB ) -// double complex #define SUITESPARSE_BLAS_ZTRSV SUITESPARSE_BLAS ( ztrsv , ZTRSV ) #define SUITESPARSE_BLAS_ZGEMV SUITESPARSE_BLAS ( zgemv , ZGEMV ) #define SUITESPARSE_BLAS_ZTRSM SUITESPARSE_BLAS ( ztrsm , ZTRSM ) @@ -612,46 +588,20 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_BLAS_ZHERK SUITESPARSE_BLAS ( zherk , ZHERK ) #define SUITESPARSE_BLAS_ZGERU SUITESPARSE_BLAS ( zgeru , ZGERU ) #define SUITESPARSE_BLAS_ZSCAL SUITESPARSE_BLAS ( zscal , ZSCAL ) -#define SUITESPARSE_BLAS_DZNRM2 SUITESPARSE_BLAS ( dznrm2 , DZNRM2 ) - #define SUITESPARSE_LAPACK_ZPOTRF SUITESPARSE_BLAS ( zpotrf , ZPOTRF ) + +#define SUITESPARSE_BLAS_DNRM2 SUITESPARSE_BLAS ( dnrm2 , DNRM2 ) +#define SUITESPARSE_LAPACK_DLARF SUITESPARSE_BLAS ( dlarf , DLARF ) +#define SUITESPARSE_LAPACK_DLARFG SUITESPARSE_BLAS ( dlarfg , DLARFG ) +#define SUITESPARSE_LAPACK_DLARFT SUITESPARSE_BLAS ( dlarft , DLARFT ) +#define SUITESPARSE_LAPACK_DLARFB SUITESPARSE_BLAS ( dlarfb , DLARFB ) + +#define SUITESPARSE_BLAS_DZNRM2 SUITESPARSE_BLAS ( dznrm2 , DZNRM2 ) #define SUITESPARSE_LAPACK_ZLARF SUITESPARSE_BLAS ( zlarf , ZLARF ) #define SUITESPARSE_LAPACK_ZLARFG SUITESPARSE_BLAS ( zlarfg , ZLARFG ) #define SUITESPARSE_LAPACK_ZLARFT SUITESPARSE_BLAS ( zlarft , ZLARFT ) #define SUITESPARSE_LAPACK_ZLARFB SUITESPARSE_BLAS ( zlarfb , ZLARFB ) -// single -#define SUITESPARSE_BLAS_STRSV SUITESPARSE_BLAS ( strsv , STRSV ) -#define SUITESPARSE_BLAS_SGEMV SUITESPARSE_BLAS ( sgemv , SGEMV ) -#define SUITESPARSE_BLAS_STRSM SUITESPARSE_BLAS ( strsm , STRSM ) -#define SUITESPARSE_BLAS_SGEMM SUITESPARSE_BLAS ( sgemm , SGEMM ) -#define SUITESPARSE_BLAS_SSYRK SUITESPARSE_BLAS ( ssyrk , SSYRK ) -#define SUITESPARSE_BLAS_SGER SUITESPARSE_BLAS ( sger , SGER ) -#define SUITESPARSE_BLAS_SSCAL SUITESPARSE_BLAS ( sscal , SSCAL ) -#define SUITESPARSE_BLAS_SNRM2 SUITESPARSE_BLAS ( snrm2 , SNRM2 ) - -#define SUITESPARSE_LAPACK_SPOTRF SUITESPARSE_BLAS ( spotrf , SPOTRF ) -#define SUITESPARSE_LAPACK_SLARF SUITESPARSE_BLAS ( slarf , SLARF ) -#define SUITESPARSE_LAPACK_SLARFG SUITESPARSE_BLAS ( slarfg , SLARFG ) -#define SUITESPARSE_LAPACK_SLARFT SUITESPARSE_BLAS ( slarft , SLARFT ) -#define SUITESPARSE_LAPACK_SLARFB SUITESPARSE_BLAS ( slarfb , SLARFB ) - -// single complex -#define SUITESPARSE_BLAS_CTRSV SUITESPARSE_BLAS ( ctrsv , CTRSV ) -#define SUITESPARSE_BLAS_CGEMV SUITESPARSE_BLAS ( cgemv , CGEMV ) -#define SUITESPARSE_BLAS_CTRSM SUITESPARSE_BLAS ( ctrsm , CTRSM ) -#define SUITESPARSE_BLAS_CGEMM SUITESPARSE_BLAS ( cgemm , CGEMM ) -#define SUITESPARSE_BLAS_CHERK SUITESPARSE_BLAS ( cherk , CHERK ) -#define SUITESPARSE_BLAS_CGERU SUITESPARSE_BLAS ( cgeru , CGERU ) -#define SUITESPARSE_BLAS_CSCAL SUITESPARSE_BLAS ( cscal , CSCAL ) -#define SUITESPARSE_BLAS_SCNRM2 SUITESPARSE_BLAS ( scnrm2 , SCNRM2 ) - -#define SUITESPARSE_LAPACK_CPOTRF SUITESPARSE_BLAS ( cpotrf , CPOTRF ) -#define SUITESPARSE_LAPACK_CLARF SUITESPARSE_BLAS ( clarf , CLARF ) -#define SUITESPARSE_LAPACK_CLARFG SUITESPARSE_BLAS ( clarfg , CLARFG ) -#define SUITESPARSE_LAPACK_CLARFT SUITESPARSE_BLAS ( clarft , CLARFT ) -#define SUITESPARSE_LAPACK_CLARFB SUITESPARSE_BLAS ( clarfb , CLARFB ) - //------------------------------------------------------------------------------ // prototypes of BLAS and SUITESPARSE_LAPACK functions //------------------------------------------------------------------------------ @@ -677,11 +627,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #if defined ( SUITESPARSE_BLAS_DEFINITIONS ) -//------------------------------------------------------------------------------ -// gemv: Y = alpha*A*x + beta*Y -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DGEMV +void SUITESPARSE_BLAS_DGEMV // Y = alpha*A*x + beta*Y ( // input: const char *trans, @@ -713,39 +659,7 @@ void SUITESPARSE_BLAS_DGEMV } \ } -void SUITESPARSE_BLAS_SGEMV -( - // input: - const char *trans, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const float *alpha, - const float *A, - const SUITESPARSE_BLAS_INT *lda, - const float *X, - const SUITESPARSE_BLAS_INT *incx, - const float *beta, - // input/output: - float *Y, - // input: - const SUITESPARSE_BLAS_INT *incy -) ; - -#define SUITESPARSE_BLAS_sgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_SGEMV (trans, &M_blas_int, &N_blas_int, alpha, A, \ - &LDA_blas_int, X, &INCX_blas_int, beta, Y, &INCY_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZGEMV +void SUITESPARSE_BLAS_ZGEMV // Y = alpha*A*X + beta*Y ( // input: const char *trans, @@ -777,43 +691,7 @@ void SUITESPARSE_BLAS_ZGEMV } \ } -void SUITESPARSE_BLAS_CGEMV -( - // input: - const char *trans, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - const void *X, - const SUITESPARSE_BLAS_INT *incx, - const void *beta, - // input/output: - void *Y, - // input: - const SUITESPARSE_BLAS_INT *incy -) ; - -#define SUITESPARSE_BLAS_cgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CGEMV (trans, &M_blas_int, &N_blas_int, alpha, A, \ - &LDA_blas_int, X, &INCX_blas_int, beta, Y, &INCY_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// trsv: solve Lx=b, Ux=b, L'x=b, or U'x=b -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DTRSV +void SUITESPARSE_BLAS_DTRSV // solve Lx=b, Ux=b, L'x=b, or U'x=b ( // input: const char *uplo, @@ -840,34 +718,7 @@ void SUITESPARSE_BLAS_DTRSV } \ } -void SUITESPARSE_BLAS_STRSV -( - // input: - const char *uplo, - const char *trans, - const char *diag, - const SUITESPARSE_BLAS_INT *n, - const float *A, - const SUITESPARSE_BLAS_INT *lda, - // input/output: - float *X, - // input: - const SUITESPARSE_BLAS_INT *incx -) ; - -#define SUITESPARSE_BLAS_strsv(uplo,trans,diag,n,A,lda,X,incx,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_STRSV (uplo, trans, diag, &N_blas_int, A, \ - &LDA_blas_int, X, &INCX_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZTRSV +void SUITESPARSE_BLAS_ZTRSV // solve (L, L', L^H, U, U', or U^H)x=b ( // input: const char *uplo, @@ -894,38 +745,7 @@ void SUITESPARSE_BLAS_ZTRSV } \ } -void SUITESPARSE_BLAS_CTRSV -( - // input: - const char *uplo, - const char *trans, - const char *diag, - const SUITESPARSE_BLAS_INT *n, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - // input/output: - void *X, - // input: - const SUITESPARSE_BLAS_INT *incx -) ; - -#define SUITESPARSE_BLAS_ctrsv(uplo,trans,diag,n,A,lda,X,incx,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CTRSV (uplo, trans, diag, &N_blas_int, A, \ - &LDA_blas_int, X, &INCX_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// trsm: solve LX=B, UX=B, L'X=B, or U'X=B -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DTRSM +void SUITESPARSE_BLAS_DTRSM // solve LX=B, UX=B, L'X=B, or U'X=B ( // input: const char *side, @@ -956,38 +776,7 @@ void SUITESPARSE_BLAS_DTRSM } \ } -void SUITESPARSE_BLAS_STRSM -( - // input: - const char *side, - const char *uplo, - const char *transa, - const char *diag, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const float *alpha, - const float *A, - const SUITESPARSE_BLAS_INT *lda, - // input/output: - float *B, - // input: - const SUITESPARSE_BLAS_INT *ldb -) ; - -#define SUITESPARSE_BLAS_strsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb,ok)\ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_STRSM (side, uplo, transa, diag, &M_blas_int, \ - &N_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZTRSM +void SUITESPARSE_BLAS_ZTRSM // solve (L, L', L^H, U, U', or U^H)X=B ( // input: const char *side, @@ -1018,42 +807,7 @@ void SUITESPARSE_BLAS_ZTRSM } \ } -void SUITESPARSE_BLAS_CTRSM -( - // input: - const char *side, - const char *uplo, - const char *transa, - const char *diag, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - // input/output: - void *B, - // input: - const SUITESPARSE_BLAS_INT *ldb -) ; - -#define SUITESPARSE_BLAS_ctrsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb,ok)\ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CTRSM (side, uplo, transa, diag, &M_blas_int, \ - &N_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// gemm: C = alpha*A*B + beta*C -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DGEMM +void SUITESPARSE_BLAS_DGEMM // C = alpha*A*B + beta*C ( // input: const char *transa, @@ -1090,44 +844,7 @@ void SUITESPARSE_BLAS_DGEMM } \ } -void SUITESPARSE_BLAS_SGEMM -( - // input: - const char *transa, - const char *transb, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const float *alpha, - const float *A, - const SUITESPARSE_BLAS_INT *lda, - const float *B, - const SUITESPARSE_BLAS_INT *ldb, - const float *beta, - // input/output: - float *C, - // input: - const SUITESPARSE_BLAS_INT *ldc -) ; - -#define SUITESPARSE_BLAS_sgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ - C,ldc,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_SGEMM (transa, transb, &M_blas_int, &N_blas_int, \ - &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ - &LDC_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZGEMM +void SUITESPARSE_BLAS_ZGEMM // C = alpha*A*B + beta*C ( // input: const char *transa, @@ -1164,48 +881,7 @@ void SUITESPARSE_BLAS_ZGEMM } \ } -void SUITESPARSE_BLAS_CGEMM -( - // input: - const char *transa, - const char *transb, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - const void *B, - const SUITESPARSE_BLAS_INT *ldb, - const void *beta, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc -) ; - -#define SUITESPARSE_BLAS_cgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ - C,ldc,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CGEMM (transa, transb, &M_blas_int, &N_blas_int, \ - &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ - &LDC_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// syrk/herk: C = alpha*A*A' + beta*C ; or C = alpha*A'*A + beta*C -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DSYRK +void SUITESPARSE_BLAS_DSYRK // C = alpha*A*A' + beta*C, or A'A ( // input: const char *uplo, @@ -1235,24 +911,24 @@ void SUITESPARSE_BLAS_DSYRK } \ } -void SUITESPARSE_BLAS_SSYRK +void SUITESPARSE_BLAS_ZHERK // C = alpha*A*A^H + beta*C, or A^H*A ( // input: const char *uplo, const char *trans, const SUITESPARSE_BLAS_INT *n, const SUITESPARSE_BLAS_INT *k, - const float *alpha, - const float *A, + const void *alpha, + const void *A, const SUITESPARSE_BLAS_INT *lda, - const float *beta, + const void *beta, // input/output: - float *C, + void *C, // input: const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_BLAS_ssyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +#define SUITESPARSE_BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ { \ SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ @@ -1260,76 +936,12 @@ void SUITESPARSE_BLAS_SSYRK SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_SSYRK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + SUITESPARSE_BLAS_ZHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ } \ } -void SUITESPARSE_BLAS_ZHERK -( - // input: - const char *uplo, - const char *trans, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - const void *beta, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc -) ; - -#define SUITESPARSE_BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_ZHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ - A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_CHERK -( - // input: - const char *uplo, - const char *trans, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - const void *beta, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc -) ; - -#define SUITESPARSE_BLAS_cherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ - A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// potrf: Cholesky factorization -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DPOTRF +void SUITESPARSE_LAPACK_DPOTRF // Cholesky factorization ( // input: const char *uplo, @@ -1356,34 +968,7 @@ void SUITESPARSE_LAPACK_DPOTRF } \ } -void SUITESPARSE_LAPACK_SPOTRF -( - // input: - const char *uplo, - const SUITESPARSE_BLAS_INT *n, - // input/output: - float *A, - // input: - const SUITESPARSE_BLAS_INT *lda, - // output: - SUITESPARSE_BLAS_INT *info -) ; - -#define SUITESPARSE_LAPACK_spotrf(uplo,n,A,lda,info,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - info = 1 ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ - SUITESPARSE_LAPACK_SPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ - &LAPACK_Info) ; \ - info = (Int) LAPACK_Info ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZPOTRF +void SUITESPARSE_LAPACK_ZPOTRF // Cholesky factorization ( // input: const char *uplo, @@ -1410,38 +995,7 @@ void SUITESPARSE_LAPACK_ZPOTRF } \ } -void SUITESPARSE_LAPACK_CPOTRF -( - // input: - const char *uplo, - const SUITESPARSE_BLAS_INT *n, - // input/output: - void *A, - // input: - const SUITESPARSE_BLAS_INT *lda, - // output: - SUITESPARSE_BLAS_INT *info -) ; - -#define SUITESPARSE_LAPACK_cpotrf(uplo,n,A,lda,info,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - info = 1 ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ - SUITESPARSE_LAPACK_CPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ - &LAPACK_Info) ; \ - info = LAPACK_Info ; \ - } \ -} - -//------------------------------------------------------------------------------ -// scal: Y = alpha*Y -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DSCAL +void SUITESPARSE_BLAS_DSCAL // Y = alpha*Y ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1462,28 +1016,7 @@ void SUITESPARSE_BLAS_DSCAL } \ } -void SUITESPARSE_BLAS_SSCAL -( - // input: - const SUITESPARSE_BLAS_INT *n, - const float *alpha, - // input/output: - float *Y, - // input: - const SUITESPARSE_BLAS_INT *incy -) ; - -#define SUITESPARSE_BLAS_sscal(n,alpha,Y,incy,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_SSCAL (&N_blas_int, alpha, Y, &INCY_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZSCAL +void SUITESPARSE_BLAS_ZSCAL // Y = alpha*Y ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1504,32 +1037,7 @@ void SUITESPARSE_BLAS_ZSCAL } \ } -void SUITESPARSE_BLAS_CSCAL -( - // input: - const SUITESPARSE_BLAS_INT *n, - const void *alpha, - // input/output: - void *Y, - // input: - const SUITESPARSE_BLAS_INT *incy -) ; - -#define SUITESPARSE_BLAS_cscal(n,alpha,Y,incy,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CSCAL (&N_blas_int, alpha, Y, &INCY_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// ger/geru: A = alpha*x*y' + A -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DGER +void SUITESPARSE_BLAS_DGER // A = alpha*x*y' + A ( // input: const SUITESPARSE_BLAS_INT *m, @@ -1559,37 +1067,7 @@ void SUITESPARSE_BLAS_DGER } \ } -void SUITESPARSE_BLAS_SGER -( - // input: - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const float *alpha, - const float *X, - const SUITESPARSE_BLAS_INT *incx, - const float *Y, - const SUITESPARSE_BLAS_INT *incy, - // input/output: - float *A, - // input: - const SUITESPARSE_BLAS_INT *lda -) ; - -#define SUITESPARSE_BLAS_sger(m,n,alpha,X,incx,Y,incy,A,lda,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_SGER (&M_blas_int, &N_blas_int, alpha, X, \ - &INCX_blas_int, Y, &INCY_blas_int, A, &LDA_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZGERU +void SUITESPARSE_BLAS_ZGERU // A = alpha*x*y' + A ( // input: const SUITESPARSE_BLAS_INT *m, @@ -1619,41 +1097,7 @@ void SUITESPARSE_BLAS_ZGERU } \ } -void SUITESPARSE_BLAS_CGERU -( - // input: - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const void *alpha, - const void *X, - const SUITESPARSE_BLAS_INT *incx, - const void *Y, - const SUITESPARSE_BLAS_INT *incy, - // input/output: - void *A, - // input: - const SUITESPARSE_BLAS_INT *lda -) ; - -#define SUITESPARSE_BLAS_cgeru(m,n,alpha,X,incx,Y,incy,A,lda,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CGERU (&M_blas_int, &N_blas_int, alpha, X, \ - &INCX_blas_int, Y, &INCY_blas_int, A, &LDA_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// larft: T = block Householder factor -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DLARFT +void SUITESPARSE_LAPACK_DLARFT // T = block Householder factor ( // input: const char *direct, @@ -1682,36 +1126,7 @@ void SUITESPARSE_LAPACK_DLARFT } \ } -void SUITESPARSE_LAPACK_SLARFT -( - // input: - const char *direct, - const char *storev, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const float *V, - const SUITESPARSE_BLAS_INT *ldv, - const float *Tau, - // output: - float *T, - // input: - const SUITESPARSE_BLAS_INT *ldt -) ; - -#define SUITESPARSE_LAPACK_slarft(direct,storev,n,k,V,ldv,Tau,T,ldt,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_SLARFT (direct, storev, &N_blas_int, &K_blas_int, \ - V, &LDV_blas_int, Tau, T, &LDT_blas_int) ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZLARFT +void SUITESPARSE_LAPACK_ZLARFT // T = block Householder factor ( // input: const char *direct, @@ -1740,40 +1155,7 @@ void SUITESPARSE_LAPACK_ZLARFT } \ } -void SUITESPARSE_LAPACK_CLARFT -( - // input: - const char *direct, - const char *storev, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *V, - const SUITESPARSE_BLAS_INT *ldv, - const void *Tau, - // output: - void *T, - // input: - const SUITESPARSE_BLAS_INT *ldt -) ; - -#define SUITESPARSE_LAPACK_clarft(direct,storev,n,k,V,ldv,Tau,T,ldt,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_CLARFT (direct, storev, &N_blas_int, &K_blas_int, \ - V, &LDV_blas_int, Tau, T, &LDT_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// larfb: apply block Householder reflector -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DLARFB +void SUITESPARSE_LAPACK_DLARFB // apply block Householder reflector ( // input: const char *side, @@ -1815,49 +1197,7 @@ void SUITESPARSE_LAPACK_DLARFB } \ } -void SUITESPARSE_LAPACK_SLARFB -( - // input: - const char *side, - const char *trans, - const char *direct, - const char *storev, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const float *V, - const SUITESPARSE_BLAS_INT *ldv, - const float *T, - const SUITESPARSE_BLAS_INT *ldt, - // input/output: - float *C, - // input: - const SUITESPARSE_BLAS_INT *ldc, - // workspace: - float *Work, - // input: - const SUITESPARSE_BLAS_INT *ldwork -) ; - -#define SUITESPARSE_LAPACK_slarfb(side,trans,direct,storev,m,n,k,V,ldv,T,ldt, \ - C,ldc,Work,ldwork,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDWORK_blas_int, ldwork, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_SLARFB (side, trans, direct, storev, &M_blas_int, \ - &N_blas_int, &K_blas_int, V, &LDV_blas_int, T, &LDT_blas_int, C, \ - &LDC_blas_int, Work, &LDWORK_blas_int) ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZLARFB +void SUITESPARSE_LAPACK_ZLARFB // apply block Householder reflector ( // input: const char *side, @@ -1899,53 +1239,7 @@ void SUITESPARSE_LAPACK_ZLARFB } \ } -void SUITESPARSE_LAPACK_CLARFB -( - // input: - const char *side, - const char *trans, - const char *direct, - const char *storev, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *V, - const SUITESPARSE_BLAS_INT *ldv, - const void *T, - const SUITESPARSE_BLAS_INT *ldt, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc, - // workspace: - void *Work, - // input: - const SUITESPARSE_BLAS_INT *ldwork -) ; - -#define SUITESPARSE_LAPACK_clarfb(side,trans,direct,storev,m,n,k,V,ldv,T,ldt, \ - C,ldc,Work,ldwork,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDWORK_blas_int, ldwork, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_CLARFB (side, trans, direct, storev, &M_blas_int, \ - &N_blas_int, &K_blas_int, V, &LDV_blas_int, T, &LDT_blas_int, C, \ - &LDC_blas_int, Work, &LDWORK_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// nrm2: vector 2-norm -//------------------------------------------------------------------------------ - -double SUITESPARSE_BLAS_DNRM2 +double SUITESPARSE_BLAS_DNRM2 // vector 2-norm ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1964,26 +1258,7 @@ double SUITESPARSE_BLAS_DNRM2 } \ } -float SUITESPARSE_BLAS_SNRM2 -( - // input: - const SUITESPARSE_BLAS_INT *n, - const float *X, - const SUITESPARSE_BLAS_INT *incx -) ; - -#define SUITESPARSE_BLAS_snrm2(result,n,X,incx,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - result = 0 ; \ - if (ok) \ - { \ - result = SUITESPARSE_BLAS_SNRM2 (&N_blas_int, X, &INCX_blas_int) ; \ - } \ -} - -double SUITESPARSE_BLAS_DZNRM2 +double SUITESPARSE_BLAS_DZNRM2 // vector 2-norm ( // input: const SUITESPARSE_BLAS_INT *n, @@ -2002,30 +1277,7 @@ double SUITESPARSE_BLAS_DZNRM2 } \ } -float SUITESPARSE_BLAS_SCNRM2 -( - // input: - const SUITESPARSE_BLAS_INT *n, - const void *X, - const SUITESPARSE_BLAS_INT *incx -) ; - -#define SUITESPARSE_BLAS_scnrm2(result,n,X,incx,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - result = 0 ; \ - if (ok) \ - { \ - result = SUITESPARSE_BLAS_SCNRM2 (&N_blas_int, X, &INCX_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// larfg: generate Householder reflector -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DLARFG +void SUITESPARSE_LAPACK_DLARFG // generate Householder reflector ( // input: const SUITESPARSE_BLAS_INT *n, @@ -2049,31 +1301,7 @@ void SUITESPARSE_LAPACK_DLARFG } \ } -void SUITESPARSE_LAPACK_SLARFG -( - // input: - const SUITESPARSE_BLAS_INT *n, - // input/output: - float *alpha, - float *X, - // input: - const SUITESPARSE_BLAS_INT *incx, - // output: - float *tau -) ; - -#define SUITESPARSE_LAPACK_slarfg(n,alpha,X,incx,tau,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_SLARFG (&N_blas_int, alpha, X, &INCX_blas_int, \ - tau) ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZLARFG +void SUITESPARSE_LAPACK_ZLARFG // generate Householder reflector ( // input: const SUITESPARSE_BLAS_INT *n, @@ -2097,35 +1325,7 @@ void SUITESPARSE_LAPACK_ZLARFG } \ } -void SUITESPARSE_LAPACK_CLARFG -( - // input: - const SUITESPARSE_BLAS_INT *n, - // input/output: - void *alpha, - void *X, - // input: - const SUITESPARSE_BLAS_INT *incx, - // output: - void *tau -) ; - -#define SUITESPARSE_LAPACK_clarfg(n,alpha,X,incx,tau,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_CLARFG (&N_blas_int, alpha, X, &INCX_blas_int, \ - tau) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// larf: apply Householder reflector -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DLARF +void SUITESPARSE_LAPACK_DLARF // apply Householder reflector ( // input: const char *side, @@ -2155,37 +1355,7 @@ void SUITESPARSE_LAPACK_DLARF } \ } -void SUITESPARSE_LAPACK_SLARF -( - // input: - const char *side, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const float *V, - const SUITESPARSE_BLAS_INT *incv, - const float *tau, - // input/output: - float *C, - // input: - const SUITESPARSE_BLAS_INT *ldc, - // workspace: - float *Work -) ; - -#define SUITESPARSE_LAPACK_slarf(side,m,n,V,incv,tau,C,ldc,Work,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCV_blas_int, incv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_SLARF (side, &M_blas_int, &N_blas_int, V, \ - &INCV_blas_int, tau, C, &LDC_blas_int, Work) ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZLARF +void SUITESPARSE_LAPACK_ZLARF // apply Householder reflector ( // input: const char *side, @@ -2215,36 +1385,6 @@ void SUITESPARSE_LAPACK_ZLARF } \ } -void SUITESPARSE_LAPACK_CLARF -( - // input: - const char *side, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const void *V, - const SUITESPARSE_BLAS_INT *incv, - const void *tau, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc, - // workspace: - void *Work -) ; - -#define SUITESPARSE_LAPACK_clarf(side,m,n,V,incv,tau,C,ldc,Work,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCV_blas_int, incv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_CLARF (side, &M_blas_int, &N_blas_int, V, \ - &INCV_blas_int, tau, C, &LDC_blas_int, Work) ; \ - } \ -} - #endif //------------------------------------------------------------------------------ diff --git a/SuiteSparse_config/Config/SuiteSparse_config.pc.in b/SuiteSparse_config/Config/SuiteSparse_config.pc.in deleted file mode 100644 index f082c226..00000000 --- a/SuiteSparse_config/Config/SuiteSparse_config.pc.in +++ /dev/null @@ -1,16 +0,0 @@ -# SuiteSparse_config, Copyright (c) 2012-2023, Timothy A. Davis. -# All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: SuiteSparseConfig -URL: https://github.com/DrTimothyAldenDavis/SuiteSparse -Description: Configuration for SuiteSparse -Version: @SUITESPARSE_VERSION_MAJOR@.@SUITESPARSE_VERSION_MINOR@.@SUITESPARSE_VERSION_SUB@ -Libs: -L${libdir} -l@SUITESPARSE_LIB_BASE_NAME@ -Libs.private: @SUITESPARSE_CONFIG_STATIC_LIBS@ -Cflags: -I${includedir} diff --git a/SuiteSparse_config/Config/SuiteSparse_configConfig.cmake.in b/SuiteSparse_config/Config/SuiteSparse_configConfig.cmake.in deleted file mode 100644 index 1831e466..00000000 --- a/SuiteSparse_config/Config/SuiteSparse_configConfig.cmake.in +++ /dev/null @@ -1,171 +0,0 @@ -#------------------------------------------------------------------------------- -# SuiteSparse/SuiteSparse_config/cmake_modules/SuiteSparse_configConfig.cmake -#------------------------------------------------------------------------------- - -# The following copyright and license applies to just this file only, not to -# the library itself: -# SuiteSparse_configConfig.cmake, Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. -# SPDX-License-Identifier: BSD-3-clause - -#------------------------------------------------------------------------------- - -# Finds the SuiteSparse_config include file and compiled library. -# The following targets are defined: -# SuiteSparseConfig - for the shared library (if available) -# SuiteSparseConfig_static - for the static library (if available) - -# For backward compatibility the following variables are set: - -# SUITESPARSE_CONFIG_INCLUDE_DIR - where to find SuiteSparse_config.h -# SUITESPARSE_CONFIG_LIBRARY - dynamic SuiteSparse_config library -# SUITESPARSE_CONFIG_STATIC - static SuiteSparse_config library -# SUITESPARSE_CONFIG_LIBRARIES - libraries when using SuiteSparse_config -# SUITESPARSE_CONFIG_FOUND - true if SuiteSparse_config found - -# Set ``CMAKE_MODULE_PATH`` to the parent folder where this module file is -# installed. - -#------------------------------------------------------------------------------- - -@PACKAGE_INIT@ - -set ( SUITESPARSE_DATE "@SUITESPARSE_DATE@" ) -set ( SUITESPARSE_CONFIG_VERSION_MAJOR @SUITESPARSE_VERSION_MAJOR@ ) -set ( SUITESPARSE_CONFIG_VERSION_MINOR @SUITESPARSE_VERSION_MINOR@ ) -set ( SUITESPARSE_CONFIG_VERSION_PATCH @SUITESPARSE_VERSION_SUB@ ) -set ( SUITESPARSE_CONFIG_VERSION "@SUITESPARSE_VERSION_MAJOR@.@SUITESPARSE_VERSION_MINOR@.@SUITESPARSE_VERSION_SUB@" ) - -# Check for dependent targets -include ( CMakeFindDependencyMacro ) -set ( _dependencies_found ON ) - -# Look for OpenMP -if ( @SUITESPARSE_CONFIG_HAS_OPENMP@ AND NOT OpenMP_C_FOUND ) - find_dependency ( OpenMP COMPONENTS C ) - if ( NOT OpenMP_C_FOUND ) - set ( _dependencies_found OFF ) - endif ( ) -endif ( ) - -if ( NOT _dependencies_found ) - set ( SuiteSparse_config_FOUND OFF ) - return ( ) -endif ( ) - - -# Import target -include ( ${CMAKE_CURRENT_LIST_DIR}/SuiteSparse_configTargets.cmake ) - -if ( @SUITESPARSE_CONFIG_HAS_OPENMP@ ) - if ( TARGET SuiteSparse::SuiteSparseConfig ) - get_property ( _suitesparse_config_aliased TARGET SuiteSparse::SuiteSparseConfig - PROPERTY ALIASED_TARGET ) - if ( "${_suitesparse_config_aliased}" STREQUAL "" ) - target_include_directories ( SuiteSparse::SuiteSparseConfig SYSTEM AFTER INTERFACE - "$" ) - else ( ) - target_include_directories ( ${_suitesparse_config_aliased} SYSTEM AFTER INTERFACE - "$" ) - endif ( ) - endif ( ) - if ( TARGET SuiteSparse::SuiteSparseConfig_static ) - get_property ( _suitesparse_config_aliased TARGET SuiteSparse::SuiteSparseConfig_static - PROPERTY ALIASED_TARGET ) - if ( "${_suitesparse_config_aliased}" STREQUAL "" ) - target_include_directories ( SuiteSparse::SuiteSparseConfig_static SYSTEM AFTER INTERFACE - "$" ) - else ( ) - target_include_directories ( ${_suitesparse_config_aliased} SYSTEM AFTER INTERFACE - "$" ) - endif ( ) - endif ( ) -endif ( ) - - -# The following is only for backward compatibility with FindSuiteSparse_config. - -set ( _target_shared SuiteSparse::SuiteSparseConfig ) -set ( _target_static SuiteSparse::SuiteSparseConfig_static ) -set ( _var_prefix "SUITESPARSE_CONFIG" ) - -if ( NOT @BUILD_SHARED_LIBS@ AND NOT TARGET ${_target_shared} ) - # make sure there is always an import target without suffix ) - add_library ( ${_target_shared} ALIAS ${_target_static} ) -endif ( ) - -get_target_property ( ${_var_prefix}_INCLUDE_DIR ${_target_shared} INTERFACE_INCLUDE_DIRECTORIES ) -if ( ${_var_prefix}_INCLUDE_DIR ) - # First item in SuiteSparse targets contains the "main" header directory. - list ( GET ${_var_prefix}_INCLUDE_DIR 0 ${_var_prefix}_INCLUDE_DIR ) -endif ( ) -get_target_property ( ${_var_prefix}_LIBRARY ${_target_shared} IMPORTED_IMPLIB ) -if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} IMPORTED_LOCATION ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) -endif ( ) -if ( TARGET ${_target_static} ) - get_target_property ( ${_var_prefix}_STATIC ${_target_static} IMPORTED_LOCATION ) -endif ( ) - -# Check for most common build types -set ( _config_types "Debug" "Release" "RelWithDebInfo" "MinSizeRel" "None" ) - -get_property ( _isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG ) -if ( _isMultiConfig ) - # For multi-configuration generators (e.g., Visual Studio), prefer those - # configurations. - list ( PREPEND _config_types ${CMAKE_CONFIGURATION_TYPES} ) -else ( ) - # For single-configuration generators, prefer the current configuration. - list ( PREPEND _config_types ${CMAKE_BUILD_TYPE} ) -endif ( ) - -list ( REMOVE_DUPLICATES _config_types ) - -foreach ( _config ${_config_types} ) - string ( TOUPPER ${_config} _uc_config ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_IMPLIB_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( NOT ${_var_prefix}_LIBRARY ) - get_target_property ( _library_chk ${_target_shared} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_LIBRARY ${_library_chk} ) - endif ( ) - endif ( ) - if ( TARGET ${_target_static} AND NOT ${_var_prefix}_STATIC ) - get_target_property ( _library_chk ${_target_static} - IMPORTED_LOCATION_${_uc_config} ) - if ( EXISTS ${_library_chk} ) - set ( ${_var_prefix}_STATIC ${_library_chk} ) - endif ( ) - endif ( ) -endforeach ( ) - -set ( SUITESPARSE_CONFIG_LIBRARIES ${SUITESPARSE_CONFIG_LIBRARY} ) - -macro ( suitesparse_check_exist _var _files ) - # ignore generator expressions - string ( GENEX_STRIP "${_files}" _files2 ) - - foreach ( _file ${_files2} ) - if ( NOT EXISTS "${_file}" ) - message ( FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist!" ) - endif ( ) - endforeach () -endmacro ( ) - -suitesparse_check_exist ( SUITESPARSE_CONFIG_INCLUDE_DIR ${SUITESPARSE_CONFIG_INCLUDE_DIR} ) -suitesparse_check_exist ( SUITESPARSE_CONFIG_LIBRARY ${SUITESPARSE_CONFIG_LIBRARY} ) - -message ( STATUS "SuiteSparse_config version: ${SUITESPARSE_CONFIG_VERSION}" ) -message ( STATUS "SuiteSparse_config include: ${SUITESPARSE_CONFIG_INCLUDE_DIR}" ) -message ( STATUS "SuiteSparse_config library: ${SUITESPARSE_CONFIG_LIBRARY}" ) -message ( STATUS "SuiteSparse_config static: ${SUITESPARSE_CONFIG_STATIC}" ) diff --git a/SuiteSparse_config/Makefile b/SuiteSparse_config/Makefile index a14ac2fd..9893afe7 100644 --- a/SuiteSparse_config/Makefile +++ b/SuiteSparse_config/Makefile @@ -37,18 +37,18 @@ default: library # default is to install only in /usr/local library: - ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) .. && cmake --build . -j${JOBS} ) # install only in SuiteSparse/lib and SuiteSparse/include local: - ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=1 .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=1 .. && cmake --build . -j${JOBS} ) # install only in /usr/local (default) global: - ( cd build && cmake $(CMAKE_OPTIONS) -USUITESPARSE_PKGFILEDIR -DSUITESPARSE_LOCAL_INSTALL=0 .. && cmake --build . --config Release -j${JOBS} ) + ( cd build && cmake $(CMAKE_OPTIONS) -DLOCAL_INSTALL=0 .. && cmake --build . -j${JOBS} ) debug: - ( cd build && cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. ; cmake --build . --config Debug ) + ( cd build ; cmake $(CMAKE_OPTIONS) -DCMAKE_BUILD_TYPE=Debug .. ; cmake --build . ) all: library @@ -56,14 +56,14 @@ demos: library # just compile after running cmake; do not run cmake again remake: - ( cd build && cmake --build . ) + ( cd build ; cmake --build . ) # just run cmake to set things up setup: - ( cd build && cmake $(CMAKE_OPTIONS) .. ) + ( cd build ; cmake $(CMAKE_OPTIONS) .. ) install: - ( cd build && cmake --install . ) + ( cd build ; cmake --install . ) # remove any installed libraries and #include files uninstall: diff --git a/SuiteSparse_config/README.txt b/SuiteSparse_config/README.txt index 9d306c9e..4ff01953 100644 --- a/SuiteSparse_config/README.txt +++ b/SuiteSparse_config/README.txt @@ -1,4 +1,4 @@ -SuiteSparse_config, Copyright (c) 2012-2024, Timothy A. Davis. +SuiteSparse_config, Copyright (c) 2012-2023, Timothy A. Davis. All Rights Reserved. SPDX-License-Identifier: BSD-3-clause diff --git a/SuiteSparse_config/SuiteSparse_config.c b/SuiteSparse_config/SuiteSparse_config.c index ee220a77..07909371 100644 --- a/SuiteSparse_config/SuiteSparse_config.c +++ b/SuiteSparse_config/SuiteSparse_config.c @@ -11,6 +11,7 @@ /* SuiteSparse configuration : memory manager and printf functions. */ +#define SUITESPARSE_LIBRARY #include "SuiteSparse_config.h" /* -------------------------------------------------------------------------- */ @@ -495,7 +496,7 @@ void *SuiteSparse_free /* always returns NULL */ tic [1] = 0 ; } -#else +#else /* ---------------------------------------------------------------------- */ /* POSIX timer */ @@ -616,7 +617,7 @@ double SuiteSparse_hypot (double x, double y) r = x / y ; s = y * sqrt (1.0 + r*r) ; } - } + } return (s) ; } @@ -759,10 +760,6 @@ const char *SuiteSparse_BLAS_library ( void ) return ((sizeof (SUITESPARSE_BLAS_INT) == 8) ? "OpenBLAS (64-bit integers)" : "OpenBLAS (32-bit integers)") ; - #elif defined ( BLAS_FLAME ) - return ((sizeof (SUITESPARSE_BLAS_INT) == 8) ? - "FLAME (64-bit integers)" : - "FLAME (32-bit integers)") ; #elif defined ( BLAS_Generic ) return ((sizeof (SUITESPARSE_BLAS_INT) == 8) ? "Reference BLAS (64-bit integers)" : diff --git a/SuiteSparse_config/SuiteSparse_config.h b/SuiteSparse_config/SuiteSparse_config.h index 258e7601..7b0196f2 100644 --- a/SuiteSparse_config/SuiteSparse_config.h +++ b/SuiteSparse_config/SuiteSparse_config.h @@ -368,24 +368,13 @@ int SuiteSparse_divcomplex // determine which timer to use, if any #ifndef NTIMER - // SuiteSparse_config itself can be compiled without OpenMP, - // but other packages can themselves use OpenMP. In this case, - // those packages should use omp_get_wtime() directly. This can - // be done via the SUITESPARSE_TIME macro, defined below: - #define SUITESPARSE_HAVE_CLOCK_GETTIME #if defined ( _OPENMP ) #define SUITESPARSE_TIMER_ENABLED - #define SUITESPARSE_TIME (omp_get_wtime ( )) - #elif defined ( SUITESPARSE_HAVE_CLOCK_GETTIME ) + #elif defined ( _POSIX_C_SOURCE ) + #if _POSIX_C_SOURCE >= 199309L #define SUITESPARSE_TIMER_ENABLED - #define SUITESPARSE_TIME (SuiteSparse_time ( )) - #else - // No timer is available - #define SUITESPARSE_TIME (0) + #endif #endif -#else - // The timer is explictly disabled - #define SUITESPARSE_TIME (0) #endif // SuiteSparse printf macro @@ -420,19 +409,14 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_HAS_VERSION_FUNCTION -#define SUITESPARSE_DATE "Mar 22, 2024" +#define SUITESPARSE_DATE "Mar FIXME, 2023" #define SUITESPARSE_MAIN_VERSION 7 -#define SUITESPARSE_SUB_VERSION 7 +#define SUITESPARSE_SUB_VERSION 1 #define SUITESPARSE_SUBSUB_VERSION 0 -// version format x.y #define SUITESPARSE_VER_CODE(main,sub) ((main) * 1000 + (sub)) -#define SUITESPARSE_VERSION SUITESPARSE_VER_CODE(7, 7) - -// version format x.y.z -#define SUITESPARSE__VERCODE(main,sub,patch) \ - (((main)*1000ULL + (sub))*1000ULL + (patch)) -#define SUITESPARSE__VERSION SUITESPARSE__VERCODE(7,7,0) +#define SUITESPARSE_VERSION \ + SUITESPARSE_VER_CODE(SUITESPARSE_MAIN_VERSION,SUITESPARSE_SUB_VERSION) //============================================================================== // SuiteSparse interface to the BLAS and LAPACK libraries @@ -485,7 +469,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #elif defined ( BLAS_UNDERSCORE ) - // append an underscore, use lower case + // append an undescore, use lower case #define SUITESPARSE_FORTRAN(name,NAME) name ## _ #define SUITESPARSE__FORTRAN(name,NAME) name ## _ @@ -545,12 +529,12 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // If the suffix does not contain "_", use (Sun Perf., for example): -// cd build && cmake -DBLAS64_SUFFIX="64" .. +// cd build ; cmake -DBLAS64_SUFFIX="64" .. // If the suffix contains "_" (OpenBLAS in spack for example), use the // following: -// cd build && cmake -DBLAS64_SUFFIX="_64" .. +// cd build ; cmake -DBLAS64_SUFFIX="_64" .. // This setting could be used by the spack packaging of SuiteSparse when linked // with the spack-installed OpenBLAS with 64-bit integers. See @@ -588,7 +572,6 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION // C names of Fortan BLAS and LAPACK functions used by SuiteSparse //------------------------------------------------------------------------------ -// double #define SUITESPARSE_BLAS_DTRSV SUITESPARSE_BLAS ( dtrsv , DTRSV ) #define SUITESPARSE_BLAS_DGEMV SUITESPARSE_BLAS ( dgemv , DGEMV ) #define SUITESPARSE_BLAS_DTRSM SUITESPARSE_BLAS ( dtrsm , DTRSM ) @@ -596,15 +579,8 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_BLAS_DSYRK SUITESPARSE_BLAS ( dsyrk , DSYRK ) #define SUITESPARSE_BLAS_DGER SUITESPARSE_BLAS ( dger , DGER ) #define SUITESPARSE_BLAS_DSCAL SUITESPARSE_BLAS ( dscal , DSCAL ) -#define SUITESPARSE_BLAS_DNRM2 SUITESPARSE_BLAS ( dnrm2 , DNRM2 ) - #define SUITESPARSE_LAPACK_DPOTRF SUITESPARSE_BLAS ( dpotrf , DPOTRF ) -#define SUITESPARSE_LAPACK_DLARF SUITESPARSE_BLAS ( dlarf , DLARF ) -#define SUITESPARSE_LAPACK_DLARFG SUITESPARSE_BLAS ( dlarfg , DLARFG ) -#define SUITESPARSE_LAPACK_DLARFT SUITESPARSE_BLAS ( dlarft , DLARFT ) -#define SUITESPARSE_LAPACK_DLARFB SUITESPARSE_BLAS ( dlarfb , DLARFB ) -// double complex #define SUITESPARSE_BLAS_ZTRSV SUITESPARSE_BLAS ( ztrsv , ZTRSV ) #define SUITESPARSE_BLAS_ZGEMV SUITESPARSE_BLAS ( zgemv , ZGEMV ) #define SUITESPARSE_BLAS_ZTRSM SUITESPARSE_BLAS ( ztrsm , ZTRSM ) @@ -612,46 +588,20 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_BLAS_ZHERK SUITESPARSE_BLAS ( zherk , ZHERK ) #define SUITESPARSE_BLAS_ZGERU SUITESPARSE_BLAS ( zgeru , ZGERU ) #define SUITESPARSE_BLAS_ZSCAL SUITESPARSE_BLAS ( zscal , ZSCAL ) -#define SUITESPARSE_BLAS_DZNRM2 SUITESPARSE_BLAS ( dznrm2 , DZNRM2 ) - #define SUITESPARSE_LAPACK_ZPOTRF SUITESPARSE_BLAS ( zpotrf , ZPOTRF ) + +#define SUITESPARSE_BLAS_DNRM2 SUITESPARSE_BLAS ( dnrm2 , DNRM2 ) +#define SUITESPARSE_LAPACK_DLARF SUITESPARSE_BLAS ( dlarf , DLARF ) +#define SUITESPARSE_LAPACK_DLARFG SUITESPARSE_BLAS ( dlarfg , DLARFG ) +#define SUITESPARSE_LAPACK_DLARFT SUITESPARSE_BLAS ( dlarft , DLARFT ) +#define SUITESPARSE_LAPACK_DLARFB SUITESPARSE_BLAS ( dlarfb , DLARFB ) + +#define SUITESPARSE_BLAS_DZNRM2 SUITESPARSE_BLAS ( dznrm2 , DZNRM2 ) #define SUITESPARSE_LAPACK_ZLARF SUITESPARSE_BLAS ( zlarf , ZLARF ) #define SUITESPARSE_LAPACK_ZLARFG SUITESPARSE_BLAS ( zlarfg , ZLARFG ) #define SUITESPARSE_LAPACK_ZLARFT SUITESPARSE_BLAS ( zlarft , ZLARFT ) #define SUITESPARSE_LAPACK_ZLARFB SUITESPARSE_BLAS ( zlarfb , ZLARFB ) -// single -#define SUITESPARSE_BLAS_STRSV SUITESPARSE_BLAS ( strsv , STRSV ) -#define SUITESPARSE_BLAS_SGEMV SUITESPARSE_BLAS ( sgemv , SGEMV ) -#define SUITESPARSE_BLAS_STRSM SUITESPARSE_BLAS ( strsm , STRSM ) -#define SUITESPARSE_BLAS_SGEMM SUITESPARSE_BLAS ( sgemm , SGEMM ) -#define SUITESPARSE_BLAS_SSYRK SUITESPARSE_BLAS ( ssyrk , SSYRK ) -#define SUITESPARSE_BLAS_SGER SUITESPARSE_BLAS ( sger , SGER ) -#define SUITESPARSE_BLAS_SSCAL SUITESPARSE_BLAS ( sscal , SSCAL ) -#define SUITESPARSE_BLAS_SNRM2 SUITESPARSE_BLAS ( snrm2 , SNRM2 ) - -#define SUITESPARSE_LAPACK_SPOTRF SUITESPARSE_BLAS ( spotrf , SPOTRF ) -#define SUITESPARSE_LAPACK_SLARF SUITESPARSE_BLAS ( slarf , SLARF ) -#define SUITESPARSE_LAPACK_SLARFG SUITESPARSE_BLAS ( slarfg , SLARFG ) -#define SUITESPARSE_LAPACK_SLARFT SUITESPARSE_BLAS ( slarft , SLARFT ) -#define SUITESPARSE_LAPACK_SLARFB SUITESPARSE_BLAS ( slarfb , SLARFB ) - -// single complex -#define SUITESPARSE_BLAS_CTRSV SUITESPARSE_BLAS ( ctrsv , CTRSV ) -#define SUITESPARSE_BLAS_CGEMV SUITESPARSE_BLAS ( cgemv , CGEMV ) -#define SUITESPARSE_BLAS_CTRSM SUITESPARSE_BLAS ( ctrsm , CTRSM ) -#define SUITESPARSE_BLAS_CGEMM SUITESPARSE_BLAS ( cgemm , CGEMM ) -#define SUITESPARSE_BLAS_CHERK SUITESPARSE_BLAS ( cherk , CHERK ) -#define SUITESPARSE_BLAS_CGERU SUITESPARSE_BLAS ( cgeru , CGERU ) -#define SUITESPARSE_BLAS_CSCAL SUITESPARSE_BLAS ( cscal , CSCAL ) -#define SUITESPARSE_BLAS_SCNRM2 SUITESPARSE_BLAS ( scnrm2 , SCNRM2 ) - -#define SUITESPARSE_LAPACK_CPOTRF SUITESPARSE_BLAS ( cpotrf , CPOTRF ) -#define SUITESPARSE_LAPACK_CLARF SUITESPARSE_BLAS ( clarf , CLARF ) -#define SUITESPARSE_LAPACK_CLARFG SUITESPARSE_BLAS ( clarfg , CLARFG ) -#define SUITESPARSE_LAPACK_CLARFT SUITESPARSE_BLAS ( clarft , CLARFT ) -#define SUITESPARSE_LAPACK_CLARFB SUITESPARSE_BLAS ( clarfb , CLARFB ) - //------------------------------------------------------------------------------ // prototypes of BLAS and SUITESPARSE_LAPACK functions //------------------------------------------------------------------------------ @@ -677,11 +627,7 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #if defined ( SUITESPARSE_BLAS_DEFINITIONS ) -//------------------------------------------------------------------------------ -// gemv: Y = alpha*A*x + beta*Y -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DGEMV +void SUITESPARSE_BLAS_DGEMV // Y = alpha*A*x + beta*Y ( // input: const char *trans, @@ -713,39 +659,7 @@ void SUITESPARSE_BLAS_DGEMV } \ } -void SUITESPARSE_BLAS_SGEMV -( - // input: - const char *trans, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const float *alpha, - const float *A, - const SUITESPARSE_BLAS_INT *lda, - const float *X, - const SUITESPARSE_BLAS_INT *incx, - const float *beta, - // input/output: - float *Y, - // input: - const SUITESPARSE_BLAS_INT *incy -) ; - -#define SUITESPARSE_BLAS_sgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_SGEMV (trans, &M_blas_int, &N_blas_int, alpha, A, \ - &LDA_blas_int, X, &INCX_blas_int, beta, Y, &INCY_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZGEMV +void SUITESPARSE_BLAS_ZGEMV // Y = alpha*A*X + beta*Y ( // input: const char *trans, @@ -777,43 +691,7 @@ void SUITESPARSE_BLAS_ZGEMV } \ } -void SUITESPARSE_BLAS_CGEMV -( - // input: - const char *trans, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - const void *X, - const SUITESPARSE_BLAS_INT *incx, - const void *beta, - // input/output: - void *Y, - // input: - const SUITESPARSE_BLAS_INT *incy -) ; - -#define SUITESPARSE_BLAS_cgemv(trans,m,n,alpha,A,lda,X,incx,beta,Y,incy,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CGEMV (trans, &M_blas_int, &N_blas_int, alpha, A, \ - &LDA_blas_int, X, &INCX_blas_int, beta, Y, &INCY_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// trsv: solve Lx=b, Ux=b, L'x=b, or U'x=b -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DTRSV +void SUITESPARSE_BLAS_DTRSV // solve Lx=b, Ux=b, L'x=b, or U'x=b ( // input: const char *uplo, @@ -840,34 +718,7 @@ void SUITESPARSE_BLAS_DTRSV } \ } -void SUITESPARSE_BLAS_STRSV -( - // input: - const char *uplo, - const char *trans, - const char *diag, - const SUITESPARSE_BLAS_INT *n, - const float *A, - const SUITESPARSE_BLAS_INT *lda, - // input/output: - float *X, - // input: - const SUITESPARSE_BLAS_INT *incx -) ; - -#define SUITESPARSE_BLAS_strsv(uplo,trans,diag,n,A,lda,X,incx,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_STRSV (uplo, trans, diag, &N_blas_int, A, \ - &LDA_blas_int, X, &INCX_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZTRSV +void SUITESPARSE_BLAS_ZTRSV // solve (L, L', L^H, U, U', or U^H)x=b ( // input: const char *uplo, @@ -894,38 +745,7 @@ void SUITESPARSE_BLAS_ZTRSV } \ } -void SUITESPARSE_BLAS_CTRSV -( - // input: - const char *uplo, - const char *trans, - const char *diag, - const SUITESPARSE_BLAS_INT *n, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - // input/output: - void *X, - // input: - const SUITESPARSE_BLAS_INT *incx -) ; - -#define SUITESPARSE_BLAS_ctrsv(uplo,trans,diag,n,A,lda,X,incx,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CTRSV (uplo, trans, diag, &N_blas_int, A, \ - &LDA_blas_int, X, &INCX_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// trsm: solve LX=B, UX=B, L'X=B, or U'X=B -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DTRSM +void SUITESPARSE_BLAS_DTRSM // solve LX=B, UX=B, L'X=B, or U'X=B ( // input: const char *side, @@ -956,38 +776,7 @@ void SUITESPARSE_BLAS_DTRSM } \ } -void SUITESPARSE_BLAS_STRSM -( - // input: - const char *side, - const char *uplo, - const char *transa, - const char *diag, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const float *alpha, - const float *A, - const SUITESPARSE_BLAS_INT *lda, - // input/output: - float *B, - // input: - const SUITESPARSE_BLAS_INT *ldb -) ; - -#define SUITESPARSE_BLAS_strsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb,ok)\ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_STRSM (side, uplo, transa, diag, &M_blas_int, \ - &N_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZTRSM +void SUITESPARSE_BLAS_ZTRSM // solve (L, L', L^H, U, U', or U^H)X=B ( // input: const char *side, @@ -1018,42 +807,7 @@ void SUITESPARSE_BLAS_ZTRSM } \ } -void SUITESPARSE_BLAS_CTRSM -( - // input: - const char *side, - const char *uplo, - const char *transa, - const char *diag, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - // input/output: - void *B, - // input: - const SUITESPARSE_BLAS_INT *ldb -) ; - -#define SUITESPARSE_BLAS_ctrsm(side,uplo,transa,diag,m,n,alpha,A,lda,B,ldb,ok)\ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CTRSM (side, uplo, transa, diag, &M_blas_int, \ - &N_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// gemm: C = alpha*A*B + beta*C -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DGEMM +void SUITESPARSE_BLAS_DGEMM // C = alpha*A*B + beta*C ( // input: const char *transa, @@ -1090,44 +844,7 @@ void SUITESPARSE_BLAS_DGEMM } \ } -void SUITESPARSE_BLAS_SGEMM -( - // input: - const char *transa, - const char *transb, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const float *alpha, - const float *A, - const SUITESPARSE_BLAS_INT *lda, - const float *B, - const SUITESPARSE_BLAS_INT *ldb, - const float *beta, - // input/output: - float *C, - // input: - const SUITESPARSE_BLAS_INT *ldc -) ; - -#define SUITESPARSE_BLAS_sgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ - C,ldc,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_SGEMM (transa, transb, &M_blas_int, &N_blas_int, \ - &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ - &LDC_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZGEMM +void SUITESPARSE_BLAS_ZGEMM // C = alpha*A*B + beta*C ( // input: const char *transa, @@ -1164,48 +881,7 @@ void SUITESPARSE_BLAS_ZGEMM } \ } -void SUITESPARSE_BLAS_CGEMM -( - // input: - const char *transa, - const char *transb, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - const void *B, - const SUITESPARSE_BLAS_INT *ldb, - const void *beta, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc -) ; - -#define SUITESPARSE_BLAS_cgemm(transa,transb,m,n,k,alpha,A,lda,B,ldb,beta, \ - C,ldc,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDB_blas_int, ldb, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CGEMM (transa, transb, &M_blas_int, &N_blas_int, \ - &K_blas_int, alpha, A, &LDA_blas_int, B, &LDB_blas_int, beta, C, \ - &LDC_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// syrk/herk: C = alpha*A*A' + beta*C ; or C = alpha*A'*A + beta*C -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DSYRK +void SUITESPARSE_BLAS_DSYRK // C = alpha*A*A' + beta*C, or A'A ( // input: const char *uplo, @@ -1235,24 +911,24 @@ void SUITESPARSE_BLAS_DSYRK } \ } -void SUITESPARSE_BLAS_SSYRK +void SUITESPARSE_BLAS_ZHERK // C = alpha*A*A^H + beta*C, or A^H*A ( // input: const char *uplo, const char *trans, const SUITESPARSE_BLAS_INT *n, const SUITESPARSE_BLAS_INT *k, - const float *alpha, - const float *A, + const void *alpha, + const void *A, const SUITESPARSE_BLAS_INT *lda, - const float *beta, + const void *beta, // input/output: - float *C, + void *C, // input: const SUITESPARSE_BLAS_INT *ldc ) ; -#define SUITESPARSE_BLAS_ssyrk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ +#define SUITESPARSE_BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ { \ SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ @@ -1260,76 +936,12 @@ void SUITESPARSE_BLAS_SSYRK SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ if (ok) \ { \ - SUITESPARSE_BLAS_SSYRK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ + SUITESPARSE_BLAS_ZHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ } \ } -void SUITESPARSE_BLAS_ZHERK -( - // input: - const char *uplo, - const char *trans, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - const void *beta, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc -) ; - -#define SUITESPARSE_BLAS_zherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_ZHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ - A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_CHERK -( - // input: - const char *uplo, - const char *trans, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *alpha, - const void *A, - const SUITESPARSE_BLAS_INT *lda, - const void *beta, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc -) ; - -#define SUITESPARSE_BLAS_cherk(uplo,trans,n,k,alpha,A,lda,beta,C,ldc,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CHERK (uplo, trans, &N_blas_int, &K_blas_int, alpha, \ - A, &LDA_blas_int, beta, C, &LDC_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// potrf: Cholesky factorization -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DPOTRF +void SUITESPARSE_LAPACK_DPOTRF // Cholesky factorization ( // input: const char *uplo, @@ -1356,34 +968,7 @@ void SUITESPARSE_LAPACK_DPOTRF } \ } -void SUITESPARSE_LAPACK_SPOTRF -( - // input: - const char *uplo, - const SUITESPARSE_BLAS_INT *n, - // input/output: - float *A, - // input: - const SUITESPARSE_BLAS_INT *lda, - // output: - SUITESPARSE_BLAS_INT *info -) ; - -#define SUITESPARSE_LAPACK_spotrf(uplo,n,A,lda,info,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - info = 1 ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ - SUITESPARSE_LAPACK_SPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ - &LAPACK_Info) ; \ - info = (Int) LAPACK_Info ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZPOTRF +void SUITESPARSE_LAPACK_ZPOTRF // Cholesky factorization ( // input: const char *uplo, @@ -1410,38 +995,7 @@ void SUITESPARSE_LAPACK_ZPOTRF } \ } -void SUITESPARSE_LAPACK_CPOTRF -( - // input: - const char *uplo, - const SUITESPARSE_BLAS_INT *n, - // input/output: - void *A, - // input: - const SUITESPARSE_BLAS_INT *lda, - // output: - SUITESPARSE_BLAS_INT *info -) ; - -#define SUITESPARSE_LAPACK_cpotrf(uplo,n,A,lda,info,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - info = 1 ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_INT LAPACK_Info = -999 ; \ - SUITESPARSE_LAPACK_CPOTRF (uplo, &N_blas_int, A, &LDA_blas_int, \ - &LAPACK_Info) ; \ - info = LAPACK_Info ; \ - } \ -} - -//------------------------------------------------------------------------------ -// scal: Y = alpha*Y -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DSCAL +void SUITESPARSE_BLAS_DSCAL // Y = alpha*Y ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1462,28 +1016,7 @@ void SUITESPARSE_BLAS_DSCAL } \ } -void SUITESPARSE_BLAS_SSCAL -( - // input: - const SUITESPARSE_BLAS_INT *n, - const float *alpha, - // input/output: - float *Y, - // input: - const SUITESPARSE_BLAS_INT *incy -) ; - -#define SUITESPARSE_BLAS_sscal(n,alpha,Y,incy,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_SSCAL (&N_blas_int, alpha, Y, &INCY_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZSCAL +void SUITESPARSE_BLAS_ZSCAL // Y = alpha*Y ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1504,32 +1037,7 @@ void SUITESPARSE_BLAS_ZSCAL } \ } -void SUITESPARSE_BLAS_CSCAL -( - // input: - const SUITESPARSE_BLAS_INT *n, - const void *alpha, - // input/output: - void *Y, - // input: - const SUITESPARSE_BLAS_INT *incy -) ; - -#define SUITESPARSE_BLAS_cscal(n,alpha,Y,incy,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CSCAL (&N_blas_int, alpha, Y, &INCY_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// ger/geru: A = alpha*x*y' + A -//------------------------------------------------------------------------------ - -void SUITESPARSE_BLAS_DGER +void SUITESPARSE_BLAS_DGER // A = alpha*x*y' + A ( // input: const SUITESPARSE_BLAS_INT *m, @@ -1559,37 +1067,7 @@ void SUITESPARSE_BLAS_DGER } \ } -void SUITESPARSE_BLAS_SGER -( - // input: - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const float *alpha, - const float *X, - const SUITESPARSE_BLAS_INT *incx, - const float *Y, - const SUITESPARSE_BLAS_INT *incy, - // input/output: - float *A, - // input: - const SUITESPARSE_BLAS_INT *lda -) ; - -#define SUITESPARSE_BLAS_sger(m,n,alpha,X,incx,Y,incy,A,lda,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_SGER (&M_blas_int, &N_blas_int, alpha, X, \ - &INCX_blas_int, Y, &INCY_blas_int, A, &LDA_blas_int) ; \ - } \ -} - -void SUITESPARSE_BLAS_ZGERU +void SUITESPARSE_BLAS_ZGERU // A = alpha*x*y' + A ( // input: const SUITESPARSE_BLAS_INT *m, @@ -1619,41 +1097,7 @@ void SUITESPARSE_BLAS_ZGERU } \ } -void SUITESPARSE_BLAS_CGERU -( - // input: - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const void *alpha, - const void *X, - const SUITESPARSE_BLAS_INT *incx, - const void *Y, - const SUITESPARSE_BLAS_INT *incy, - // input/output: - void *A, - // input: - const SUITESPARSE_BLAS_INT *lda -) ; - -#define SUITESPARSE_BLAS_cgeru(m,n,alpha,X,incx,Y,incy,A,lda,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCY_blas_int, incy, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDA_blas_int, lda, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_BLAS_CGERU (&M_blas_int, &N_blas_int, alpha, X, \ - &INCX_blas_int, Y, &INCY_blas_int, A, &LDA_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// larft: T = block Householder factor -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DLARFT +void SUITESPARSE_LAPACK_DLARFT // T = block Householder factor ( // input: const char *direct, @@ -1682,36 +1126,7 @@ void SUITESPARSE_LAPACK_DLARFT } \ } -void SUITESPARSE_LAPACK_SLARFT -( - // input: - const char *direct, - const char *storev, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const float *V, - const SUITESPARSE_BLAS_INT *ldv, - const float *Tau, - // output: - float *T, - // input: - const SUITESPARSE_BLAS_INT *ldt -) ; - -#define SUITESPARSE_LAPACK_slarft(direct,storev,n,k,V,ldv,Tau,T,ldt,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_SLARFT (direct, storev, &N_blas_int, &K_blas_int, \ - V, &LDV_blas_int, Tau, T, &LDT_blas_int) ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZLARFT +void SUITESPARSE_LAPACK_ZLARFT // T = block Householder factor ( // input: const char *direct, @@ -1740,40 +1155,7 @@ void SUITESPARSE_LAPACK_ZLARFT } \ } -void SUITESPARSE_LAPACK_CLARFT -( - // input: - const char *direct, - const char *storev, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *V, - const SUITESPARSE_BLAS_INT *ldv, - const void *Tau, - // output: - void *T, - // input: - const SUITESPARSE_BLAS_INT *ldt -) ; - -#define SUITESPARSE_LAPACK_clarft(direct,storev,n,k,V,ldv,Tau,T,ldt,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_CLARFT (direct, storev, &N_blas_int, &K_blas_int, \ - V, &LDV_blas_int, Tau, T, &LDT_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// larfb: apply block Householder reflector -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DLARFB +void SUITESPARSE_LAPACK_DLARFB // apply block Householder reflector ( // input: const char *side, @@ -1815,49 +1197,7 @@ void SUITESPARSE_LAPACK_DLARFB } \ } -void SUITESPARSE_LAPACK_SLARFB -( - // input: - const char *side, - const char *trans, - const char *direct, - const char *storev, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const float *V, - const SUITESPARSE_BLAS_INT *ldv, - const float *T, - const SUITESPARSE_BLAS_INT *ldt, - // input/output: - float *C, - // input: - const SUITESPARSE_BLAS_INT *ldc, - // workspace: - float *Work, - // input: - const SUITESPARSE_BLAS_INT *ldwork -) ; - -#define SUITESPARSE_LAPACK_slarfb(side,trans,direct,storev,m,n,k,V,ldv,T,ldt, \ - C,ldc,Work,ldwork,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDWORK_blas_int, ldwork, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_SLARFB (side, trans, direct, storev, &M_blas_int, \ - &N_blas_int, &K_blas_int, V, &LDV_blas_int, T, &LDT_blas_int, C, \ - &LDC_blas_int, Work, &LDWORK_blas_int) ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZLARFB +void SUITESPARSE_LAPACK_ZLARFB // apply block Householder reflector ( // input: const char *side, @@ -1899,53 +1239,7 @@ void SUITESPARSE_LAPACK_ZLARFB } \ } -void SUITESPARSE_LAPACK_CLARFB -( - // input: - const char *side, - const char *trans, - const char *direct, - const char *storev, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const SUITESPARSE_BLAS_INT *k, - const void *V, - const SUITESPARSE_BLAS_INT *ldv, - const void *T, - const SUITESPARSE_BLAS_INT *ldt, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc, - // workspace: - void *Work, - // input: - const SUITESPARSE_BLAS_INT *ldwork -) ; - -#define SUITESPARSE_LAPACK_clarfb(side,trans,direct,storev,m,n,k,V,ldv,T,ldt, \ - C,ldc,Work,ldwork,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (K_blas_int, k, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDV_blas_int, ldv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDT_blas_int, ldt, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDWORK_blas_int, ldwork, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_CLARFB (side, trans, direct, storev, &M_blas_int, \ - &N_blas_int, &K_blas_int, V, &LDV_blas_int, T, &LDT_blas_int, C, \ - &LDC_blas_int, Work, &LDWORK_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// nrm2: vector 2-norm -//------------------------------------------------------------------------------ - -double SUITESPARSE_BLAS_DNRM2 +double SUITESPARSE_BLAS_DNRM2 // vector 2-norm ( // input: const SUITESPARSE_BLAS_INT *n, @@ -1964,26 +1258,7 @@ double SUITESPARSE_BLAS_DNRM2 } \ } -float SUITESPARSE_BLAS_SNRM2 -( - // input: - const SUITESPARSE_BLAS_INT *n, - const float *X, - const SUITESPARSE_BLAS_INT *incx -) ; - -#define SUITESPARSE_BLAS_snrm2(result,n,X,incx,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - result = 0 ; \ - if (ok) \ - { \ - result = SUITESPARSE_BLAS_SNRM2 (&N_blas_int, X, &INCX_blas_int) ; \ - } \ -} - -double SUITESPARSE_BLAS_DZNRM2 +double SUITESPARSE_BLAS_DZNRM2 // vector 2-norm ( // input: const SUITESPARSE_BLAS_INT *n, @@ -2002,30 +1277,7 @@ double SUITESPARSE_BLAS_DZNRM2 } \ } -float SUITESPARSE_BLAS_SCNRM2 -( - // input: - const SUITESPARSE_BLAS_INT *n, - const void *X, - const SUITESPARSE_BLAS_INT *incx -) ; - -#define SUITESPARSE_BLAS_scnrm2(result,n,X,incx,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - result = 0 ; \ - if (ok) \ - { \ - result = SUITESPARSE_BLAS_SCNRM2 (&N_blas_int, X, &INCX_blas_int) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// larfg: generate Householder reflector -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DLARFG +void SUITESPARSE_LAPACK_DLARFG // generate Householder reflector ( // input: const SUITESPARSE_BLAS_INT *n, @@ -2049,31 +1301,7 @@ void SUITESPARSE_LAPACK_DLARFG } \ } -void SUITESPARSE_LAPACK_SLARFG -( - // input: - const SUITESPARSE_BLAS_INT *n, - // input/output: - float *alpha, - float *X, - // input: - const SUITESPARSE_BLAS_INT *incx, - // output: - float *tau -) ; - -#define SUITESPARSE_LAPACK_slarfg(n,alpha,X,incx,tau,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_SLARFG (&N_blas_int, alpha, X, &INCX_blas_int, \ - tau) ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZLARFG +void SUITESPARSE_LAPACK_ZLARFG // generate Householder reflector ( // input: const SUITESPARSE_BLAS_INT *n, @@ -2097,35 +1325,7 @@ void SUITESPARSE_LAPACK_ZLARFG } \ } -void SUITESPARSE_LAPACK_CLARFG -( - // input: - const SUITESPARSE_BLAS_INT *n, - // input/output: - void *alpha, - void *X, - // input: - const SUITESPARSE_BLAS_INT *incx, - // output: - void *tau -) ; - -#define SUITESPARSE_LAPACK_clarfg(n,alpha,X,incx,tau,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCX_blas_int, incx, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_CLARFG (&N_blas_int, alpha, X, &INCX_blas_int, \ - tau) ; \ - } \ -} - -//------------------------------------------------------------------------------ -// larf: apply Householder reflector -//------------------------------------------------------------------------------ - -void SUITESPARSE_LAPACK_DLARF +void SUITESPARSE_LAPACK_DLARF // apply Householder reflector ( // input: const char *side, @@ -2155,37 +1355,7 @@ void SUITESPARSE_LAPACK_DLARF } \ } -void SUITESPARSE_LAPACK_SLARF -( - // input: - const char *side, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const float *V, - const SUITESPARSE_BLAS_INT *incv, - const float *tau, - // input/output: - float *C, - // input: - const SUITESPARSE_BLAS_INT *ldc, - // workspace: - float *Work -) ; - -#define SUITESPARSE_LAPACK_slarf(side,m,n,V,incv,tau,C,ldc,Work,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCV_blas_int, incv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_SLARF (side, &M_blas_int, &N_blas_int, V, \ - &INCV_blas_int, tau, C, &LDC_blas_int, Work) ; \ - } \ -} - -void SUITESPARSE_LAPACK_ZLARF +void SUITESPARSE_LAPACK_ZLARF // apply Householder reflector ( // input: const char *side, @@ -2215,36 +1385,6 @@ void SUITESPARSE_LAPACK_ZLARF } \ } -void SUITESPARSE_LAPACK_CLARF -( - // input: - const char *side, - const SUITESPARSE_BLAS_INT *m, - const SUITESPARSE_BLAS_INT *n, - const void *V, - const SUITESPARSE_BLAS_INT *incv, - const void *tau, - // input/output: - void *C, - // input: - const SUITESPARSE_BLAS_INT *ldc, - // workspace: - void *Work -) ; - -#define SUITESPARSE_LAPACK_clarf(side,m,n,V,incv,tau,C,ldc,Work,ok) \ -{ \ - SUITESPARSE_TO_BLAS_INT (M_blas_int, m, ok) ; \ - SUITESPARSE_TO_BLAS_INT (N_blas_int, n, ok) ; \ - SUITESPARSE_TO_BLAS_INT (INCV_blas_int, incv, ok) ; \ - SUITESPARSE_TO_BLAS_INT (LDC_blas_int, ldc, ok) ; \ - if (ok) \ - { \ - SUITESPARSE_LAPACK_CLARF (side, &M_blas_int, &N_blas_int, V, \ - &INCV_blas_int, tau, C, &LDC_blas_int, Work) ; \ - } \ -} - #endif //------------------------------------------------------------------------------ diff --git a/SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake b/SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake new file mode 100644 index 00000000..b9859150 --- /dev/null +++ b/SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake @@ -0,0 +1,141 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/SuiteSparse_config/cmake_modules/FindSuiteSparse_config.cmake +#------------------------------------------------------------------------------- + +# The following copyright and license applies to just this file only, not to +# the library itself: +# FindSuiteSparse_config.cmake, Copyright (c) 2022-2023, Timothy A. Davis. All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +#------------------------------------------------------------------------------- + +# Finds the SuiteSparse_config include file and compiled library and sets: + +# SUITESPARSE_CONFIG_INCLUDE_DIR - where to find SuiteSparse_config.h +# SUITESPARSE_CONFIG_LIBRARY - dynamic SuiteSparse_config library +# SUITESPARSE_CONFIG_STATIC - static SuiteSparse_config library +# SUITESPARSE_CONFIG_LIBRARIES - libraries when using SuiteSparse_config +# SUITESPARSE_CONFIG_FOUND - true if SuiteSparse_config found + +# set ``SUITESPARSE_CONFIG_ROOT`` or ``SuiteSparse_config_ROOT`` to a +# SuiteSparse_config installation root to tell this module where to look. + +# All the Find*.cmake files in SuiteSparse are installed by 'make install' into +# /usr/local/lib/cmake/SuiteSparse (where '/usr/local' is the +# ${CMAKE_INSTALL_PREFIX}). To access this file, place the following commands +# in your CMakeLists.txt file. See also SuiteSparse/Example/CMakeLists.txt: +# +# set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} +# ${CMAKE_INSTALL_PREFIX}/lib/cmake/SuiteSparse ) + +#------------------------------------------------------------------------------- + +# include files for SuiteSparse_config +find_path ( SUITESPARSE_CONFIG_INCLUDE_DIR + NAMES SuiteSparse_config.h + HINTS ${SUITESPARSE_CONFIG_ROOT} + HINTS ENV SUITESPARSE_CONFIG_ROOT + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SuiteSparse_config + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config + PATH_SUFFIXES include Include +) + +# dynamic SuiteSparse_config (or static if no dynamic library was built) +find_library ( SUITESPARSE_CONFIG_LIBRARY + NAMES suitesparseconfig suitesparseconfig_static + HINTS ${SUITESPARSE_CONFIG_ROOT} + HINTS ENV SUITESPARSE_CONFIG_ROOT + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SuiteSparse_config + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config + PATH_SUFFIXES lib build build/Release build/Debug +) + +if ( MSVC ) + set ( STATIC_NAME suitesparseconfig_static suitesparseconfig ) +else ( ) + set ( STATIC_NAME suitesparseconfig ) + set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) + message ( STATUS "original library suffixes: ${CMAKE_FIND_LIBRARY_SUFFIXES}" ) + set ( CMAKE_FIND_LIBRARY_SUFFIXES + ${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) + message ( STATUS "revised for static search: ${CMAKE_FIND_LIBRARY_SUFFIXES}" ) +endif ( ) + +# static libraries for SuiteSparse_config +find_library ( SUITESPARSE_CONFIG_STATIC + NAMES ${STATIC_NAME} + HINTS ${SUITESPARSE_CONFIG_ROOT} + HINTS ENV SUITESPARSE_CONFIG_ROOT + HINTS ${CMAKE_SOURCE_DIR}/.. + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse/SuiteSparse_config + HINTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config + PATH_SUFFIXES lib build build/Release build/Debug +) + +if ( NOT MSVC ) + # restore the CMAKE_FIND_LIBRARY_SUFFIXES variable + set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) +endif ( ) + +# get version of the library from the dynamic library filename, if present +get_filename_component ( SUITESPARSE_CONFIG_LIBRARY ${SUITESPARSE_CONFIG_LIBRARY} REALPATH ) +get_filename_component ( SUITESPARSE_CONFIG_FILENAME ${SUITESPARSE_CONFIG_LIBRARY} NAME ) +string ( + REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" + SUITESPARSE_CONFIG_VERSION + ${SUITESPARSE_CONFIG_FILENAME} +) + +# set ( SUITESPARSE_CONFIG_VERSION "" ) +if ( EXISTS "${SUITESPARSE_CONFIG_INCLUDE_DIR}" AND NOT SUITESPARSE_CONFIG_VERSION ) + # if the version does not appear in the filename, read the include file + file ( STRINGS ${SUITESPARSE_CONFIG_INCLUDE_DIR}/SuiteSparse_config.h SUITESPARSE_CONFIG_MAJOR_STR + REGEX "define SUITESPARSE_MAIN_VERSION" ) + file ( STRINGS ${SUITESPARSE_CONFIG_INCLUDE_DIR}/SuiteSparse_config.h SUITESPARSE_CONFIG_MINOR_STR + REGEX "define SUITESPARSE_SUB_VERSION" ) + file ( STRINGS ${SUITESPARSE_CONFIG_INCLUDE_DIR}/SuiteSparse_config.h SUITESPARSE_CONFIG_PATCH_STR + REGEX "define SUITESPARSE_SUBSUB_VERSION" ) + message ( STATUS "major: ${SUITESPARSE_CONFIG_MAJOR_STR}" ) + message ( STATUS "minor: ${SUITESPARSE_CONFIG_MINOR_STR}" ) + message ( STATUS "patch: ${SUITESPARSE_CONFIG_PATCH_STR}" ) + string ( REGEX MATCH "[0-9]+" SUITESPARSE_CONFIG_MAJOR ${SUITESPARSE_CONFIG_MAJOR_STR} ) + string ( REGEX MATCH "[0-9]+" SUITESPARSE_CONFIG_MINOR ${SUITESPARSE_CONFIG_MINOR_STR} ) + string ( REGEX MATCH "[0-9]+" SUITESPARSE_CONFIG_PATCH ${SUITESPARSE_CONFIG_PATCH_STR} ) + set (SUITESPARSE_CONFIG_VERSION "${SUITESPARSE_CONFIG_MAJOR}.${SUITESPARSE_CONFIG_MINOR}.${SUITESPARSE_CONFIG_PATCH}") +endif ( ) + +# libaries when using SuiteSparse_config +set (SUITESPARSE_CONFIG_LIBRARIES ${SUITESPARSE_CONFIG_LIBRARY}) + +include ( FindPackageHandleStandardArgs ) + +find_package_handle_standard_args ( SuiteSparse_config + REQUIRED_VARS SUITESPARSE_CONFIG_LIBRARY SUITESPARSE_CONFIG_INCLUDE_DIR + VERSION_VAR SUITESPARSE_CONFIG_VERSION + REASON_FAILURE_MESSAGE result +) + +message (STATUS "result: ${result}") + +mark_as_advanced ( + SUITESPARSE_CONFIG_INCLUDE_DIR + SUITESPARSE_CONFIG_LIBRARY + SUITESPARSE_CONFIG_STATIC + SUITESPARSE_CONFIG_LIBRARIES +) + +if ( SUITESPARSE_CONFIG_FOUND ) + message ( STATUS "SuiteSparse_config version: ${SUITESPARSE_CONFIG_VERSION}" ) + message ( STATUS "SuiteSparse_config include: ${SUITESPARSE_CONFIG_INCLUDE_DIR}" ) + message ( STATUS "SuiteSparse_config library: ${SUITESPARSE_CONFIG_LIBRARY}" ) + message ( STATUS "SuiteSparse_config static: ${SUITESPARSE_CONFIG_STATIC}" ) +else ( ) + message ( STATUS "SuiteSparse_config not found" ) + set ( SUITESPARSE_CONFIG_INCLUDE_DIR "" ) + set ( SUITESPARSE_CONFIG_LIBRARIES "" ) + set ( SUITESPARSE_CONFIG_LIBRARY "" ) + set ( SUITESPARSE_CONFIG_STATIC "" ) +endif ( ) + diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake index adcd4266..9e4b779a 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake @@ -24,24 +24,13 @@ endif ( ) set ( BLA_VENDOR "ANY" CACHE STRING "if ANY (default): searches for any BLAS. Otherwise: search for a specific BLAS" ) -# To allow the use of a BLAS with 64-bit integers, set this to ON -option ( SUITESPARSE_USE_64BIT_BLAS - "OFF (default): use only 32-bit BLAS. ON: look for 32 or 64-bit BLAS" OFF ) +# To allow the use of a BLAS with 64-bit integers, set this to true +option ( ALLOW_64BIT_BLAS + "OFF (default): use only 32-bit BLAS. ON: look for 32 or 64-bit BLAS" off ) # dynamic/static linking with BLAS option ( BLA_STATIC - "OFF (default): dynamic linking of BLAS. ON: static linking of BLAS" OFF ) - -if ( DEFINED BLAS_LIBRARIES OR DEFINED BLAS_INCLUDE_DIRS ) - # User supplied variables for libraries and/or include directories. - # Use them as-is. - if ( SUITESPARSE_USE_64BIT_BLAS ) - include ( SuiteSparseBLAS64 ) - else ( ) - include ( SuiteSparseBLAS32 ) - endif ( ) - return ( ) -endif ( ) + "OFF (default): dynamic linking of BLAS. ON: static linking of BLAS" off ) #------------------------------------------------------------------------------- # look for a specific BLAS library @@ -50,34 +39,32 @@ endif ( ) # To request specific BLAS, use either (for example): # # CMAKE_OPTIONS="-DBLA_VENDOR=Apple" make -# cd build && cmake -DBLA_VENDOR=Apple .. ; make +# cd build ; cmake -DBLA_VENDOR=Apple .. ; make # -# Use SUITESPARSE_USE_64BIT_BLAS to select 64-bit or 32-bit BLAS. If -# BLA_VENDOR is also defined, this setting is strictly enforced. If set to -# ON, then only a 64-bit BLAS is allowed. If this is not found, no 32-bit -# BLAS is considered, and the build will fail. +# Use the ALLOW_64BIT_BLAS to select 64-bit or 32-bit BLAS. This setting is +# strictly enforced. If set to true, then only a 64-bit BLAS is allowed. +# If this is not found, no 32-bit BLAS is considered, and the build will fail. # -# If the BLA_VENDOR string implies a 64-bit BLAS, then -# SUITESPARSE_USE_64BIT_BLAS is set to ON, ignoring the setting of this value -# from the user (Intel10_64ilp* and Arm_64ilp*). +# If the BLA_VENDOR string implies a 64-bit BLAS, then ALLOW_64BIT_BLAS is set +# to true, ignoring the setting from the user (Intel10_64ilp* and Arm_64ilp*). # -# The default for SUITESPARSE_USE_64BIT_BLAS is OFF. +# The default for ALLOW_64BIT_BLAS is false. if ( NOT (BLA_VENDOR STREQUAL "ANY" ) ) # only look for the BLAS from a single vendor if ( ( BLA_VENDOR MATCHES "64ilp" ) OR ( BLA_VENDOR MATCHES "ilp64" ) ) # Intel10_64ilp* or Arm_ilp64* - set ( SUITESPARSE_USE_64BIT_BLAS ON ) # OK; overidden by BLA_VENDOR + set ( ALLOW_64BIT_BLAS true ) endif ( ) - if ( SUITESPARSE_USE_64BIT_BLAS ) + if ( ALLOW_64BIT_BLAS ) # only look for 64-bit BLAS set ( BLA_SIZEOF_INTEGER 8 ) message ( STATUS "Looking for 64-BLAS: " ${BLA_VENDOR} ) else ( ) # only look for 32-bit BLAS - set ( BLA_SIZEOF_INTEGER 4 ) message ( STATUS "Looking for 32-BLAS: " ${BLA_VENDOR} ) + set ( BLA_SIZEOF_INTEGER 4 ) endif ( ) find_package ( BLAS REQUIRED ) if ( BLA_SIZEOF_INTEGER EQUAL 8 ) @@ -89,7 +76,6 @@ if ( NOT (BLA_VENDOR STREQUAL "ANY" ) ) include ( SuiteSparseBLAS32 ) endif ( ) message ( STATUS "Specific BLAS: ${BLA_VENDOR} found: ${BLAS_FOUND}" ) - message ( STATUS "BLAS integer size: ${BLA_SIZEOF_INTEGER}" ) return ( ) endif ( ) @@ -97,19 +83,10 @@ endif ( ) # Look for any 64-bit BLAS, if allowed #------------------------------------------------------------------------------- -# If SUITESPARSE_USE_64BIT_BLAS is ON and SUITESPARSE_USE_STRICT is OFF, then a -# 64-bit BLAS is preferred. If not found, a 32-bit BLAS is sought. -# The setting of SUITESPARSE_USE_64BIT_BLAS not strict by default. - -# If SUITESPARSE_USE_64BIT_BLAS is ON and SUITESPARSE_USE_STRICT is ON, then a -# only a 64-bit BLAS is considered. An error occurs if a 64-bit BLAS is not -# found. +# If ALLOW_64BIT_BLAS is true, then a 64-bit BLAS is preferred. +# If not found, a 32-bit BLAS is sought (below) -# If SUITESPARSE_USE_64BIT_BLAS is OFF, only a 32-bit BLAS is considered. An -# error occurs if a 32-bit BLAS is not found (the SUITESPARSE_USE_STRICT -# setting is ignored). - -if ( SUITESPARSE_USE_64BIT_BLAS ) +if ( ALLOW_64BIT_BLAS ) # Look for Intel MKL BLAS with 64-bit integers message ( STATUS "Looking for Intel 64-bit BLAS" ) @@ -162,11 +139,6 @@ if ( SUITESPARSE_USE_64BIT_BLAS ) return ( ) endif ( ) - # report an error if strict - if ( SUITESPARSE_USE_STRICT ) - message ( FATAL_ERROR "64-bit BLAS required, but not found" ) - endif ( ) - endif ( ) #------------------------------------------------------------------------------- diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS64.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS64.cmake index 72efcd5c..744aaef9 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseBLAS64.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseBLAS64.cmake @@ -25,19 +25,19 @@ set ( SuiteSparse_BLAS_integer "int64_t" ) # If the suffix does not contain "_", use (Sun Perf., for example): -# cd build && cmake -DBLAS64_SUFFIX="64" .. +# cd build ; cmake -DBLAS64_SUFFIX="64" .. # If the suffix contains "_" (OpenBLAS in spack for example), use the # following: -# cd build && cmake -DBLAS64_SUFFIX="_64" .. +# cd build ; cmake -DBLAS64_SUFFIX="_64" .. # This setting could be used by the spack packaging of SuiteSparse when linked # with the spack-installed OpenBLAS with 64-bit integers. See # https://github.com/spack/spack/blob/develop/var/spack/repos/builtin/packages/suite-sparse/package.py if ( DEFINED BLAS64_SUFFIX ) - # append BLAS64_SUFFIX to each BLAS and LAPACK function name + # append BLAS64_SUFFIX to each BLAS and LAPACK name string ( FIND ${BLAS64_SUFFIX} "_" HAS_UNDERSCORE ) message ( STATUS "BLAS64_suffix: ${BLAS64_SUFFIX}" ) if ( HAS_UNDERSCORE EQUAL -1 ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseLAPACK.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseLAPACK.cmake index 82366e0a..27ff73ca 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseLAPACK.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseLAPACK.cmake @@ -20,19 +20,18 @@ cmake_minimum_required ( VERSION 3.22 ) -if ( DEFINED LAPACK_LIBRARIES OR DEFINED LAPACK_INCLUDE_DIRS ) - # User supplied variables for libraries and/or include directories. - # Use them as-is. - return ( ) -endif ( ) - if ( BLA_VENDOR STREQUAL "FLAME" ) + # FLAME has the BLAS but not LAPACK + set ( BLA_VENDOR "Generic" ) + message ( STATUS "Looking for generic LAPACK to use with BLIS/FLAME BLAS" ) + + # look for the generic dynamic LAPACK library (usually liblagraph.so) find_library ( LAPACK_LIBRARY - NAMES flame + NAMES lapack PATH_SUFFIXES lib build ) - # look for the static LAPACK library (usually liblapack.a) + # look for the static LAPACK library (usually liblagraph.a) if ( MSVC ) set ( STATIC_SUFFIX .lib ) else ( ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake b/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake index b6b19540..88f956a3 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake @@ -14,25 +14,22 @@ # To use the "Debug" policy, precede this with # set ( CMAKE_BUILD_TYPE Debug ) # -# SUITESPARSE_USE_CUDA: if OFF, CUDA is disabled. if ON, CUDA is enabled, -# if available. Default: ON. +# ENABLE_CUDA: if set to true, CUDA is enabled for the project. +# Default: true for CHOLMOD and SPQR, false for GraphBLAS +# (for which CUDA is in progress and not ready for +# production use). # -# SUITESPARSE_LOCAL_INSTALL: if true, "cmake --install" will install +# LOCAL_INSTALL: if true, "cmake --install" will install # into SuiteSparse/lib and SuiteSparse/include. # if false, "cmake --install" will install into the # default prefix (or the one configured with -# CMAKE_INSTALL_PREFIX). Requires cmake 3.19. -# This is ignored when using the root CMakeLists.txt. -# Set CMAKE_INSTALL_PREFIX instead. -# Default: OFF +# CMAKE_INSTALL_PREFIX). +# Default: false # -# BUILD_SHARED_LIBS: if true, shared libraries are built. -# Default: ON. -# -# BUILD_STATIC_LIBS: if true, static libraries are built. -# Default: ON, except for GraphBLAS, which +# NSTATIC: if true, static libraries are not built. +# Default: false, except for GraphBLAS, which # takes a long time to compile so the default for -# GraphBLAS is false. +# GraphBLAS is true. # # SUITESPARSE_CUDA_ARCHITECTURES: a string, such as "all" or # "35;50;75;80" that lists the CUDA architectures to use @@ -48,12 +45,12 @@ # Both settings must appear, or neither. # Default: neither are defined. # -# BLA_STATIC: if ON, use static linkage for BLAS and LAPACK. -# Default: not set (that is, the same as OFF) +# BLA_STATIC: if true, use static linkage for BLAS and LAPACK. +# Default: false # -# SUITESPARSE_USE_64BIT_BLAS if true, SuiteSparse will search for both -# 32-bit and 64-bit BLAS. If false, only 32-bit BLAS -# will be searched for. Ignored if BLA_VENDOR and +# ALLOW_64BIT_BLAS if true, SuiteSparse will search for both 32-bit and +# 64-bit BLAS. If false, only 32-bit BLAS will be +# searched for. Ignored if BLA_VENDOR and # BLA_SIZEOF_INTEGER are defined. # # SUITESPARSE_C_TO_FORTRAN: a string that defines how C calls Fortran. @@ -64,64 +61,30 @@ # This setting is only used if no Fortran compiler is # found. # -# SUITESPARSE_USE_FORTRAN: if OFF, no Fortan files are compiled, and the -# Fortran language is not enabled in any cmake scripts. -# The built-in cmake script FortranCInterface is skipped. -# This will require SUITESPARSE_C_TO_FORTRAN to be -# defined explicitly, if the defaults are not appropriate -# for your system. -# Default: ON -# -# SUITESPARSE_PKGFILEDIR: Directory where CMake Config and pkg-config files -# will be installed. By default, CMake Config files will -# be installed in the subfolder `cmake` of the directory -# where the (static) libraries will be installed (e.g., -# `lib`). The `.pc` files for pkg-config will be -# installed in the subfolder `pkgconfig` of the directory -# where the (static) libraries will be installed. -# Default: CMAKE_INSTALL_PREFIX, or SuiteSparse/lib if -# SUITESPARSE_LOCAL_INSTALL is enabled. -# -# SUITESPARSE_INCLUDEDIR_POSTFIX : Postfix for installation target of -# header from SuiteSparse. Default: suitesparse, so the -# default include directory is: -# CMAKE_INSTALL_PREFIX/include/suitesparse -# -# SUITESPARSE_USE_STRICT: SuiteSparse has many user-definable settings of the -# form SUITESPARSE_USE_* or (package)_USE_* for some -# particular package. In general, these settings are not -# strict. For example, if SUITESPARSE_USE_OPENMP is -# ON then OpenMP is preferred, but SuiteSparse can be -# used without OpenMP so no error is generated if OpenMP -# is not found. However, if SUITESPARSE_USE_STRICT is -# ON then all *_USE_* settings are treated strictly -# and an error occurs if any are set to ON but the -# corresponding package or setting is not available. The -# *_USE_SYSTEM_* settings are always treated as strict. -# Default: OFF. - -message ( STATUS "Source: ${CMAKE_SOURCE_DIR} ") -message ( STATUS "Build: ${CMAKE_BINARY_DIR} ") - -if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.18.0" ) - cmake_policy ( SET CMP0104 NEW ) # initialize CUDA architectures -endif ( ) +# NFORTRAN: if true, no Fortan files are compiled, and the Fortran +# language is not enabled in any cmake scripts. The +# built-in cmake script FortranCInterface is skipped. +# This will require SUITESPARSE_C_TO_FORTRAN to be defined +# explicitly, if the defaults are not appropriate for your +# system. +# Default: false -# SuiteSparse packages have many intentional extra semicolons, for code -# readability (such as "/* do nothing */ ;" in SuiteSparse_config.c). Disable -# the clang warning for these statements: -if ( CMAKE_C_COMPILER_ID STREQUAL "Clang" ) - set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wno-extra-semi-stmt" ) -endif ( ) -if ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) - set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-extra-semi-stmt" ) -endif ( ) +cmake_minimum_required ( VERSION 3.19 ) + +message ( STATUS "Source: ${CMAKE_SOURCE_DIR} ") +message ( STATUS "Build: ${CMAKE_BINARY_DIR} ") + +cmake_policy ( SET CMP0042 NEW ) # enable MACOSX_RPATH by default +cmake_policy ( SET CMP0048 NEW ) # VERSION variable policy +cmake_policy ( SET CMP0054 NEW ) # if ( expression ) handling policy +cmake_policy ( SET CMP0104 NEW ) # initialize CUDA architectures if ( WIN32 ) set ( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS true ) add_compile_definitions ( _CRT_SECURE_NO_WARNINGS ) endif ( ) +set ( CMAKE_MACOSX_RPATH TRUE ) enable_language ( C ) include ( GNUInstallDirs ) @@ -129,40 +92,15 @@ include ( GNUInstallDirs ) set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake_modules ) -# Use OpenMP -option ( SUITESPARSE_USE_OPENMP "ON (default): Use OpenMP in libraries by default if available. OFF: Do not use OpenMP by default." ON ) - -# strict usage -option ( SUITESPARSE_USE_STRICT "ON: treat all _USE__ settings as strict if they are ON. OFF (default): consider *_USE_* as preferences, not strict" OFF ) - -# build the demos -option ( SUITESPARSE_DEMOS "ON: Build the demo programs. OFF (default): do not build the demo programs." OFF ) - -# BUILD_SHARED_LIBS and BUILD_STATIC_LIBS options -option ( BUILD_SHARED_LIBS "OFF: do not build shared libraries. ON (default): build shared libraries" ON ) - -if ( BUILD_STATIC_LIBS_DEFAULT_OFF ) - option ( BUILD_STATIC_LIBS "OFF (default): do not build static libraries. ON: build static libraries" OFF ) +# NSTATIC option +if ( NSTATIC_DEFAULT_ON ) + option ( NSTATIC "ON (default): do not build static libraries. OFF: build static libraries" on ) else ( ) - # For backwards compatibility, use NSTATIC if it is set. - if ( NSTATIC ) - option ( BUILD_STATIC_LIBS "OFF: do not build static libraries. ON (default): build static libraries" OFF ) - else ( ) - option ( BUILD_STATIC_LIBS "OFF: do not build static libraries. ON (default): build static libraries" ON ) - endif ( ) -endif ( ) - -if ( NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS ) - message ( FATAL_ERROR "At least one of BUILD_SHARED_LIBS or BUILD_STATIC_LIBS must be set to ON." ) + option ( NSTATIC "ON: do not build static libraries. OFF (default): build static libraries" off ) endif ( ) # installation options -if ( NOT SUITESPARSE_ROOT_CMAKELISTS AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.19.0" ) - # the SUITESPARSE_LOCAL_INSTALL option requires cmake 3.19.0 or later - option ( SUITESPARSE_LOCAL_INSTALL "Install in SuiteSparse/lib" OFF ) -else ( ) - set ( SUITESPARSE_LOCAL_INSTALL OFF ) -endif ( ) +option ( LOCAL_INSTALL "Install in SuiteSparse/lib" off ) if ( SUITESPARSE_SECOND_LEVEL ) # some packages in SuiteSparse are in SuiteSparse/Package/Package @@ -174,127 +112,94 @@ else ( ) ${CMAKE_SOURCE_DIR}/../lib/cmake ) endif ( ) -# allow libraries to "see" each other if they are installed in a non-default LIBRARY_PATH -list ( FIND CMAKE_INSTALL_RPATH "$ORIGIN" _idx ) -if ( _idx LESS 0 ) - # "$ORIGIN" not yet included in CMAKE_INSTALL_RPATH - list ( PREPEND CMAKE_INSTALL_RPATH "$ORIGIN" ) -endif ( ) - -set ( INSIDE_SUITESPARSE OFF ) -if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - # determine if this Package is inside the SuiteSparse folder - if ( SUITESPARSE_LOCAL_INSTALL ) - # if you do not want to install local copies of SuiteSparse - # packages in SuiteSparse/lib and SuiteSparse/, set - # SUITESPARSE_LOCAL_INSTALL to false in your CMake options. - if ( SUITESPARSE_SECOND_LEVEL ) - # the package is normally located at the 2nd level inside SuiteSparse - # (SuiteSparse/GraphBLAS/GraphBLAS/ for example) - if ( EXISTS ${CMAKE_SOURCE_DIR}/../../SuiteSparse_config ) - set ( INSIDE_SUITESPARSE true ) - endif ( ) - else ( ) - # typical case, the package is at the 1st level inside SuiteSparse - # (SuiteSparse/AMD for example) - if ( EXISTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config ) - set ( INSIDE_SUITESPARSE true ) - endif ( ) +# add the ./build folder to the runpath so other SuiteSparse packages can +# find this one without "make install" +set ( CMAKE_BUILD_RPATH ${CMAKE_BUILD_RPATH} ${CMAKE_BINARY_DIR} ) + +# determine if this Package is inside the SuiteSparse folder +set ( INSIDE_SUITESPARSE false ) +if ( LOCAL_INSTALL ) + # if you do not want to install local copies of SuiteSparse + # packages in SuiteSparse/lib and SuiteSparse/, set + # LOCAL_INSTALL to false in your CMake options. + if ( SUITESPARSE_SECOND_LEVEL ) + # the package is normally located at the 2nd level inside SuiteSparse + # (SuiteSparse/GraphBLAS/GraphBLAS/ for example) + if ( EXISTS ${CMAKE_SOURCE_DIR}/../../SuiteSparse_config ) + set ( INSIDE_SUITESPARSE true ) endif ( ) - - if ( NOT INSIDE_SUITESPARSE ) - message ( FATAL_ERROR "Unsupported layout for local installation. Correct the directory layout or unset SUITESPARSE_LOCAL_INSTALL." ) + else ( ) + # typical case, the package is at the 1st level inside SuiteSparse + # (SuiteSparse/AMD for example) + if ( EXISTS ${CMAKE_SOURCE_DIR}/../SuiteSparse_config ) + set ( INSIDE_SUITESPARSE true ) endif ( ) + endif ( ) + if ( NOT INSIDE_SUITESPARSE ) + message ( FATAL_ERROR "Unsupported layout for local installation. Correct the directory layout or unset LOCAL_INSTALL." ) endif ( ) -endif ( ) -set ( SUITESPARSE_INCLUDEDIR_POSTFIX "suitesparse" CACHE STRING - "Postfix for installation target of header from SuiteSparse (default: \"suitesparse\")" ) +endif ( ) -if ( SUITESPARSE_LOCAL_INSTALL ) - if ( INSIDE_SUITESPARSE ) - # ../lib and ../include exist: the package is inside SuiteSparse. - # find ( REAL_PATH ...) requires cmake 3.19. - if ( SUITESPARSE_SECOND_LEVEL ) - file ( REAL_PATH ${CMAKE_SOURCE_DIR}/../.. - SUITESPARSE_LOCAL_PREFIX ) - else ( ) - file ( REAL_PATH ${CMAKE_SOURCE_DIR}/.. - SUITESPARSE_LOCAL_PREFIX ) - endif ( ) +if ( INSIDE_SUITESPARSE ) + # ../lib and ../include exist: the package is inside SuiteSparse. + # find ( REAL_PATH ...) requires cmake 3.19. + if ( SUITESPARSE_SECOND_LEVEL ) + file ( REAL_PATH ${CMAKE_SOURCE_DIR}/../.. SUITESPARSE_LOCAL_PREFIX ) + else ( ) + file ( REAL_PATH ${CMAKE_SOURCE_DIR}/.. SUITESPARSE_LOCAL_PREFIX ) endif ( ) +endif ( ) + +if ( LOCAL_INSTALL ) set ( SUITESPARSE_LIBDIR ${SUITESPARSE_LOCAL_PREFIX}/lib ) - set ( SUITESPARSE_INCLUDEDIR ${SUITESPARSE_LOCAL_PREFIX}/include/${SUITESPARSE_INCLUDEDIR_POSTFIX} ) + set ( SUITESPARSE_INCLUDEDIR ${SUITESPARSE_LOCAL_PREFIX}/include ) set ( SUITESPARSE_BINDIR ${SUITESPARSE_LOCAL_PREFIX}/bin ) else ( ) set ( SUITESPARSE_LIBDIR ${CMAKE_INSTALL_LIBDIR} ) - set ( SUITESPARSE_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}/${SUITESPARSE_INCLUDEDIR_POSTFIX} ) + set ( SUITESPARSE_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR} ) set ( SUITESPARSE_BINDIR ${CMAKE_INSTALL_BINDIR} ) endif ( ) if ( INSIDE_SUITESPARSE ) # append ../lib to the install and build runpaths - list ( APPEND CMAKE_INSTALL_RPATH ${SUITESPARSE_LIBDIR} ) - list ( APPEND CMAKE_BUILD_RPATH ${SUITESPARSE_LIBDIR} ) + set ( CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} ${SUITESPARSE_LIBDIR} ) + set ( CMAKE_BUILD_RPATH ${CMAKE_BUILD_RPATH} ${SUITESPARSE_LIBDIR} ) endif ( ) -set ( SUITESPARSE_PKGFILEDIR ${SUITESPARSE_LIBDIR} CACHE STRING - "Directory where CMake Config and pkg-config files will be installed" ) - -message ( STATUS "Install lib: ${SUITESPARSE_LIBDIR}" ) -message ( STATUS "Install include: ${SUITESPARSE_INCLUDEDIR}" ) -message ( STATUS "Install bin: ${SUITESPARSE_BINDIR}" ) -message ( STATUS "Install pkg-file: ${SUITESPARSE_PKGFILEDIR}" ) -message ( STATUS "Install rpath: ${CMAKE_INSTALL_RPATH}" ) -message ( STATUS "Build rpath: ${CMAKE_BUILD_RPATH}" ) +message ( STATUS "Install lib: ${SUITESPARSE_LIBDIR}" ) +message ( STATUS "Install include: ${SUITESPARSE_INCLUDEDIR}" ) +message ( STATUS "Install bin: ${SUITESPARSE_BINDIR}" ) +message ( STATUS "Install rpath: ${CMAKE_INSTALL_RPATH}" ) +message ( STATUS "Build rpath: ${CMAKE_BUILD_RPATH}" ) if ( NOT CMAKE_BUILD_TYPE ) set ( CMAKE_BUILD_TYPE Release ) endif ( ) -message ( STATUS "Build type: ${CMAKE_BUILD_TYPE} ") +message ( STATUS "Build type: ${CMAKE_BUILD_TYPE} ") set ( CMAKE_INCLUDE_CURRENT_DIR ON ) -#------------------------------------------------------------------------------- -# Workaround for math.h on old macOS -#------------------------------------------------------------------------------- - -if ( APPLE AND CMAKE_SYSTEM_VERSION VERSION_LESS 11 ) - # Older versions of math.h on the Mac define Real and Imag, which - # conflict with the internal use of those symbols in CHOLMOD, KLU, SPQR, - # UMFPACK, and ParU. - # This can be disabled with -D__NOEXTENSIONS__ - message ( STATUS "MacOS: disable extensions in math.h" ) - add_compile_definitions ( "__NOEXTENSIONS__" ) -endif ( ) - #------------------------------------------------------------------------------- # check if Fortran is available and enabled #------------------------------------------------------------------------------- include ( CheckLanguage ) -option ( SUITESPARSE_USE_FORTRAN "ON (default): use Fortran. OFF: do not use Fortran" ON ) -if ( SUITESPARSE_USE_FORTRAN ) +option ( NFORTRAN "ON: do not try to use Fortran. OFF (default): try Fortran" off ) +if ( NFORTRAN ) + message ( STATUS "Fortran: not enabled" ) +else ( ) check_language ( Fortran ) if ( CMAKE_Fortran_COMPILER ) enable_language ( Fortran ) - message ( STATUS "Fortran: ${CMAKE_Fortran_COMPILER}" ) - set ( SUITESPARSE_HAS_FORTRAN ON ) + message ( STATUS "Fortran: ${CMAKE_Fortran_COMPILER}" ) else ( ) # Fortran not available: - set ( SUITESPARSE_HAS_FORTRAN OFF ) - message ( STATUS "Fortran: not available" ) + set ( NFORTRAN true ) + message ( STATUS "Fortran: not available" ) endif ( ) -else ( ) - message ( STATUS "Fortran: not enabled" ) - set ( SUITESPARSE_HAS_FORTRAN OFF ) -endif ( ) - -# check for strict usage -if ( SUITESPARSE_USE_STRICT AND SUITESPARSE_USE_FORTRAN AND NOT SUITESPARSE_HAS_FORTRAN ) - message ( FATAL_ERROR "Fortran required for SuiteSparse but not found" ) endif ( ) # default C-to-Fortran name mangling if Fortran compiler not found @@ -312,54 +217,48 @@ endif ( ) # find CUDA #------------------------------------------------------------------------------- -option ( SUITESPARSE_USE_CUDA "ON (default): enable CUDA acceleration for SuiteSparse, OFF: do not use CUDA" ON ) - -if ( SUITESPARSE_USE_CUDA ) +if ( ENABLE_CUDA ) # try finding CUDA check_language ( CUDA ) - # message ( STATUS "Looking for CUDA" ) + message ( STATUS "Looking for CUDA" ) if ( CMAKE_CUDA_COMPILER ) # with CUDA: - # message ( STATUS "Find CUDA tool kit:" ) + message ( STATUS "Find CUDA tool kit:" ) # FindCUDAToolKit needs to have C or CXX enabled first (see above) - find_package ( CUDAToolkit ) - message ( STATUS "CUDA toolkit : " ${CUDAToolkit_FOUND} ) - message ( STATUS "CUDA toolkit ver: " ${CUDAToolkit_VERSION} ) - message ( STATUS "CUDA toolkit inc: " ${CUDAToolkit_INCLUDE_DIRS} ) - message ( STATUS "CUDA toolkit lib: " ${CUDAToolkit_LIBRARY_DIR} ) + include ( FindCUDAToolkit ) + message ( STATUS "CUDA toolkit found: " ${CUDAToolkit_FOUND} ) + message ( STATUS "CUDA toolkit version: " ${CUDAToolkit_VERSION} ) + message ( STATUS "CUDA toolkit include: " ${CUDAToolkit_INCLUDE_DIRS} ) + message ( STATUS "CUDA toolkit lib dir: " ${CUDAToolkit_LIBRARY_DIR} ) if ( CUDAToolkit_VERSION VERSION_LESS "11.2" ) # CUDA is present but too old - message ( STATUS "CUDA: not enabled (CUDA 11.2 or later required)" ) - set ( SUITESPARSE_HAS_CUDA OFF ) + message ( STATUS "CUDA: not enabled (CUDA 11.2 or later required)" ) + set ( SUITESPARSE_CUDA off ) else ( ) # CUDA 11.2 or later present enable_language ( CUDA ) - set ( SUITESPARSE_HAS_CUDA ON ) + set ( SUITESPARSE_CUDA on ) endif ( ) else ( ) # without CUDA: - message ( STATUS "CUDA: not found" ) - set ( SUITESPARSE_HAS_CUDA OFF ) + message ( STATUS "CUDA: not found" ) + set ( SUITESPARSE_CUDA off ) endif ( ) else ( ) # CUDA is disabled - set ( SUITESPARSE_HAS_CUDA OFF ) + set ( SUITESPARSE_CUDA off ) endif ( ) -if ( SUITESPARSE_HAS_CUDA ) - message ( STATUS "CUDA: enabled" ) +if ( SUITESPARSE_CUDA ) + message ( STATUS "CUDA: enabled" ) + add_compile_definitions ( SUITESPARSE_CUDA ) set ( SUITESPARSE_CUDA_ARCHITECTURES "52;75;80" CACHE STRING "CUDA architectures" ) set ( CMAKE_CUDA_ARCHITECTURES ${SUITESPARSE_CUDA_ARCHITECTURES} ) else ( ) - message ( STATUS "CUDA: not enabled" ) -endif ( ) - -# check for strict usage -if ( SUITESPARSE_USE_STRICT AND SUITESPARSE_USE_CUDA AND NOT SUITESPARSE_HAS_CUDA ) - message ( FATAL_ERROR "CUDA required for SuiteSparse but not found" ) + message ( STATUS "CUDA: not enabled" ) endif ( ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparseReport.cmake b/SuiteSparse_config/cmake_modules/SuiteSparseReport.cmake index 0b47f34c..9271c4a9 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparseReport.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparseReport.cmake @@ -10,15 +10,21 @@ #------------------------------------------------------------------------------- message ( STATUS "------------------------------------------------------------------------" ) -message ( STATUS "SuiteSparse CMAKE report for: ${PROJECT_NAME}" ) +message ( STATUS "SuiteSparse CMAKE report for: ${CMAKE_PROJECT_NAME}" ) message ( STATUS "------------------------------------------------------------------------" ) -if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - message ( STATUS "inside common SuiteSparse root: ${INSIDE_SUITESPARSE}" ) - message ( STATUS "install in SuiteSparse/lib and SuiteSparse/include: ${SUITESPARSE_LOCAL_INSTALL}" ) -endif ( ) +message ( STATUS "inside common SuiteSparse root: ${INSIDE_SUITESPARSE}" ) +message ( STATUS "install in SuiteSparse/lib and SuiteSparse/include: ${LOCAL_INSTALL}" ) message ( STATUS "build type: ${CMAKE_BUILD_TYPE}" ) -message ( STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}" ) -message ( STATUS "BUILD_STATIC_LIBS: ${BUILD_STATIC_LIBS}" ) +if ( NSTATIC ) + message ( STATUS "NSTATIC: true (do not build static library)" ) +else ( ) + message ( STATUS "NSTATIC: false (build static library)" ) +endif ( ) +if ( OPENMP_FOUND ) + message ( STATUS "use OpenMP: yes ") +else ( ) + message ( STATUS "use OpenMP: no ") +endif ( ) message ( STATUS "C compiler: ${CMAKE_C_COMPILER} ") message ( STATUS "C flags: ${CMAKE_C_FLAGS}" ) message ( STATUS "C++ compiler: ${CMAKE_CXX_COMPILER}" ) @@ -30,10 +36,10 @@ else ( ) message ( STATUS "C Flags release: ${CMAKE_C_FLAGS_RELEASE} ") message ( STATUS "C++ Flags release: ${CMAKE_CXX_FLAGS_RELEASE} ") endif ( ) -if ( SUITESPARSE_HAS_FORTRAN ) - message ( STATUS "Fortran compiler: ${CMAKE_Fortran_COMPILER} " ) -else ( ) +if ( NFORTRAN ) message ( STATUS "Fortran compiler: none" ) +else ( ) + message ( STATUS "Fortran compiler: ${CMAKE_Fortran_COMPILER} " ) endif ( ) get_property ( CDEFN DIRECTORY PROPERTY COMPILE_DEFINITIONS ) message ( STATUS "compile definitions: ${CDEFN}") @@ -43,4 +49,7 @@ endif ( ) if ( DEFINED CMAKE_CUDA_ARCHITECTURES ) message ( STATUS "CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}" ) endif ( ) +if ( NPARTITION ) + message ( STATUS "NPARTITION: do not use METIS" ) +endif ( ) message ( STATUS "------------------------------------------------------------------------" ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparse__thread.cmake b/SuiteSparse_config/cmake_modules/SuiteSparse__thread.cmake index 1c52185b..75c5cb61 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparse__thread.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparse__thread.cmake @@ -10,7 +10,7 @@ # determine if the __thread keyword is available, which is an extension by # gcc but supported by many compilers, to indicate thread-local-storage. -include ( CheckCSourceCompiles ) +include ( CheckCSourceRuns ) set ( thread_src " #include @@ -43,11 +43,11 @@ set ( thread_local_src } " ) -check_c_source_compiles ( "${declspec_thread_src}" HAVE_KEYWORD__DECLSPEC_THREAD ) +check_c_source_runs ( "${declspec_thread_src}" HAVE_KEYWORD__DECLSPEC_THREAD ) -check_c_source_compiles ( "${thread_src}" HAVE_KEYWORD__THREAD ) +check_c_source_runs ( "${thread_src}" HAVE_KEYWORD__THREAD ) -check_c_source_compiles ( "${thread_local_src}" HAVE_KEYWORD__THREAD_LOCAL ) +check_c_source_runs ( "${thread_local_src}" HAVE_KEYWORD__THREAD_LOCAL ) if ( HAVE_KEYWORD__DECLSPEC_THREAD ) add_compile_definitions ( HAVE_KEYWORD__DECLSPEC_THREAD ) diff --git a/SuiteSparse_config/cmake_modules/SuiteSparse_ssize_t.cmake b/SuiteSparse_config/cmake_modules/SuiteSparse_ssize_t.cmake new file mode 100644 index 00000000..2b74bae8 --- /dev/null +++ b/SuiteSparse_config/cmake_modules/SuiteSparse_ssize_t.cmake @@ -0,0 +1,32 @@ +#------------------------------------------------------------------------------- +# SuiteSparse/cmake_modules/SuiteSparse_ssize_t.cmake +#------------------------------------------------------------------------------- + +# Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. +# SPDX-License-Identifier: BSD-3-clause + +#------------------------------------------------------------------------------- + +# determine if the compiler defines ssize_t + +include ( CheckCSourceCompiles ) + +set ( ssize_t_source +" #include + int main (void) + { + ssize_t x = 0 ; + return (0) ; + } +" ) + +check_c_source_compiles ( "${ssize_t_source}" TEST_FOR_SSIZE_T ) + +if ( TEST_FOR_SSIZE_T ) + set ( HAVE_SSIZE_T true ) + message ( STATUS "#include and ssize_t: OK" ) +else ( ) + set ( HAVE_SSIZE_T false ) + message ( STATUS "#include and ssize_t: not found" ) +endif ( ) +